zoukankan      html  css  js  c++  java
  • FFmpeg Basics学习笔记(2)

    帧率 fps的概念

    帧率,单位FPS(frame per second), 用于衡量视频每秒的处理帧数,对于编码器而言说明编码器在1s的编码的速度,通常可以使用一帧的编码时间倒数简单计算;对于解码器而言,帧率表示1秒内解码帧数。
    电视节目中比较常用的帧率制式有NTSC、PAL。另外,帧率可能会因为视频是否是交织(interlaved,i)或逐行(progressive,p)的,描述上有所不同。对于交织的视频,一帧数据包含两场:顶场和底场。
    NTSC标准使用60i fps,意思是每秒60场,亦即30帧。(60 fields),30帧
    PAL标准使用50i fps,意思是每秒50场,亦即25帧。

    如何设置转码帧率

    ffmpeg提供了-r用于设置转码之后的帧率,命令行如下:

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

    使用fps filter

    这里介绍第一个filter,名字是fps,可用于设置输出视频的帧率,语法如下:

    fps=fps=number_of_frames

    比如下面命令行将input.avi的帧率处理成25帧,输出到output.mp4中

    ffmpeg -i input.avi -vf fps=fps=25 output.mp4

    预定义的帧率

    ffmpeg提供了几种常用的帧率:

    缩写				帧率			准确值
    ntsc-film 		23.97fps 	24000/1001
    film 			24fps 		24/1
    pal、qpal、spal	25fps		25/1
    ntsc、qntsc、sntsc 29.97fps	30000/1001
    

    在使用-r参数是可以用上面的缩写指代特定帧率。

    码率 bitrate

    码率是指单位时间内处理的音视频数据的比特数,单位bps。在同样的编码条件下,码率决定音视频数据的质量。
    比较常用的码率控制策略有下面三种:

    • ABR:平均码率,固定编码大小的情况下较常用
    • CBR:固定码率,多数用于流媒体串流或直播,用于保存不实用。
    • VBR:自适应码率,简单场景使用低码率编码,复杂场景使用高码率编码。同等大小情况下,编码质量比VBR和CBR要好。

    ffmpeg中设置码率的参数在FFmpeg Basics学习笔记(1)ffmpeg基础已经介绍了,有兴趣可以看看。

    CBR设置

    设置为CBR码率输出时,需要指定minrate和maxrate参数,并保证-b和二者的参数相同即可。

    ffmpeg -i in.avi -b 500K -minrate 500K -maxrate 500K -bufsize 1M out.mkv

    限制输出文件的大小

    可以使用-fs命令

    ffmpeg -i in.avi -fs 10MB out.mp4

    视频缩放

    视频缩放可分为两种,保持宽高比的缩放(Scale)、任意比例缩放(Resize)。前者通常不破坏原始图像的显示比例,视觉效果通常比较好,类似数学中的等比例变换;后者比较灵活,可以任意变换。

    比如下面的缩放处理,将源视频缩放为320x240大小

    ffmpeg -i in.mp4 -s 320x240 out.mp4

    ffmpeg中预先定义了一些分辨率,比如:(注意描述视频时通常是宽x高)

    • qcif、cif、4cif、16cif,宽高都是2倍递增的关系。只需要记住cif:352x288
    • vga 表示640x480分辨率
    • hd720 表示1280x720分辨率,通常说的720p
    • hd1080 表示1920x1080分辨率,通常说的1080p

    scale video filter

    scale视频filter支持视频的缩放。其基础语法如下:

    scale=height[inter1={1|-1}]

    其中width和height表示缩放之后的视频宽高,inter表示是否是自动启用去交织的功能。在实际命令函中还可以出现以下参数:

    • iw、ih 输入源的视频宽高
    • ow、oh 输出的视频宽高
    • a、sar、dar(a 宽高比=iw/ih; sar 输入源的宽高比; dar 输入源的显示宽高比=a*sar)
    • hsub、vsub 水平和垂直方向上色度分量的采样步长,比如对YUV422p的格式,hsub=2、vsub=1

    具体使用可以参考下面命令行:

    ffmpeg -i in.mp4 -vf sacle=320:240 out.mp4

    下面两条语句分别实现等比例缩放、指定宽高的等比缩放

    ffmpeg -i in.mp4 -vf scale=iw0.6:ih0.6 out.mp4

    ffmpeg -i in.mp4 -vf scale=200:200/a out.mp4

    视频裁剪 Crop

    视频裁剪指的是从指定视频的某个区域(通常是矩形)取出部分画面。

    crop video filter

    crop filter的语法如下:

    crop=ow[:oh[❌[y:[:keep_aspect]]]]

    除了能使用scale filter提供的参数外,还可以使用用x、y、n、pos、t等参数,具体含义如下:

    • x,y 裁剪区域起始点坐标,默认为((iw-ow)/2, (ih-oh)/2)
    • n、pos、t分别用于标识当前帧数、位置及时间戳

    只截取源视频的中心区域(长宽取一半)

    ffmpeg -i in.avi -vf crop=iw/2:ih/2 out.mp4

    cropdetect video filter

    自动截取非黑色的区域。在4:3和16:9视频显示时通常填充黑边,cropdetect filter会比较有用。其语法如下:

    cropdetect[=limit[:round[:reset]]]

    各字段含义:

    • limit: 黑色判定门限,取值范围[0,255],默认为24
    • round,向上取整参数,整数对齐,比如必须要求输出宽高是16的倍数、偶数。
    • reset,重新计算裁剪区域的间隔

    ffmpeg命令行格式,

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

    pad video filter

    区域填充特殊颜色,通常色彩填充多用于视频分辨率和屏幕分辨率不一致的情况下,为了保证视频的效果,保持拉伸的宽高比,在左右填充或者上下填充。pad filter语法如下:

    pad=width[:height[:x[:y[:color]]]]

    除了可以使用crop filer中参数,这里提供了color,用于指定填充颜色;width和height为输出视频的分辨率;x和y表示输入源的左上角在输出画面上的偏移。

    下面语句的功能是在800x640的图片外围填充30个像素的粉红色边框。

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

    视频的镜像

    hflip video filter

    hflip实现对视频的水平翻转。语法如下:

    -vf hflip

    翻转效果类似下面的示例:(翻转之后图像互为水平镜像)

    ABC	  |   CBA
    DEF	  |   FED
    

    vflip video filter

    vflip实现对视频的垂直翻转。语法如下:

    -vf vflip

    翻转效果类似下面(垂直镜像)

    000    |    888		
    111    |	111
    888    |    000
    

    transpose video filter

    transpose filter用于实现特定角度旋转和翻转配合的效果。其语法如下:

    -vf transpose={0,1,2,3}

    0	逆时针旋转90°+垂直翻转
    1	顺时针旋转90°
    2	逆时针旋转90°
    3	顺时针旋转90°+垂直翻转
    

    类型0和3是旋转和垂直翻转配合的处理。下面两个输出是一样的:

    ffplay -f lavfi -i smptebars -vf transpose=0

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

    顺时针旋转90°的效果是这样的(左边是原图,右边是transpose之后的图)

    AB			CA
    CD			DB
    

    顺时针旋转90°+垂直翻转的效果如下:

    AB			DB
    CD			CA
    

    对比下图即可。
    transpose类型3的效果

    附加说明

    本部分内容主要涉及《Ffmpeg Basic》的第3章到第7章(包含第7章),介绍了比较多的视频编码参数和处理,比如帧率、码率、缩放、裁剪、填充和旋转。
    概念性内容比较多,建议可以简单了解下有关内容,实际需要用到的时候再深入研究下。

  • 相关阅读:
    Spring MVC3 + Ehcache 缓存实现
    DB2导入导出数据库数据
    JS、ActiveXObject、Scripting.FileSystemObject
    new ActiveXObject("Scripting.FileSystemObject") 时抛出异常 .
    各种浏览器的内核是什么
    Content-Type: application/vnd.ms-excel">
    常用jar包用途
    nutz的json视图
    Nutz中那些好用的工具类
    The JSP specification requires that an attribute name is preceded by whitespace
  • 原文地址:https://www.cnblogs.com/tocy/p/ffmpeg-basic-learning-2.html
Copyright © 2011-2022 走看看