2021-01-26

本文主要基于ffmpeg basics书籍介绍ffmpeg的命令行的使用

ffmpeg命令行工具的语法相对简单,重要的是在正确的位置键入所需的参数,不要在各种输入和输出之间混合选项。

ffmpeg命令的一般结构如下,global options影响所有的输入和输出:

ffmpeg [global options] [input file options] -i input_file [output file options] output_file

例如:ffmpeg -y -i video.avi -s vga video.mp4

此命令执行的内容为: -y 如果输出存在就覆盖,不提示;-i 输入文件;-s vga 将输出的文件帧大小设置为vga大小(640x480)。

 

使用sdl库输出图像

2021-01-26_第1张图片

注意,SDL设备只能以yuv420p像素格式的输出,而对于其他输入类型,必须在选项-pix_fmt前加上值yuv420p,否则将显示错误,例如:

ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -f sdl Example 

(直接复制这条命令运行就可以了)

2021-01-26_第2张图片

FFmpeg中可用的SI前缀

当为各种ffmpeg选项(如比特率或最大文件大小)指定数值时,可以使用常见的SI后缀

K表示(10^3),M表示兆(10^6),G表示千兆(10^9),等等。下一个示例为输出文件指定一个新的比特率1.5兆/秒,所有命令都执行结果相同

ffmpeg -i input.avi -b:v 1500000 output.mp4
ffmpeg -i input.avi -b:v 1500K output.mp4
ffmpeg -i input.avi -b:v 1.5M output.mp4
ffmpeg -i input.avi -b:v 0.0015G output.mp4

(-b:v表示设置视频的比特率bitrate:video ,同理-b:a表示音频的比特率)

 

后缀B(字节)可用于带有数值的ffmpeg选项,并将值乘以数字8。
它可以与其他前缀组合表示千字节(KB)、兆字节(MB)等。例如,要将输出文件的最大文件大小设置为10兆字节,可以使用下面的命令

ffmpeg -i input.mpg -fs 10MB output.mp4     (-fs 表示限制输出文件大小)

使用ffmpeg转码

ffmpeg程序读入内存的内容通过-i选项指定,根据输入的参数或程序默认值处理它,并将结果写入任意数量的输出。输入和输出可以是计算机文件、

管道、网络流、录制设备等。

在代码转码过程中,ffmpeg调用libavformat库中的demuxers解封装来读取输入,并从中获取带有编码数据的数据包如果有多个输入,

ffmpeg通过跟踪所有活动输入流的最低时间戳来保持它们的同步然后解码器从编码的包中产生未压缩的帧解压后的数据,经过可

的滤波(filter)后,帧被发送到编码器编码器产生新的编码格式数据,发送到muxer封装对应的格式并输出如下图

2021-01-26_第3张图片

滤镜,滤镜链和滤镜图(Filters, filterchains and filtergraphs )这个语法很重要

在多媒体处理中,术语滤镜(filter)是指一种软件工具,它在输入被编码到输出之前对输入进行修改。过滤器分为音频和视频filter(请参见术语表中的过滤器)

FFmpeg内置了许多媒体滤镜,并允许以多种方式组合使用它们。命令使用复杂语法根据指定的参数将帧从一个filter镜直接解码到另一个滤镜。

这简化了媒体处理,因为使用有损编解码器对媒体流进行多重解码和编码降低了整体质量FFmpeg的filter APIlibavfilter软件库,它允许filter具有多个输入和输出

filter输入和输出之间视频过滤器使用-vf选项音频过滤器使用-af选项。例如,下一个命令使用转置滤镜(见7)产生一个顺时针旋转90°的测试图案):

ffplay -f lavfi -i testsrc -vf transpose=1 (直接复制命令就可测试)

(-f lavfi表示使用lavfi虚拟设备一般用于测试;-vf transpose=1表示使用转置滤镜并顺时针旋转90度)

2021-01-26_第4张图片

下面的例子使用atempo音频过滤器将输入音频的播放速度降低到80%

ffmpeg -i input.mp3 -af atempo=0.8 output.mp3 

 

下面这条命令相当于给视频打水映(图层叠加)

ffmpeg -i output.avi -i 2.jpg -filter_complex overlay=x=150:y=150 out.mp4

效果如图:(左为执行后效果,右为原视频)

2021-01-26_第5张图片

filter经常用于filterchains(以逗号分隔)和filtergraphs(以分号分隔)。如果使用任何空格,filterchain必须括在引号中

在filtergraphs中可以使用链接标签符号为 [] ,这些标签表示所选过滤器链的输出,可以在以下filtergraphs中的任何位置使用

例如,我们想比较输入视频和通过hqdn3d滤镜去噪的输出效果。如果没有filtergraphs,我们必须使用至少2个命令

ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4
ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4 

使用filtergraph语法命令, 可以只需一条命令达到效果:

ffplay -i i.mpg -vf "split[a][b];[a]pad=2*iw[A]; [b]hqdn3d[B];[A][B]overlay=w "

split滤镜将输入分成两个相同的输出,分别标记为[a]和[b],然后[a]标志被用作第二个填充滤镜链的输入,滤镜输出标志位[A]。

[b]标志被用作第三去噪滤镜链的输入,滤镜输出标志位[B]。最后一个滤镜链使用[A]和[B]标签作为生成最终比较的叠加滤镜的输入

整个命令意思为将i.mpg分为两路输出,一路[a]使用pad滤镜生成输出[A],一路[b]使用hqdn3d滤镜生成输出[B],最后将[A][B]叠加输出。

例如:

ffplay -f lavfi -i testsrc -vf "split[a][b];[a]pad=2*iw[1];[b]vflip[2];[1][2]overlay=w"

命令执行为[a]数据默认宽度*2,[b]数据反转,再将两组在输入的窗口宽度内合并,overlay=w这个w参数可以更改(如:W,n)。

2021-01-26_第6张图片

 

 

你可能感兴趣的:(ffmpeg)