23.先进的技术点

加入音频和视频文件

有几种加入媒体文件,它们在表格中描述:

23.先进的技术点 - 图1

类型 描述 针对音频 针对视频
级联 编码文件一个接一个; 第一个结束,第二个开始 Yes Yes
合并 将所有音频流编码为一个,例如2个单声道到1个立体声 Yes No
混合 将2个或更多音频通道编码为1,音量可以调节 Yes No
多路复用 (mux) 将2个或更多文件编码为1,例如1个音频和1个视频文件,如果存在更多相同类型的流,则选择是在用户 Yes Yes
覆盖/画中画 (PiP) 2个或更多视频一次显示在另一个旁边或一个在另一个之上 No Yes

连接与shell命令

媒体文件连接的先决条件

特殊文件格式 连接只能是某些文件格式: 音频- MP3(第2个文件的头将消失),未压缩的像WAV, PCM,等视频- MPEG-1, MPEG-2 TS, DV
格式的一致性 所有连接的文件都是相同的格式,这意味着可以加入2个MP3文件,但1个带有1个WAV的MP3不能
流的一致性 所有连接文件: - 包含相同数量的每种类型的流。 - 音频流使用相同的编解码器,采样率和通道布局 - 视频流使用相同的分辨率
为符合此要求,通常需要转换输入文件,使用-q 1或类似选项来保持初始质量,详细信息请参阅格式间转换

在Windows上,我们可以使用带有/B标志的复制命令来指示二进制模式,在文件之间必须是一个加号。连接N文件的复制命令的一般形式是:

  1. copy /B file1+file2+...+fileN-1+fileN outputFile

例如,连接文件videoclip1。mpg和videoclip2。mpg到文件视频。mpg,我们可以使用以下命令:

  1. copy /B videoclip1.mpg+videoclip2.mpg video.mpg

在Linux、Unix和OS X上,我们可以在表单中使用cat命令:cat file1 files2 > file3,因此我们可以修改前面的例子:

  1. cat videoclip1.mpg videoclip2.mpg > video.mpg

链接concat协议

另一种选择是使用concat协议,先决条件类似于复制命令。例如,要使用该协议修改前面的示例,我们可以使用以下命令:

  1. ffmpeg -i concat:&##34;videoclip1.mpg|videoclip2.mpg&##34; -c copy video.mpg

我的测试命令:

  1. ffmpeg -i concat:&##34;/Users/zhangfangtao/Desktop/test.mp4|/Users/zhangfangtao/Desktop/test2.mp4&##34; -c copy /Users/zhangfangtao/Desktop/test3.mp4
  • 显示效果:

生成了一个新的视频,不过我感觉这个视频和test1没有什么差别。

连接concat过滤器

用于音频和视频拼接的特殊过滤器是在表中描述的concat过滤器:

23.先进的技术点 - 图2

描述 连接音频和视频文件一个接一个。该过滤器适用于同步视频和音频流的片段(文件),其中所有片段必须具有相同数量的每种类型的流,例如1个音频和1个视频,或2个音频和1个视频,等等
语法 concat=a=a_streams:v=v_streams:n=segments[:unsafe] 所有的参数都是可选的
参数的描述
a 输出音频流的数量,默认值为0
n 段数,默认值为2
unsafe 安全模式激活,如果设置,连接将不会以不同格式的片段失败
v 输出视频流的数量,默认值为1

适当筛选结果的先决条件:

  • 所有段必须从时间戳0开始。

  • 相应的流必须在所有段中使用相同的参数,特别是视频大小。

  • 建议是相同的帧速率,否则输出将使用可变帧速率。

    Concat filter可以加入各种格式,有些例子是:

  1. ffmpeg -i input1.avi -i input2.avi -filter_complex concat output.avi
  2. ffmpeg -i input1.avi -i input2.avi -filter_complex concat output.mp4
  3. ffmpeg -i input1.avi -i input2.mp4 -filter_complex concat output.webm
  4. ffmpeg -i input1.avi -i input2.mp4 -i input3.mkv -filter_complex ^ concat=n=3 output.flv
  5. ffmpeg -i input1.avi -i input2.avi -i input3.avi -i input4.avi ^ -filter_complex concat=n=4 output.mp4
  6. f -i 1.avi -vf movie=2.avi[a];[in][a]concat a.mp4

我的测试命令如下:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -i /Users/zhangfangtao/Desktop/test3.mp4 -filter_complex concat /Users/zhangfangtao/Desktop/test4.mp4
  • 显示效果:

    生成了一个视频,里面包含前两段的是视频内容,不过,有效时长只是第一段视频的长度。后面有种无效的感觉。。。。

