《FFmpeg Basics》中文版-23- 先进的技术点
写在前面如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑也可以关注我的简书账户:张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。正文加入音频和视频文件有几种加入媒体文件,它们在表格中描述:
类型描述针对音频针对视频级联编码文件一个接一个; 第一个结束,第二个开始YesYes合并将所有音频流编码为一个,例如2个单声道到1个立体声YesNo混合将2个或更多音频通道编码为1,音量可以调节YesNo多路复用 (mux)将2个或更多文件编码为1,例如1个音频和1个视频文件,如果存在更多相同类型的流,则选择是在用户YesYes覆盖/画中画 (PiP)2个或更多视频一次显示在另一个旁边或一个在另一个之上NoYes连接与shell命令媒体文件连接的先决条件特殊文件格式连接只能是某些文件格式:音频- MP3(第2个文件的头将消失),未压缩的像WAV, PCM,等视频- MPEG-1, MPEG-2 TS, DV格式的一致性所有连接的文件都是相同的格式,这意味着可以加入2个MP3文件,但1个带有1个WAV的MP3不能流的一致性所有连接文件:- 包含相同数量的每种类型的流。- 音频流使用相同的编解码器,采样率和通道布局- 视频流使用相同的分辨率为符合此要求,通常需要转换输入文件,使用-q 1或类似选项来保持初始质量,详细信息请参阅格式间转换在Windows上,我们可以使用带有/B标志的复制命令来指示二进制模式,在文件之间必须是一个加号。连接N文件的复制命令的一般形式是:copy /B file1+file2+...+fileN-1+fileN outputFile例如,连接文件videoclip1。mpg和videoclip2。mpg到文件视频。mpg,我们可以使用以下命令:copy /B videoclip1.mpg+videoclip2.mpg video.mpg在Linux、Unix和OS X上,我们可以在表单中使用cat命令:cat file1 files2 > file3,因此我们可以修改前面的例子:cat videoclip1.mpg videoclip2.mpg > video.mpg链接concat协议另一种选择是使用concat协议,先决条件类似于复制命令。例如,要使用该协议修改前面的示例,我们可以使用以下命令:ffmpeg -i concat:"videoclip1.mpg|videoclip2.mpg" -c copy video.mpg我的测试命令:ffmpeg -i concat:"/Users/zhangfangtao/Desktop/test.mp4|/Users/zhangfangtao/Desktop/test2.mp4" -c copy /Users/zhangfangtao/Desktop/test3.mp4显示效果:生成了一个新的视频,不过我感觉这个视频和test1没有什么差别。连接concat过滤器用于音频和视频拼接的特殊过滤器是在表中描述的concat过滤器:
描述连接音频和视频文件一个接一个。该过滤器适用于同步视频和音频流的片段(文件),其中所有片段必须具有相同数量的每种类型的流,例如1个音频和1个视频,或2个音频和1个视频,等等语法concat=a=a_streams:v=v_streams:n=segments[:unsafe]所有的参数都是可选的参数的描述a输出音频流的数量,默认值为0n段数,默认值为2unsafe安全模式激活,如果设置,连接将不会以不同格式的片段失败v输出视频流的数量,默认值为1适当筛选结果的先决条件:所有段必须从时间戳0开始。相应的流必须在所有段中使用相同的参数,特别是视频大小。建议是相同的帧速率,否则输出将使用可变帧速率。Concat filter可以加入各种格式,有些例子是:ffmpeg -i input1.avi -i input2.avi -filter_complex concat output.avi ffmpeg -i input1.avi -i input2.avi -filter_complex concat output.mp4ffmpeg -i input1.avi -i input2.mp4 -filter_complex concat output.webmffmpeg -i input1.avi -i input2.mp4 -i input3.mkv -filter_complex ^ concat=n=3 output.flvffmpeg -i input1.avi -i input2.avi -i input3.avi -i input4.avi ^ -filter_complex concat=n=4 output.mp4f -i 1.avi -vf movie=2.avi[a];[in][a]concat a.mp4我的测试命令如下:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -i /Users/zhangfangtao/Desktop/test3.mp4 -filter_complex concat /Users/zhangfangtao/Desktop/test4.mp4显示效果:生成了一个视频,里面包含前两段的是视频内容,不过,有效时长只是第一段视频的长度。后面有种无效的感觉。。。。其他类型的拼接技术音频合并(多个流到1个多声道流) - 在数字音频一章中介绍将几个音频文件混合到1 - 在数字音频一章中有描述多路复用 - 在“FFmpeg基本介绍”一章中介绍了媒体流的选择overlay-在overlay-画中画章节里面有具体的描述。移除掉logo一些视频包含公司标志,通常位于左上角,常见示例是录制电视节目。 FFmpeg包含2个特殊滤镜以去除徽标,而最终效果并不总是完美,不过在许多情况下这种移除logo的技术还是可以接受的。delogo过滤器
描述通过对周围像素的简单插值来隐藏一个电视台的标志。用户设置一个覆盖该徽标的矩形,它通常会消失(但在某些情况下,标识更明显)。过滤器接受参数作为表单“x:y:w:h:band”的字符串,或作为键=值对的列表,由“:”分隔语法delogo=x=0:y=0:w=width:h=height[:t=band:show={0,1}][]中的参数是可选的,显示为0或1参数的描述x, y标志的左上角的坐标w, h标志的宽度和高度band or t该标志矩形的模糊边缘厚度,默认值为4show定位的参数,默认值为0,如果设置为1,屏幕上的绿色矩形显示为帮助查找正确的x、y、w和h参数例如,我们首先从下图所示的800x600像素大小视频的右上角移除一个标志,我们通过显示一个绿色矩形的显示选项来估计logo的位置:ffmpeg -i eagles.mpg -vf delogo=x=700:y=0:w=100:h=50:t=3:show=1 nologo.mpg现在我们可以精确地指定位置和标识的存在几乎是不可见的:ffmpeg -i eagles.mpg -vf delogo=x=730:y=0:w=70:h=46:t=1 nologo.mpg
我的测试命令如下(没有t参数,我这边不识别这个,报错):ffmpeg -i /Users/zhangfangtao/Desktop/ornage.jpeg -vf "delogo=x=15:y=678:w=218:h=20:show=1" /Users/zhangfangtao/Desktop/ornage2.jpeg显示效果(有没有看到一个绿色的框):
有没有看到一个绿色的框ffmpeg -i /Users/zhangfangtao/Desktop/ornage.jpeg -vf "delogo=x=10:y=700:w=300:h=35" /Users/zhangfangtao/Desktop/ornage3.jpeg显示效果(水印没了):
水印没了.jpeg抖动视频部分的固定没有三脚架或车辆拍摄的视频的一些部分通常包括抖动 - 水平和垂直移动的小变化,在某些情况下可以使用去抖滤波器进行修正:
描述修正水平和垂直位移的小变化,当视频没有三脚架或移动车辆时有用语法deshake=x:y:w:h:rx:ry:edge:blocksize:contrast:search:filename所有的参数是可选的参数的描述x, y, w, h矩形区域的坐标和大小,搜索运动向量,x和y是左上角的坐标,w是宽度,h是高度。这些参数与drawbox过滤器具有相同的含义,可用于可视化边界框的位置。当物体在框架内同时运动时,运动矢量搜索可能会混淆摄像机的运动,这是很有用的。如果x, y, w和h都被设为-1那么整个框架就被使用了。这允许在不指定运动向量搜索的边界框的情况下设置后续选项。默认-搜索整个框架。rx, ry在0 - 64像素范围内指定x和y方向的最大运动范围,默认值为16edge指定如何生成像素来填充框架边缘的空白,值为从0到3的整数:0 -在空白位置填充零1 -原始图像在空白位置2 -在空白位置的挤压边值3 -镜像边缘在空白位置,默认值blocksize指定用于运动搜索的块大小,其值为4 - 128像素,默认值为8contrast指定块的对比度阈值。只有超过指定对比度的块(最黑和最轻的像素之间的区别)才会被考虑。该值来自范围1 - 255,默认值为125search指定搜索策略:0 =彻底搜索,默认值1 =不彻底搜索filename如果包含,则将动作搜索的详细日志写入指定的文件参数可以按顺序进入默认顺序或以任何顺序指定名称:ffmpeg -i travel.avi -vf deshake fixed_travel.aviffmpeg -i travel.avi -vf deshake=contrast=160 fixed.aviffmpeg -i travel.avi -vf deshake=blocksize=4:filename=log.txt fixed.avi我的测试命令:ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake /Users/zhangfangtao/Desktop/1527143198.mp4 ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake=contrast=160 /Users/zhangfangtao/Desktop/1527143199.mp4ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake=blocksize=4:filename=/Users/zhangfangtao/Desktop/log.txt /Users/zhangfangtao/Desktop/1527143200.mp4显示效果:其实,我并没有看出来什么效果。。。可能我用手机拍的抖得太厉害了。。。第三条指令打印出来的txt信息截图如下:
log.txt将颜色框添加到视频使用drawbox,我们可以在矩形区域找到精确的坐标,以在其中搜索运动矢量,它用于除雾过滤器。 其他用途包括各种图表,方案等。
描述在输入的选定区域绘制指定颜色和指定大小的框语法drawbox[=x:y:width:height:color:thickness]参数的描述color, c格式0xRRGGBB[AA]中的标准颜色名称或十六进制值height, h框的高度,默认值为0thickness, t边框边缘的宽度以像素为单位,默认值为4width, w框的宽度,默认值为0x, y方框的左上角坐标,默认值为0例如,要在SVGA大小的输入上添加一个尺寸为600x400像素的黄色框,其大小为左侧150像素和顶部0像素,我们可以使用以下命令:ffmpeg -i ship.avi -vf drawbox=x=150:w=600:h=400:c=yellow ship1.avi
我的测试命令:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf drawbox=x=150:w=600:h=400:c=yellow /Users/zhangfangtao/Desktop/test3.mp4显示效果
检测帧数如果您需要知道有多少帧包含您的视频文件,您可以使用以下命令:ffmpeg -i input.mpg -f null /dev/null显示输出的最后两行是:frame= 250 fps=0.0 q=0.0 Lsize= 0kB time=00:00:10.00 bitrate= 0.0kbits/svideo:16kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.000000%帧数为250,表示视频帧的总数,也可以从帧速率和持续时间计算,但结果并不总是准确。我的测试命如下:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -f null /dev/null显示效果如下:
检测广告,部分转换或损坏的编码从电视,互联网等录制的较长视频可以包含带有广告,转场,不完整帧和其他不需要内容的短片。 如果此部分包含黑色框架,则可以使用表中描述的黑色检测过滤器检测它们。
Description检测几乎全黑的视频部分,并输出包含检测到的黑色间隔的开始,结束和持续时间的行,以秒为单位表示。 如果日志级别设置为低于AV_LOG_INFO值,则不显示行语法blackdetect[=d=duration:pic_th=pbr_threshold:pix_th=px_threshold]参数的描述(所有的参数都是可选的)参数名称单位描述默认值black_min_duration, d秒正浮点数确定视频中黑色帧的最小持续时间2.0picture_black_ratio_th, pic_th浮点数在0到1.0之间例如,如果帧大小为400x300(总共12万像素),12000像素不是黑色,那么这个比例是0.90.98pixel_black_th, pix_th浮点数在0到1.0之间Treshold设置像素为黑色,它等于表达式:(absolute_threshold–luminance_minimum_value) luminance_range_size)0.1例如,要从源mptestsrc中检测黑帧,命令是(控制台输出如下):ffmpeg -f lavfi -i mptestsrc -vf blackdetect -f sdl 'test'
我的测试命令:ffmpeg -f lavfi -i mptestsrc -vf blackdetect -f sdl 'test'*显示效果:
用黑帧过滤器进行检测检测黑帧的另一个过滤器是表中描述的黑帧过滤器:
描述检测几乎为黑色的帧,并输出包含:- 检测帧的帧数- 黑色部分的百分比- 如果已知则在文件中定位,否则为-1- 时间戳语法blackframe[=amount:[treshold]]所有的参数都是可选的参数amount在阈值下的像素百分比,默认值为98threshold下面是被认为是黑色的像素,默认值是32过滤器blackdetect和blackframe类似,但每个显示不同的信息。 图像上显示使用与黑检测滤镜相同的视频源的黑帧滤镜输出:ffmpeg -f lavfi -i mptestsrc -vf blackframe -f sdl 'test'
我的测试命令如下:ffmpeg -f lavfi -i mptestsrc -vf blackframe -f sdl 'test'显示效果:只选择指定的帧进行输出特殊的多媒体过滤器可以选择音频并选择视频启用,以精确指定哪些帧将保留,哪些从输出中排除。描述选择输出帧,对每个输入帧评估表达式,如果表达式的值不为零,则选择帧,否则跳过帧语法select=expressionexpression默认值是1可用的参数n从0开始的过滤帧的连续编号selected_n所选帧的序号,从0开始prev_selected_n如果未定义,则最后一个选定帧的序列号为NANTB输入时间戳的时基pts如果NAN未定义,那么经过滤波的视频帧的PTS(表示时间戳)以TB为单位表示t如果NAN未定义,则滤波的视频帧的PTS以秒表示prev_pts先前过滤的视频帧的PTS,如果未定义则为NANprev_selected_pts如果NAN未定义,则最后一个先前过滤的视频帧的PTSprev_selected_t如果NAN未定义,则最后选择的最后一个视频帧的PTSstart_pts如果NAN未定义,视频中第一个视频帧的PTSstart_t如果NAN未定义,第一个视频帧的时间在视频中pict_type(只局限在视频中)过滤帧的类型,可以采用以下值之一:I ...帧内预测帧, P ... 前向预测帧, B ...双向预测帧, S ...交换帧,SI ...切换I帧,SP ...切换P帧,BI ...特殊帧内帧,不是关键帧(VC-1视频编解码器)interlace_type(只局限在视频中)帧间型,可采用下列值之一:PROGRESSIVE, TOPFIRST, BOTTOMFIRSTPROGRESSIVE帧是渐进的(不是交错的)TOPFIRST帧是top-field-firstBOTTOMFIRST帧是bottom-field-firstkey如果经过筛选的帧是一个关键帧,否则为0pos如果信息不可用(例如合成视频),在过滤帧的文件中位置为-1scene(仅局限于视频)0和1之间的值表示一个新的场景;低值反映了当前帧引入新场景的低概率,而更高的值意味着当前帧更可能是一个consumed_sample_n在当前帧之前选择的样本数目samples_n当前帧中的样本数目sample_rate输入采样率由于select表达式的默认值为1,因此选择过滤器使用的接下来的两个示例会产生相同的结果 - 所有帧将被选择为输出(值如果是0将不会选择任何内容):ffmpeg -i input.avi -vf select output.aviffmpeg -i input.avi -vf select=1 output.avi我的测试命令如下:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select /Users/zhangfangtao/Desktop/test3.mp4 ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=1 /Users/zhangfangtao/Desktop/test3.mp4 ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=0 /Users/zhangfangtao/Desktop/test3.mp4实现效果,前两个命令生成的是和原来一样的视频,最后一个命令,只有音频信息,没有界面。要选择20到25秒的部分,我们可以使用以下命令:ffmpeg -i input.avi -vf select="gte(t\,20)*lte(t\,25)" output.avi我的测试命令如下:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select="gte\(t\,20\)*lte\(t\,25\)" /Users/zhangfangtao/Desktop/test3.mp4实现效果:时间的限制不是太准确,,,还是从头给我播放到了最后。。。若要选择帧内仅为输出,我们可以使用以下命令:ffmpeg -i input.avi -vf select="eq(pict_type\,I)" output.avi我的测试命令如下:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select="eq\(pict_type\,I\)" /Users/zhangfangtao/Desktop/test3.mp4实现的结果:视频长短没有变,但是视频的大小几乎减少了一半。而且视频少了很多细节。通过改变纵横比来缩放输入调整和伸缩视频章节描述了缩放视频帧的缩放过滤器。 另一种方法是使用改变显示宽高比DAR和样本宽高比SAR的setdar和setsar滤波器,它们的关系用公式表示(关于宽高比的细节在词汇表中):DAR = width/height * SAR描述setdar过滤器设置显示纵横比和setsar的样本纵横比语法setdar[=r=aspect_ratio[:max=number]]setdar[=aspect_ratio[:number]]参数的描述r, ratio纵横比,值可以是浮点数或表达式,默认值为0max在将纵横比设为一个有理数时,表示分子和分母的最大整数值,默认值为100示例如何使用setdar和setsar过滤器:ffplay -i input.avi -vf setdar=r=16/9ffplay -i input.avi -vf setdar=16/9ffplay -i input.avi -vf setsar=r=1.234ffplay -i input.avi -vf setsar=1.234我的测试命令如下:ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setdar=r=16/9ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setdar=16/9ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setsar=r=1.234ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setsar=1.234显示效果如下:屏幕抓取为了将显示输出记录到视频文件中,例如创建一个教程,我们可以使用安装了UScreenCapture直接显示源过滤器的dshow输入设备,下面是下载地址。http://www.umediaserver.net/bin/UScreenCapture.zip为了抓取全屏内容,我们可以使用以下命令:ffmpeg -f dshow -i video="UScreenCapture" -t 60 screen.mp4如果我们想抓取一个特定的屏幕区域。我们必须使用regedit Windows工具来修改某些注册表项,相信信息在downloaded UScreenCapture.zip文件里面的README文件里面。因为我用的MAC电脑,所以我的录屏命令如下:ffmpeg -f avfoundation -r 30 -i "1:0" -t 20 /Users/zhangfangtao/Desktop/test2.mp4显示效果如下:视频帧的详细信息为了显示每个视频帧的信息,我们可以使用表格中描述的showinfo过滤器:描述显示包含有关每个输入视频帧信息的行,数据采用键:值对的形式。 该过滤器没有参数,应与-report选项一起使用语法-vf showinfo显示参数的描述n输入框的序号,从0开始pts输入框的表示时间戳,表示为若干时间基单元;时间基单元依赖于过滤器输入板pts_time输入框的表示时间戳,表示为若干秒pos输入流中帧的位置,如果该信息不可用或没有意义(例如在合成视频中)fmt像素格式名称sar输入帧的采样宽高比,以分子/分母的形式表示s输入框的大小,以宽*长的形式表示i隔行扫描模式:P表示渐进式,T表示前场第一,B表示后场第一iskey如果该帧是关键帧,则为1,否则为0type输入帧的图像类型:I代表I帧,P代表P帧,B代表B帧,? 对于未知类型(更多的信息见AVPictureType枚举的文档)checksum输入帧的所有平面的Adler-32校验和(十六进制)plane_checksum输入帧的每个平面的Adler-32校验和(十六进制),表示形式为[c0 c1 c2 c3]例如,下一个命令会生成下面打印的信息,其中包括前三行:ffmpeg -report -f lavfi -i testsrc -vf showinfo -t 10 showinfo.mpgn:0 pts:0 pts_time:0 pos:-1 fmt:rgb24 sar:1/1 s:320x240 i:P iskey:1 type:I checksum:88C4D19A plane_checksum:[88C4D19A]n:1 pts:1 pts_time:0.04 pos:-1 fmt:rgb24 sar:1/1 s:320x240 i:P iskey:1 type:I checksum:C4740AD1 plane_checksum:[C4740AD1]n:2 pts:2 pts_time:0.08 pos:-1 fmt:rgb24 sar:1/1 s:320x240 i:P iskey:1 type:I checksum:B6DD3DEB plane_checksum:[B6DD3DEB]我的测试命令如下:ffmpeg -report -f lavfi -i testsrc -vf showinfo -t 10 /Users/zhangfangtao/Desktop/test.mp4显示效果:音频频谱为了使音频频谱可视化,我们可以使用表中描述的示波器滤波器:描述将音频输入转换为视频输出语法showspectrum[=s=widthxheight[:slide=number]]参数的描述size, s输出视频大小,默认值为640x480slide设置频谱是否沿窗口滑动,默认值为0例如,下面的图片显示了该命令创建的声谱:ffmpeg -i audio.mp3 -vf showspectrum audio_spectrum.mp4我的测试命令如下:ffmpeg -i /Users/zhangfangtao/Desktop/DYZDJ.mp3 -lavfi showspectrum /Users/zhangfangtao/Desktop/test3.mp4效果图音频波形可视化描述将输入音频转换为包含音频波表示的视频语法showwaves[=n=number[:r=rate[:s=video_size]]]参数的描述n打印在同一列上的样本数量越大,数值越大会降低帧速率,因此不能与速率参数结合使用rate, r帧速率,默认值为25,不能与n参数组合使用size, s视频大小,默认值是640x480来自音频输入的波形可以通过表格中描述的showwaves滤波器进行可视化:描述将输入音频转换为包含音频波表示的视频语法showwaves[=n=number[:r=rate[:s=video_size]]]参数的描述n打印在同一列上的样本数量越大,数值越大会降低帧速率,因此不能与速率参数结合使用rate, r帧速率,默认值为25,不能与n参数组合使用size, s视频大小,默认值是640x480例如,要将music.mp3文件中的波形可视化为waves.mp4文件,我们可以使用以下命令:ffmpeg -i music.mp3 -vf showwaves waves.mp4我的测试命令:ffmpeg -i /Users/zhangfangtao/Desktop/NWDSL.mp3 -lavfi showwaves /Users/zhangfangtao/Desktop/test3.mp4显示效果如图:语音合成没有Windows环境,下面的没测试,不过AVFoundation做这个相当简单,想了解AVFounadtion怎么实现的点击这里通过包含libflite外部库,人声可以与来自Flite(Festival Lite)(一种小型可嵌入TTS(文本到语音)引擎)的flite音频源合成。 它由美国卡内基梅隆大学CMU Speech Group开发。 Flite完全用C语言编写,重新实现了音乐节体系结构的核心部分,以实现为每个系统设计的声音之间的兼容性。 爱丁堡大学的节日语音合成系统是构建语音合成系统的框架。 有关Flite的更多详细信息,请访问http://www.speech.cs.cmu.edu/flite描述由于其大尺寸,使用未包含在官方Windows二进制文件中的libflite库来合成具有选定语音类型的人类语音语法flite="text"[:v=voice[:n=n_samples]]flite=textfile=filename[:v=voice[:n=n_samples]]参数的描述list_voices如果设置为1,则显示可用语音列表n, nb_samples每帧最大采样数,默认值为512text演讲的源文本textfile包含文本的文件名v, voice可用的声音:女 - slt,男 - awb,kal,kal16,rms; 默认语音为kal,其采样率(频率)为8000 Hz,其他语音使用16000 Hz由于flite库增加了10 MB以上的ffmpeg.exe文件,因此它不在官方二进制文件中,而Windows二进制文件可以从http://ffmpeg.tv/flite.php下载(Linux和OS X用户可以编译它们)。 要显示可用语音列表,我们可以使用以下命令:ffmpeg -f lavfi -i flite=list_voices=1要让计算机使用女性声音从Message.txt文件中读取文本,该命令为:ffplay -f lavfi -i flite=textfile=Message.txt:v=slt例如,要将文字“Happy New Year to all”保存到wish.wav文件中,我们可以使用以下命令:ffmpeg -f lavfi -i flite=text="Happy New Year to all":v=kal16 wish.wav如果我们想减慢讲话速度以获得更好的听力,我们可以使用以下命令:ffmpeg -f lavfi -i flite=textfile=text.txt -af atempo=0.5 speech.mp3一次将输出保存为多种格式虽然从第一章中解释的命令语法可以清楚看出,但我们可以通过一个命令将处理结果保存为多种格式,例如我们可以将flite语音引擎的输出保存为MP3,WAV和WMA 格式在一个命令中:ffmpeg -f lavfi -i flite=textfile=speech.txt speech.mp3 speech.wav speech.wma我们还可以结合音频和视频格式,如果我们从视频输入格式指定音频格式,则只包含音频流,下一个示例中的文件clip.mp3只包含音频流:ffmpeg -i clip.avi clip.flv clip.mov clip.mp3 clip.mp4 clip.webm额外的媒体输入到filtergraph默认情况下,在任何具有-i选项的过滤器之前指定输入文件,并且第一个输入在带有[in]链接标签的过滤器图中可用。 如果我们想要过滤额外的文件,我们可以使用amovie来源作为视频文件的音频和电影来源,它们在表格中描述:描述从媒体(电影)容器读取音频和/或视频流。 必需参数是媒体文件的文件名,可选键=值对由冒号分隔语法movie=video_name[:options]amovie=audio_name[:options]Available key = 值选项参数中的值对f, format_name视频容器或输入设备的格式,如果未指定,则从扩展名确定或者探测loop按顺序读取数据流的次数,如果为-1,则选择最佳视频(具有amovie的音频)数据流sp, seek_point以秒为单位查找点,如果设置,则输入从给定时间开始s, streams- 要选择的流,用+符号指定多个流,顺序很重要- 特殊名称dv(电影)和da(amovie)指定默认(最佳)视频/音频流- 第一章介绍了如何指定特定流的语法si, stream_index要读取的流的索引,如果为-1,则选择最佳流,这是默认值(不建议使用,s参数为首选)例如,要在输入视频上显示徽标,我们可以使用以下命令:ffmpeg -i video.mpg -vf movie=logo.png[a];[in][a]overlay video1.mp4我的测试命令:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf "movie=/Users/zhangfangtao/Desktop/fruit.jpg[a];[in][a]overlay" /Users/zhangfangtao/Desktop/test3.mp4*显示效果(logo太大了,把视频盖住了):例如,sp(seek_point)选项设置为5时,徽标将从开始5秒后显示:ffmpeg -i video.mpg -vf movie=logo.png:sp=5[a];[in][a]overlay video1.mp4我的测试命令:ffmpeg -i /Users/zhangfangtao/Desktop/001.mp4 -vf "movie=/Users/zhangfangtao/Desktop/fruit.jpg:sp=0[a];[in][a]overlay" /Users/zhangfangtao/Desktop/test3.mp4报错: