ffmpeg学习二:《FFmpeg Basics》读书笔记(上)

来源:互联网 发布:stc拆分盘源码 编辑:程序博客网 时间:2024/06/05 19:18

为了更好的理解ffmpeg工程,官方推荐了一本书:《FFmpeg Basics》。完整的读完这本书,应该对这个工程能有一个基本的理解了。本菜英文不好,姑且从这本书中提炼出一些比较常用的知识,做个笔记吧。

一.波特率,帧率,和文件大小

1.1帧率

1-1-1帧率的基本概念
帧率,英文说就是frames per second(FPS or fps),也就是每秒钟的帧数,完整的说就是每秒钟编码到视频文件中的帧数称之为帧率。帧率超过15HZ,人眼才能感觉到它是视频,小于15就会觉得这是在播放幻灯片…现在Android设备通常要求的是60Hz,也就是一秒钟播放60帧的画面,这样就会觉得视频非常的流畅。
帧率又分为两种模式,交错模式和持续模式。交错模式主要指各行扫描,也就是说一幅图片显示出来,分两次来显示,第一次显示奇数行,第二次显示偶数行。持续模式则是一行一行的从头到尾的显示。
1-1-2设置帧率
1-1-2-1 使用-r选项
为了设置帧率,我们需要在输出文件之前添加-r选项,格式如下:

ffmpeg -i input -r fps output

比如,我们想把一个avi格式的视频文件的帧率,从25Hz改为30Hz,我们可以这么做:

ffmpeg -i input.avi -r 30 output.mp4

1-1-2-2使用视频过滤器
除了-r选项,我们还可以使用视频过滤器来重置帧率,比如,要把一个输入文件的帧率改为25,我们可以使用如下命令:

ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

那么什么是视频过滤器呢?视频文件可以看做是一帧一帧的图片组成的,过滤器就是对使用一套规则,对着一组图片进行处理。把一个视频的帧率改为25,就意味着我们创建了一个规则,也就是1秒钟编码25帧图片到视频文件中去。对于两个视频文件,这必然意味着解码与编码的双重工作,也就是说修改了帧率,其实就是把源视频文件解码再重新编码。

1-2比特率

Bit rate,每秒钟处理的bit的数量。这个参数直接影响着音视频质量,比特率决定了编码的时候,1秒钟存储的bit数。
1-2-1设置比特率
比特率的设置使用-b选项。对于视频比特率和音频比特率,分别对应着-b:v和-b:a的格式来设置对应的比特率。比如,我们要设置一个视频文件的比特率,可以这样:

ffmpeg -i film.avi -b 1.5M film.mp4

这样会把视频流和音频流的比特率都设置为1.5M。
我们也可以分别设置视频流和音频流的比特率:

ffmpeg -i film.avi -b:v 1.5M -b:a 1M film.mp4

1-3文件大小的计算

视频文件的大小计算公式:

video_size = video_bitrate * time_in_seconds / 8

无压缩音频文件大小的计算公式:

audio_size = sampling_rate * bit_depth * channels * time_in_seconds / 8

压缩后音频文件大小的计算公式:

audio_size = bitrate * time_in_seconds / 8

对于一个包含音频和视频的文件,其大小为二者之和。
比如,我们有一段10分钟的视频文件,视频比特率为1500kbits,音频比特率为128kbits,那么整个文件的大小计算如下:

file_size = (video_bitrate + audio_bitrate) * time_in_seconds / 8file_size = (1500 kbit/s + 128 kbits/s) * 600 sfile_size = 1628 kbit/s * 600 sfile_size = 976800 kb = 976800000 b / 8 = 122100000 B / 1024 = 119238.28125 KBfile_size = 119238.28125 KB / 1024 = 116.443634033203125 MB ≈ 116.44 MB1 byte (B) = 8 bits (b)1 kilobyte (kB or KB) = 1024 B1 megabyte (MB) = 1024 KB, etc.

二.视频的缩放

2-1 使用-s选项

重新改变视频的大小,使用-s选项指定视频帧的大小:

ffmpeg -i input_file -s 320x240 output_file

2-2高级缩放

高级缩放使用的是scale视频过滤器。
使用格式如下:

scale=width:height[:interl={1|-1}]

比如,下面两个命令有相同的结果:

ffmpeg -i input.mpg -s 320x240 output.mp4ffmpeg -i input.mpg -vf scale=320:240 output.mp4

-vf 就是(video filter),scale是这个视频过滤器的名字,ffmpeg工程中有很多的视频过滤器,后面还有很多…

2-2按比例缩放

缩小到一半:

ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4

缩小到0.9倍大小:

ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4

三.视频裁剪

3-1crop

视频裁剪又用到了另一个视频过滤器:crop
用法如下:
这里写图片描述
各个参数的意义:
这里写图片描述

举例:如果我们要分别裁剪视频的左三分之一,中间三分之一,右三分之一,可分别执行如下命令:

ffmpeg -i input -vf crop=iw/3:ih:0:0 outputffmpeg -i input -vf crop=iw/3:ih:iw/3:0 outputffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output

3-2cropdetect

cropdetect过滤器用来自动裁剪视频的非黑色区域。有些视频上下或者左右会有黑色区域,如果我们想获得只包含有效数据(不包含黑色区域)的视频,那么,我们可以使用这个过滤器。
比如所,为了裁剪非黑区域,我们可以使用如下命令:

ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4

limit用来限定颜色的值。这里的意思就是裁剪的区域的颜色值为黑色。从中我们可以看到我们可以给limit不同的赋值,来裁剪出非指定颜色的区域。