其他类型的拼接技术

移除掉logo

一些视频包含公司标志,通常位于左上角,常见示例是录制电视节目。 FFmpeg包含2个特殊滤镜以去除徽标,而最终效果并不总是完美,不过在许多情况下这种移除logo的技术还是可以接受的。

delogo过滤器

23.先进的技术点 - 图3

描述 通过对周围像素的简单插值来隐藏一个电视台的标志。用户设置一个覆盖该徽标的矩形,它通常会消失(但在某些情况下,标识更明显)。过滤器接受参数作为表单“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 该标志矩形的模糊边缘厚度,默认值为4
show 定位的参数,默认值为0,如果设置为1,屏幕上的绿色矩形显示为帮助查找正确的x、y、w和h参数

例如,我们首先从下图所示的800x600像素大小视频的右上角移除一个标志,我们通过显示一个绿色矩形的显示选项来估计logo的位置:

  1. ffmpeg -i eagles.mpg -vf delogo=x=700:y=0:w=100:h=50:t=3:show=1 nologo.mpg

现在我们可以精确地指定位置和标识的存在几乎是不可见的:

  1. ffmpeg -i eagles.mpg -vf delogo=x=730:y=0:w=70:h=46:t=1 nologo.mpg

23.先进的技术点 - 图4

我的测试命令如下(没有t参数,我这边不识别这个,报错):

  1. ffmpeg -i /Users/zhangfangtao/Desktop/ornage.jpeg -vf &##34;delogo=x=15:y=678:w=218:h=20:show=1&##34; /Users/zhangfangtao/Desktop/ornage2.jpeg
  • 显示效果(有没有看到一个绿色的框):

![](https://upload-images.jianshu.io/upload_images/661949-a0ad3a56291d8ab9.jpeg“ data-original-width=”1024” data-original-height=”742” data-original-format=”image/jpeg” data-original-filesize=”55790”/>

有没有看到一个绿色的框

  1. ffmpeg -i /Users/zhangfangtao/Desktop/ornage.jpeg -vf &##34;delogo=x=10:y=700:w=300:h=35&##34; /Users/zhangfangtao/Desktop/ornage3.jpeg
  • 显示效果(水印没了):

![](https://upload-images.jianshu.io/upload_images/661949-d6d8dc651a2e0a28.jpeg“ data-original-width=”1024” data-original-height=”742” data-original-format=”image/jpeg” data-original-filesize=”52368”/>

水印没了.jpeg

抖动视频部分的固定

没有三脚架或车辆拍摄的视频的一些部分通常包括抖动 - 水平和垂直移动的小变化,在某些情况下可以使用去抖滤波器进行修正:

23.先进的技术点 - 图5

描述 修正水平和垂直位移的小变化,当视频没有三脚架或移动车辆时有用
语法 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方向的最大运动范围,默认值为16
edge 指定如何生成像素来填充框架边缘的空白,值为从0到3的整数: 0 -在空白位置填充零 1 -原始图像在空白位置 2 -在空白位置的挤压边值 3 -镜像边缘在空白位置,默认值
blocksize 指定用于运动搜索的块大小,其值为4 - 128像素,默认值为8
contrast 指定块的对比度阈值。只有超过指定对比度的块(最黑和最轻的像素之间的区别)才会被考虑。该值来自范围1 - 255,默认值为125
search 指定搜索策略: 0 =彻底搜索,默认值 1 =不彻底搜索
filename 如果包含,则将动作搜索的详细日志写入指定的文件

参数可以按顺序进入默认顺序或以任何顺序指定名称:

  1. ffmpeg -i travel.avi -vf deshake fixed_travel.avi
  2. ffmpeg -i travel.avi -vf deshake=contrast=160 fixed.avi
  3. ffmpeg -i travel.avi -vf deshake=blocksize=4:filename=log.txt fixed.avi

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake /Users/zhangfangtao/Desktop/1527143198.mp4
  2. ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake=contrast=160 /Users/zhangfangtao/Desktop/1527143199.mp4
  3. ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake=blocksize=4:filename=/Users/zhangfangtao/Desktop/log.txt /Users/zhangfangtao/Desktop/1527143200.mp4
  • 显示效果:其实,我并没有看出来什么效果。。。可能我用手机拍的抖得太厉害了。。。

    第三条指令打印出来的txt信息截图如下:

23.先进的技术点 - 图6

log.txt

将颜色框添加到视频

使用drawbox,我们可以在矩形区域找到精确的坐标,以在其中搜索运动矢量,它用于除雾过滤器。 其他用途包括各种图表,方案等。

23.先进的技术点 - 图7

描述 在输入的选定区域绘制指定颜色和指定大小的框
语法 drawbox[=x:y:width:height:color:thickness]
参数的描述
color, c 格式0xRRGGBB[AA]中的标准颜色名称或十六进制值
height, h 框的高度,默认值为0
thickness, t 边框边缘的宽度以像素为单位,默认值为4
width, w 框的宽度,默认值为0
x, y 方框的左上角坐标,默认值为0

例如,要在SVGA大小的输入上添加一个尺寸为600x400像素的黄色框,其大小为左侧150像素和顶部0像素,我们可以使用以下命令:

  1. ffmpeg -i ship.avi -vf drawbox=x=150:w=600:h=400:c=yellow ship1.avi

23.先进的技术点 - 图8

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf drawbox=x=150:w=600:h=400:c=yellow /Users/zhangfangtao/Desktop/test3.mp4
  • 显示效果

23.先进的技术点 - 图9

检测帧数

如果您需要知道有多少帧包含您的视频文件,您可以使用以下命令:

  1. ffmpeg -i input.mpg -f null /dev/null

显示输出的最后两行是:

  1. frame= 250 fps=0.0 q=0.0 Lsize= 0kB time=00:00:10.00 bitrate= 0.0kbits/s
  2. video:16kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.000000%

帧数为250,表示视频帧的总数,也可以从帧速率和持续时间计算,但结果并不总是准确。

我的测试命如下:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -f null /dev/null
  • 显示效果如下:

23.先进的技术点 - 图10

检测广告,部分转换或损坏的编码

从电视,互联网等录制的较长视频可以包含带有广告,转场,不完整帧和其他不需要内容的短片。 如果此部分包含黑色框架,则可以使用表中描述的黑色检测过滤器检测它们。

23.先进的技术点 - 图11

Description 检测几乎全黑的视频部分,并输出包含检测到的黑色间隔的开始,结束和持续时间的行,以秒为单位表示。 如果日志级别设置为低于AV_LOG_INFO值,则不显示行
语法 blackdetect[=d=duration:pic_th=pbr_threshold:pix_th=px_threshold]

参数的描述(所有的参数都是可选的)

参数名称 单位 描述 默认值
black_min_duration, d 正浮点数确定视频中黑色帧的最小持续时间 2.0
picture_black_ratio_th, pic_th 浮点数在0到1.0之间 例如,如果帧大小为400x300(总共12万像素),12000像素不是黑色,那么这个比例是0.9 0.98
pixel_black_th, pix_th 浮点数在0到1.0之间 Treshold设置像素为黑色,它等于表达式: (absolute_threshold–luminance_minimum_value) luminance_range_size) 0.1

例如,要从源mptestsrc中检测黑帧,命令是(控制台输出如下):

  1. ffmpeg -f lavfi -i mptestsrc -vf blackdetect -f sdl &##39;test&##39;

23.先进的技术点 - 图12

我的测试命令:

  1. ffmpeg -f lavfi -i mptestsrc -vf blackdetect -f sdl &##39;test&##39;

*显示效果:

23.先进的技术点 - 图13

用黑帧过滤器进行检测

检测黑帧的另一个过滤器是表中描述的黑帧过滤器:

23.先进的技术点 - 图14

描述 检测几乎为黑色的帧,并输出包含: - 检测帧的帧数 - 黑色部分的百分比 - 如果已知则在文件中定位,否则为-1 - 时间戳
语法 blackframe[=amount:[treshold]] 所有的参数都是可选的
参数
amount 在阈值下的像素百分比,默认值为98
threshold 下面是被认为是黑色的像素,默认值是32

过滤器blackdetectblackframe类似,但每个显示不同的信息。 图像上显示使用与黑检测滤镜相同的视频源的黑帧滤镜输出:

  1. ffmpeg -f lavfi -i mptestsrc -vf blackframe -f sdl &##39;test&##39;

23.先进的技术点 - 图15

我的测试命令如下:

  1. ffmpeg -f lavfi -i mptestsrc -vf blackframe -f sdl &##39;test&##39;
  • 显示效果:

23.先进的技术点 - 图16

只选择指定的帧进行输出

特殊的多媒体过滤器可以选择音频并选择视频启用,以精确指定哪些帧将保留,哪些从输出中排除。

23.先进的技术点 - 图17

描述 选择输出帧,对每个输入帧评估表达式,如果表达式的值不为零,则选择帧,否则跳过帧
语法 select=expression expression默认值是1
可用的参数
n 从0开始的过滤帧的连续编号
selected_n 所选帧的序号,从0开始
prev_selected_n 如果未定义,则最后一个选定帧的序列号为NAN
TB 输入时间戳的时基
pts 如果NAN未定义,那么经过滤波的视频帧的PTS(表示时间戳)以TB为单位表示
t 如果NAN未定义,则滤波的视频帧的PTS以秒表示
prev_pts 先前过滤的视频帧的PTS,如果未定义则为NAN
prev_selected_pts 如果NAN未定义,则最后一个先前过滤的视频帧的PTS
prev_selected_t 如果NAN未定义,则最后选择的最后一个视频帧的PTS
start_pts 如果NAN未定义,视频中第一个视频帧的PTS
start_t 如果NAN未定义,第一个视频帧的时间在视频中
pict_type (只局限在视频中) 过滤帧的类型,可以采用以下值之一: I …帧内预测帧, P … 前向预测帧, B …双向预测帧, S …交换帧,SI …切换I帧,SP …切换P帧,BI …特殊帧内帧,不是关键帧(VC-1视频编解码器)
interlace_type (只局限在视频中) 帧间型,可采用下列值之一: PROGRESSIVE, TOPFIRST, BOTTOMFIRST
PROGRESSIVE 帧是渐进的(不是交错的)
TOPFIRST 帧是top-field-first
BOTTOMFIRST 帧是bottom-field-first
key 如果经过筛选的帧是一个关键帧,否则为0
pos 如果信息不可用(例如合成视频),在过滤帧的文件中位置为-1
scene (仅局限于视频) 0和1之间的值表示一个新的场景;低值反映了当前帧引入新场景的低概率,而更高的值意味着当前帧更可能是一个
consumed_sample_n 在当前帧之前选择的样本数目
samples_n 当前帧中的样本数目
sample_rate 输入采样率

由于select表达式的默认值为1,因此选择过滤器使用的接下来的两个示例会产生相同的结果 - 所有帧将被选择为输出(值如果是0将不会选择任何内容):

  1. ffmpeg -i input.avi -vf select output.avi
  2. ffmpeg -i input.avi -vf select=1 output.avi

我的测试命令如下:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select /Users/zhangfangtao/Desktop/test3.mp4
  2. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=1 /Users/zhangfangtao/Desktop/test3.mp4
  3. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=0 /Users/zhangfangtao/Desktop/test3.mp4
  • 实现效果,前两个命令生成的是和原来一样的视频,最后一个命令,只有音频信息,没有界面。

要选择20到25秒的部分,我们可以使用以下命令:

  1. ffmpeg -i input.avi -vf select=&##34;gte(t\,20)*lte(t\,25)&##34; output.avi

我的测试命令如下:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=&##34;gte\(t\,20\)*lte\(t\,25\)&##34; /Users/zhangfangtao/Desktop/test3.mp4
  • 实现效果:

    时间的限制不是太准确,,,还是从头给我播放到了最后。。。

若要选择帧内仅为输出,我们可以使用以下命令:

  1. ffmpeg -i input.avi -vf select=&##34;eq(pict_type\,I)&##34; output.avi

我的测试命令如下:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=&##34;eq\(pict_type\,I\)&##34; /Users/zhangfangtao/Desktop/test3.mp4
  • 实现的结果:

    视频长短没有变,但是视频的大小几乎减少了一半。而且视频少了很多细节。

通过改变纵横比来缩放输入

调整和伸缩视频章节描述了缩放视频帧的缩放过滤器。 另一种方法是使用改变显示宽高比DAR和样本宽高比SAR的setdar和setsar滤波器,它们的关系用公式表示(关于宽高比的细节在词汇表中):

  1. DAR = width/height * SAR

23.先进的技术点 - 图18

描述 setdar过滤器设置显示纵横比和setsar的样本纵横比
语法 setdar[=r=aspect_ratio[:max=number]] setdar[=aspect_ratio[:number]]
参数的描述
r, ratio 纵横比,值可以是浮点数或表达式,默认值为0
max 在将纵横比设为一个有理数时,表示分子和分母的最大整数值,默认值为100

示例如何使用setdar和setsar过滤器:

  1. ffplay -i input.avi -vf setdar=r=16/9
  2. ffplay -i input.avi -vf setdar=16/9
  3. ffplay -i input.avi -vf setsar=r=1.234
  4. ffplay -i input.avi -vf setsar=1.234

我的测试命令如下:

  1. ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setdar=r=16/9
  2. ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setdar=16/9
  3. ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setsar=r=1.234
  4. ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setsar=1.234
  • 显示效果如下:

23.先进的技术点 - 图19

屏幕抓取

为了将显示输出记录到视频文件中,例如创建一个教程,我们可以使用安装了UScreenCapture直接显示源过滤器的dshow输入设备,下面是下载地址。

http://www.umediaserver.net/bin/UScreenCapture.zip

为了抓取全屏内容,我们可以使用以下命令:

  1. ffmpeg -f dshow -i video=&##34;UScreenCapture&##34; -t 60 screen.mp4

如果我们想抓取一个特定的屏幕区域。我们必须使用regedit Windows工具来修改某些注册表项,相信信息在downloaded UScreenCapture.zip文件里面的README文件里面。

因为我用的MAC电脑,所以我的录屏命令如下:

  1. ffmpeg -f avfoundation -r 30 -i &##34;1:0&##34; -t 20 /Users/zhangfangtao/Desktop/test2.mp4
  • 显示效果如下:

23.先进的技术点 - 图20

视频帧的详细信息

为了显示每个视频帧的信息,我们可以使用表格中描述的showinfo过滤器:

23.先进的技术点 - 图21

描述 显示包含有关每个输入视频帧信息的行,数据采用键:值对的形式。 该过滤器没有参数,应与-report选项一起使用
语法 -vf showinfo
显示参数的描述
n 输入框的序号,从0开始
pts 输入框的表示时间戳,表示为若干时间基单元;时间基单元依赖于过滤器输入板
pts_time 输入框的表示时间戳,表示为若干秒
pos 输入流中帧的位置,如果该信息不可用或没有意义(例如在合成视频中)
fmt 像素格式名称
sar 输入帧的采样宽高比,以分子/分母的形式表示
s 输入框的大小,以宽*长的形式表示
i 隔行扫描模式:P表示渐进式,T表示前场第一,B表示后场第一
iskey 如果该帧是关键帧,则为1,否则为0
type 输入帧的图像类型:I代表I帧,P代表P帧,B代表B帧,? 对于未知类型(更多的信息见AVPictureType枚举的文档)
checksum 输入帧的所有平面的Adler-32校验和(十六进制)
plane_checksum 输入帧的每个平面的Adler-32校验和(十六进制),表示形式为[c0 c1 c2 c3]

例如,下一个命令会生成下面打印的信息,其中包括前三行:

  1. ffmpeg -report -f lavfi -i testsrc -vf showinfo -t 10 showinfo.mpg
  2. n: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]
  3. 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]
  4. 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]