3-3裁剪时间

视频播放器通常有一个进度条,而且会显示播放的时间,大多数播放器一般会在鼠标扫过播放器的时候才会显示这些。那么,如果我们想要裁剪出时间,我们要怎么办呢?
ffmpeg有一个testsrc的视频源,这个视频包含了时间的显示:
这里写图片描述
那么我们想要裁剪出其中的时间,可以这样:

ffmpeg -f lavfi -i testsrc -vf crop=29:52:256:94 -t 10 timer1.mpg

crop可以有四种取值,分别对应不同的时间范围:
这里写图片描述

四.视频填充

视频填充使用的pad视频过滤器,这个过滤器用法如下:
这里写图片描述
各个参数的意义:
这里写图片描述
比如说,我们要个一个图片填充30个像素的粉红色边框,可以这样:

ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

效果如下:
这里写图片描述

4-1填充4:3的视频为16:9

命令格式如下:

ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output

4-2填充16:9的视频为4:3

命令格式如下:

ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:color output

当然了,填充的视频不局限于4:3还是16:9,我们完全可以填充为任意比例的视频。

五.翻转和旋转视频

5-1水平翻转

水平翻转使用hflip视频过滤器。
用法举例:

ffplay -f lavfi -i testsrc -vf hflip

这里写图片描述

5-2垂直翻转

垂直翻转使用vflip视频过滤器。
用法举例:

ffplay -f lavfi -i rgbtestsrc -vf vflip

这里写图片描述

5-3旋转

旋转使用transpose视频过滤器。
transpose用法如下:
这里写图片描述
这里很好理解,你可以发现下面两个命令是等价的:

ffplay -f lavfi -i smptebars -vf transpose=0ffplay -f lavfi -i smptebars -vf transpose=2,vflip

下面两个命令也是等价的:

ffplay -f lavfi -i smptebars -vf transpose=3ffplay -f lavfi -i smptebars -vf transpose=1,vflip

六.模糊化、锐化和其他去噪

6-1模糊化

模糊化可提高特定噪声的图片的质量。ffmpeg提供了两种模糊化的视频过滤器:boxblur和smartblur。
用法举例:

ffmpeg -i input.mpg -vf boxblur=1.5:1 output.mp4ffmpeg -i halftone.jpg -vf smartblur=5:0.8:0 blurred_halftone.png

6-2降低锐化

降低锐化可以使用unsharp视频过滤器。
用法举例:

ffmpeg -i input -vf unsharp output.mp4ffmpeg -i input -vf unsharp=6:6:-2 output.mp4

6-3去噪

denoise3d可用于减少噪声。
用法举例:

ffmpeg -i input.mpg -vf mp=denoise3d output.webm

这一章目前一笔带过,reader可以自行阅读《FFmpeg Basic》这本书第八章。

七.覆盖-图片中的图片

覆盖是非常常见的视频处理,比如有些视频会有时间显示,有些电视节目会显示频道的Logo等等。
覆盖
视频覆盖技术可以在后面的视频或者图片上覆盖一层前面的视频或者图片。ffmpeg提供了overlay视频过滤器实现覆盖。用法见下表:
这里写图片描述
用法格式如下:

ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output

input1是后台视频,input2是前台视频。x,y是覆盖开始的左上角的位置。
注意,这里使用的是-filter_complex选项,而不是-vf选项。因为现在有两个输入源,以前的例子都是只有一个输入源。

左上角的Logo:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

右上角的logo:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4

右下角的logo:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair3.mp4

左下角的Logo:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair4.mp4

比如,要在5秒后显示Logo:

ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png ^-filter_complex overlay timer_with_logo.mp4

7-2给视频添加时间

首先从testsrc视频源中裁剪出时间:

ffmpeg -f lavfi -i testsrc -vf crop=61:52:224:94 -t 30 timer.ogg

然后把它覆盖到另一个视频上:

ffmpeg -i start.mp4 -i timer.ogg -filter_complex overlay=451 startl.mp4

八.给视频添加文字

给视频添加文字使用drawtext视频过滤器。

8-1显示文字

如下例子:

ffplay -f lavfi -i color=c=white ^-vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text=Welcome

这里写图片描述
fontfile用来指定字体,text用来指定要显示的内容。

8-2指定位置

那么,要指定在具体的位置显示,该怎么指定位置呢?可以使用x,y来指定要显示的位置:
比如:

ffplay -f lavfi -i color=c=white -vf ^drawtext="fontfile=arial.ttf:text='Good day':x=(w-tw)/2:y=(h-th)/2"

这要字体Good day就会显示在视频中间了。

8-3字体大小和颜色的设置

比如:

ffplay -f lavfi -i color=c=white -vf drawtext=^"fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:^fontcolor=green:fontsize=30"

也就是说我们可以使用fontcolor和green:fontsize分别指定文字的颜色和大小。

8-4动态文字

变量t代表视频当前的秒数。我们可以通过t来改变x,y,从而使得文字的位置动态的改变。
8-4-1水平方向的移动
举例:

ffmpeg -f lavfi -i color=c=#abcdef -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30" output

这里,x=w-t*50,因此,x随着t的增大不断的减小,位置也不断的左移。
8-4-2垂直方向的移动
举例:

ffmpeg -i palms.avi -vf drawtext="fontfile=arial.ttf:textfile=Credits:x=w/2:y=h-t*100:fontcolor=white:fontsize=30" clip.mp4

这里y=h-t*100,随着时间的增加,h不断减小,文字不断的上移。

0 0
原创粉丝点击