我的测试命令如下:

  1. ffmpeg -report -f lavfi -i testsrc -vf showinfo -t 10 /Users/zhangfangtao/Desktop/test.mp4
  • 显示效果:

23.先进的技术点 - 图22

23.先进的技术点 - 图23

音频频谱

为了使音频频谱可视化,我们可以使用表中描述的示波器滤波器:

23.先进的技术点 - 图24

描述 将音频输入转换为视频输出
语法 showspectrum[=s=widthxheight[:slide=number]]
参数的描述
size, s 输出视频大小,默认值为640x480
slide 设置频谱是否沿窗口滑动,默认值为0

例如,下面的图片显示了该命令创建的声谱:

  1. ffmpeg -i audio.mp3 -vf showspectrum audio_spectrum.mp4

23.先进的技术点 - 图25

我的测试命令如下:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/DYZDJ.mp3 -lavfi showspectrum /Users/zhangfangtao/Desktop/test3.mp4
  • 效果图

23.先进的技术点 - 图26

音频波形可视化

描述 将输入音频转换为包含音频波表示的视频
语法 showwaves[=n=number[:r=rate[:s=video_size]]]
参数的描述
n 打印在同一列上的样本数量越大,数值越大会降低帧速率,因此不能与速率参数结合使用
rate, r 帧速率,默认值为25,不能与n参数组合使用
size, s 视频大小,默认值是640x480

来自音频输入的波形可以通过表格中描述的showwaves滤波器进行可视化:

23.先进的技术点 - 图27

描述 将输入音频转换为包含音频波表示的视频
语法 showwaves[=n=number[:r=rate[:s=video_size]]]
参数的描述
n 打印在同一列上的样本数量越大,数值越大会降低帧速率,因此不能与速率参数结合使用
rate, r 帧速率,默认值为25,不能与n参数组合使用
size, s 视频大小,默认值是640x480

例如,要将music.mp3文件中的波形可视化为waves.mp4文件,我们可以使用以下命令:

  1. ffmpeg -i music.mp3 -vf showwaves waves.mp4

23.先进的技术点 - 图28

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/NWDSL.mp3 -lavfi showwaves /Users/zhangfangtao/Desktop/test3.mp4
  • 显示效果如图:

23.先进的技术点 - 图29

语音合成

通过包含libflite外部库,人声可以与来自Flite(Festival Lite)(一种小型可嵌入TTS(文本到语音)引擎)的flite音频源合成。 它由美国卡内基梅隆大学CMU Speech Group开发。 Flite完全用C语言编写,重新实现了音乐节体系结构的核心部分,以实现为每个系统设计的声音之间的兼容性。 爱丁堡大学的节日语音合成系统是构建语音合成系统的框架。 有关Flite的更多详细信息,请访问http://www.speech.cs.cmu.edu/flite

23.先进的技术点 - 图30

描述 由于其大尺寸,使用未包含在官方Windows二进制文件中的libflite库来合成具有选定语音类型的人类语音
语法 flite=&##34;text&##34;[:v=voice[:n=n_samples]] flite=textfile=filename[:v=voice[:n=n_samples]]
参数的描述
list_voices 如果设置为1,则显示可用语音列表
n, nb_samples 每帧最大采样数,默认值为512
text 演讲的源文本
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用户可以编译它们)。 要显示可用语音列表,我们可以使用以下命令:

  1. ffmpeg -f lavfi -i flite=list_voices=1

要让计算机使用女性声音从Message.txt文件中读取文本,该命令为:

  1. ffplay -f lavfi -i flite=textfile=Message.txt:v=slt

例如,要将文字“Happy New Year to all”保存到wish.wav文件中,我们可以使用以下命令:

  1. ffmpeg -f lavfi -i flite=text=&##34;Happy New Year to all&##34;:v=kal16 wish.wav

如果我们想减慢讲话速度以获得更好的听力,我们可以使用以下命令:

  1. ffmpeg -f lavfi -i flite=textfile=text.txt -af atempo=0.5 speech.mp3

一次将输出保存为多种格式

虽然从第一章中解释的命令语法可以清楚看出,但我们可以通过一个命令将处理结果保存为多种格式,例如我们可以将flite语音引擎的输出保存为MP3,WAV和WMA 格式在一个命令中:

  1. ffmpeg -f lavfi -i flite=textfile=speech.txt speech.mp3 speech.wav speech.wma

我们还可以结合音频和视频格式,如果我们从视频输入格式指定音频格式,则只包含音频流,下一个示例中的文件clip.mp3只包含音频流:

  1. ffmpeg -i clip.avi clip.flv clip.mov clip.mp3 clip.mp4 clip.webm

23.先进的技术点 - 图31

额外的媒体输入到filtergraph

默认情况下,在任何具有-i选项的过滤器之前指定输入文件,并且第一个输入在带有[in]链接标签的过滤器图中可用。 如果我们想要过滤额外的文件,我们可以使用amovie来源作为视频文件的音频和电影来源,它们在表格中描述:

23.先进的技术点 - 图32

描述 从媒体(电影)容器读取音频和/或视频流。 必需参数是媒体文件的文件名,可选键=值对由冒号分隔
语法 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参数为首选)

例如,要在输入视频上显示徽标,我们可以使用以下命令:

  1. ffmpeg -i video.mpg -vf movie=logo.png[a];[in][a]overlay video1.mp4

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf &##34;movie=/Users/zhangfangtao/Desktop/fruit.jpg[a];[in][a]overlay&##34; /Users/zhangfangtao/Desktop/test3.mp4

*显示效果(logo太大了,把视频盖住了):

23.先进的技术点 - 图33

例如,sp(seek_point)选项设置为5时,徽标将从开始5秒后显示:

  1. ffmpeg -i video.mpg -vf movie=logo.png:sp=5[a];[in][a]overlay video1.mp4

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/001.mp4 -vf &##34;movie=/Users/zhangfangtao/Desktop/fruit.jpg:sp=0[a];[in][a]overlay&##34; /Users/zhangfangtao/Desktop/test3.mp4
  • 报错:

23.先进的技术点 - 图34