FFmpeg常用命令行讲解及实战一(二)https://developer.aliyun.com/article/1472391
3、音频选项
①、主要命令选项
-aframes number (output)
:设置 number 音频帧输出,是 -frames:a 的别名。-ar[:stream_specifier] freq (input/output,per-stream)
:设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者 raw 数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。-aq q (output)
:设置音频品质(编码指定为 VBR),它是 -q:a 的别名。
quality settings (VBR)
- -aq 4 = 128 kb/s
- -aq 5 = 160 kb/s
- -aq 6 = 192 kb/s
- -aq 7 = 224 kb/s
- -aq 8 = 256 kb/s
-ac[:stream_specifier] channels (input/output,per-stream)
:设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者 raw 数据分离出并映射的通道才有效。-an (output)
:禁止输出音频。-acode codec (input/output)
:设置音频解码/编码的编/解码器,是 -codec:a 的别名。
②、举例
下面命令的功能是从输入视频文件中提取音频流,并截取前 180 帧音频。然后使用 libmp3lame 编码器将截取的音频压缩为 MP3 格式。输出音频是立体声,采样率为 48000Hz。最后,将处理后的音频保存为 FLV 格式的文件。
ffmpeg -i SampleVideo_1280x720_20mb.mp4 -vn -aframes 180 -acodec libmp3lame -ac 2 -ar 48000 -y SampleVideo-testflv.flv
使用 MediaInfo 对其进行分析:
4、字幕选项
字幕格式包括:srt
,ass
,ssa
,…
①、主要命令选项
-scodec codec(input/output)
:设置字幕解码器,是 -codec:s 的别名。-sn (output)
:禁止输出字幕。
②、举例
1)将字幕加入视频中
新建一个 test.srt
文件,文件格式为 UTF-8,将下面内容复制进去,并进行保存
1 00:00:00,009 --> 00:00:03,490 这是一个字幕测试案例 2 00:00:05,619 --> 00:00:07,420 我们将从这个例子中 3 00:00:09,549--> 00:00:12,170 学会如何向视频中添加字幕
下面命令的功能是将输入视频文件与指定的字幕文件进行合并,生成一个包含字幕的新视频文件。通过使用 -vf subtitles=test.srt 选项,该命令将输入视频的图像流与字幕文件中的文字内容进行合成,生成一个带有字幕的输出视频文件 “test.mp4”。
ffmpeg -i SampleVideo_1280x720_20mb.mp4 -vf subtitles=test.srt -y test.mp4
使用 MediaInfo 对其进行分析,这里只有音频流和视频流,无字幕流
注意:这里没有字幕流的原因是我们使用的是 -vf 视频过滤器,因此将字幕直接打到视频流里面了
打开 test.mp4 文件我们可以看到字幕:
2)字幕格式转换
MP4 支持的字幕格式主要有两种常见的格式:SRT(SubRip Subtitle)和VTT(WebVTT Subtitle)
MKV(Matroska Video)是一种开放的多媒体容器格式,支持多种字幕格式,其中包括:SRT(SubRip Subtitle)、VobSub(.sub/.idx)、SSA/ASS(SubStation Alpha)、PGS(Presentation Graphic Stream)等。
srt 格式字幕转换成 ass 格式命令:
ffmpeg -i test.srt test.ass
回显信息:
PS D:\Work\test> ffmpeg -i test.srt test.ass ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Input #0, srt, from 'test.srt': Duration: N/A, bitrate: N/A Stream #0:0: Subtitle: subrip Output #0, ass, to 'test.ass': Metadata: encoder : Lavf60.3.100 Stream #0:0: Subtitle: ass Metadata: encoder : Lavc60.3.100 ssa Stream mapping: Stream #0:0 -> #0:0 (subrip (srt) -> ass (ssa)) Press [q] to stop, [?] for help size= 1kB time=00:00:09.55 bitrate= 0.7kbits/s speed=6.23e+03x video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:1kB muxing overhead: 450.980377%
生成的 test.ass 文件内容如下:
[Script Info] ; Script generated by FFmpeg/Lavc60.3.100 ScriptType: v4.00+ PlayResX: 384 PlayResY: 288 ScaledBorderAndShadow: yes YCbCr Matrix: None [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1 [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.01,0:00:03.49,Default,,0,0,0,,这是一个字幕测试案例 Dialogue: 0,0:00:05.62,0:00:07.42,Default,,0,0,0,,我们将从这个例子中 Dialogue: 0,0:00:09.55,0:00:12.17,Default,,0,0,0,,学会如何向视频中添加字幕
下面命令使用 FFmpeg 工具进行视频转码和字幕添加的操作。
ffmpeg -i SampleVideo_1280x720_20mb.mp4 -i test.ass -c copy -y SampleVideo-testmvk.mkv
使用 MediaInfo 对其进行分析,这里有三路流:音频流、视频流和字幕流
3)提取字幕
下面命令式将输入文件 “SampleVideo-testmvk.mkv” 中的音频和视频流去掉,然后将子标题提取出来,保存为 SRT 格式的 “output-sub1.srt” 文件。
ffmpeg -i SampleVideo-testmvk.mkv -an -vn -scodec srt output-sub1.srt
提取后的信息用 notepad++ 查看:
下面这个命令的主要功能是从 “output1002.mkv” 文件中提取字幕信息,并将这些信息保存为 ASS 格式的字幕文件 “output-sub1.ass”
ffmpeg -i SampleVideo-testmvk.mkv -an -vn -scodec ass -y output-sub1.ass
提取后的信息用 notepad++ 查看:
下面这个命令的主要目的是将 “SampleVideo_1280x720_20mb.mp4” 视频文件和 “test.ass” 字幕文件合并。它将保持音频流的原始格式,并指定视频流编码格式为 libx264,并将字幕直接添加到视频中,然后将结果保存为 “output1002.mkv” 文件
ffmpeg -i SampleVideo_1280x720_20mb.mp4 -i test.ass -c copy -c:v libx264 -y output1002.mkv
使用 MediaInfo 对其进行分析,这里有三路流:音频流、视频流和字幕流,并且视频流的格式为 AVC
三、FFmpeg 命令示例
上面已经对相关的 FFmepg 选项进行了详细的讲解及演示,下面仅做个总结但不进行演示了
1、转换格式(封装格式的转化)
①、下面命令将从 input_test.mp4 中提取音频流,并将其直接复制到 output_test.flv 中,而不进行任何重新编码。这可以用来分离音频流或将音频从一个容器格式转换为另一个容器格式,而无需对音频进行重新编码。
ffmpeg -i input_test.mp4 -vn -acodec copy output_test.flv
②、下面命令将从 input_test.aac 中提取音频流,并将其直接复制到 output_test.mp3 中,而不进行任何重新编码。这可以用来将 AAC 格式的音频转换为 MP3 格式,而无需对音频进行重新编码。请注意,如果输入文件的音频编码不支持 MP3 格式,或者输出文件的扩展名不适用于 MP3 格式,那么该命令可能会失败
。
ffmpeg -i input_test.aac -vn -acodec copy output_test.mp3
2、抽取画面中的音频
①、下面命令将从 input_test.mp4 中提取音频流,并将其直接复制到 output_test.aac 中,而不进行任何重新编码。
ffmpeg -i input_test.mp4 -vn -y -acodec copy output_test.aac
②、下面命令将从 input_test.mp4 中提取音频流,并将其直接复制到 output_test.mp3 中,而不进行任何重新编码。请注意,如果输入文件的音频编码不支持 MP3 格式,或者输出文件的扩展名不适用于 MP3 格式,那么该命令可能会失败
。
ffmpeg -i input_test.mp4 -vn -y -acodec copy output_test.mp3
③、audio:aac —> mp3(想从 mp4 文件中提取音频并输出为 mp3 格式可以参考以下步骤)
下面命令的作用是将输入文件 input_test.mp4 进行转码,并将其视频流直接复制到输出文件 output_test.flv 中,而音频流将使用 libmp3lame 编码器进行重新编码为 MP3 格式。
ffmpeg -i input_test.mp4 -vcodec copy -acodec libmp3lame -y output_test.flv
该命令从 output_test.flv 中提取音频流,并将其直接复制到 output_test.mp3 中,而不进行任何重新编码。
ffmpeg -i output_test.flv -vn -acodec copy -y output_test.mp3
因此可总结如下:
- 输出 mp3 格式的音频文件必须输入文件是 mp3 编码的音频流
- 输出 aac 格式的音频文件必须输入文件是 aac 编码的音频流
3、抽取画面中的视频
该命令将从 input_test.mp4 中提取视频流,并将其直接复制到 output_test.avi 中,而不进行任何重新编码。
ffmpeg -i input_test.mp4 -vcodec copy -an output_test.avi
4、音频+视频合成
下面命令将合并 input_test_1.mp4 和 input_test_2.mp3 两个输入文件,将视频流和音频流直接复制到输出文件 output_test.mp4 中,而不进行任何重新编码。
ffmpeg -i input_test_1.mp4 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp4
下面命令将输入的视频文件 input_test_1.mp4 和音频文件 input_test_2.mp3 进行处理,并将它们合并成一个单独的 MP4 文件 output_test.mp4。视频流和音频流都会被直接复制到输出文件中,而不会进行重新编码。在输出文件中,第一个输入文件的视频将在 10 秒后开始播放或处理。
ffmpeg -i input_test_1.mp4 -itsoffset 10 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp4
下面命令将输入的视频文件 input_test_1.mp4 的第 20 秒开始的 5 秒内容与音频文件 input_test_2.aac 进行处理,并将它们合并成一个单独的 MP4 文件 output_test.mp4。视频流和音频流都会被直接复制到输出文件中,而不会进行重新编码。输出文件中只包含输入文件指定的时间范围内的内容。
ffmpeg -ss 20 -t 5 -i input_test_1.mp4 -i input_test_2.aac -vcodec copy -acodec copy output_test.mp4
5、音频+音频合成
下面命令将输入的两个音频文件 input_test_1.mp3 和 input_test_2.mp3 进行混音处理,并将它们合并成一个单独的 MP3 文件 output_test.mp3。输出文件的音频时长将与两个输入文件中最短的音频时长相匹配,通过使用 amix 过滤器来实现混音操作。
ffmpeg -i input_test_1.mp3 -i input_test_2.mp3 -filter_complex amix=inputs=2:duration=shortest output_test.mp3
-filter_complex amix=inputs=2:duration=shortest
:这个选项用于指定复杂的音频过滤器图表。在这个例子中,使用了 amix 过滤器,它将两个输入的音频混合为一个输出。inputs=2 表示有两个输入,duration=shortest 表示输出的音频时长将与最短输入的时长相匹配。
下面命令将输入的两个音频文件 input_test_1.mp3 和 input_test_2.mp3 进行混音处理,并将它们合并成一个单独的 MP3 文件 output_test.mp3。输出文件的音频时长将与两个输入文件中最长的音频时长相匹配,通过使用 amix 过滤器来实现混音操作。
ffmpeg -i input_test_1.mp3 -i input_test_2.mp3 -filter_complex amix=inputs=2:duration=longest output_test.mp3
下面命令将输入的两个音频文件 input_test_1.mp3 和 input_test_2.mp3 进行复制处理,并将它们合并成一个单独的 MP3 文件 output_test.mp3。输出文件的音频编码格式和质量与输入文件完全相同,因为使用了 -acodec copy 选项来进行直接复制。由于输入是音频文件,所以 -vcodec copy 选项实际上没有影响。
ffmpeg -i input_test_1.mp3 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp3
下面命令将输入的三个音频文件(INPUT1、INPUT2 和 INPUT3)进行混音处理,并将它们合并成一个单独的输出文件。输出文件的音频时长将与第一个输入文件的时长相匹配,通过使用 amix 过滤器来实现混音操作。在混音转换时,过渡时间为 3 秒。
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
-filter_complex amix=inputs=3:duration=first:dropout_transition=3
:这个选项用于指定复杂的音频过滤器图表。在这个例子中,使用了 amix 过滤器,它将三个输入的音频混合为一个输出。inputs=3 表示有三个输入,duration=first 表示输出的音频时长将与第一个输入的时长相匹配。dropout_transition=3 表示在混音转换时的过渡时间为 3 秒。
6、视频分离成图片
下面命令从输入的视频文件 input_test.mp4 中提取帧,并以每秒一帧的速率保存为 JPEG 图像文件。输出的图像文件将以 output_image-001.jpeg、output_image-002.jpeg 等命名,表示提取的帧的顺序。
ffmpeg -i input_test.mp4 -r 1 -f image2 output_image-%03d.jpeg
7、图片合成视频
下面命令将一系列图像文件(例如 output_image-001.jpeg、output_image-002.jpeg 等)作为输入,使用 FFmpeg 工具将它们合并为一个视频文件 output_test.mp4。输入的图像文件按照帧的顺序进行读取,并转换为视频格式进行合并。输出文件的格式是 MP4。
ffmpeg -f image2 -i output_image-%03d.jpeg output_test.mp4
8、改变音量大小
下面命令将输入的音频文件 input_test.mp3 进行音量调整处理,将音量调整为原来的一半,并生成一个输出的 MP3 文件 output_test.mp3。这里使用了 -af 选项来指定音频过滤器,并设置了 volume 过滤器来实现音量调整。
ffmpeg -i input_test.mp3 -af 'volume=0.5' output_test.mp3
9、音效淡入淡出效果
下面命令将输入的音频文件 input_test.mp3 应用渐入效果处理,从音频的起始位置开始,在 4 秒的时间内逐渐增加音量,并生成一个输出的 MP3 文件 output_test.mp3。渐入效果由 -filter_complex 选项指定的 afade 过滤器实现。
ffmpeg -i input_test.mp3 -filter_complex afade=t=in:ss=0:d=4 output_test.mp3
-filter_complex afade=t=in:ss=0:d=4
:这个选项用于指定复杂的音频过滤器图表。在这个例子中,使用了 afade 过滤器来实现渐入效果。t=in 表示渐入效果,ss=0 表示从音频的起始位置开始应用渐入,d=4 表示渐入的持续时间为 4 秒。
10、截取音频
下面命令从输入的音频文件 input_test.mp3 中剪切出从第 10 秒到第 20 秒的部分,并生成一个输出的 MP3 文件 output_test.mp3。剪切操作由 -ss 和 -to 选项指定的时间范围来控制。通过使用 -vn 选项,视频流被忽略,只处理音频流。使用 -acodec copy 选项可以直接复制输入音频的编码格式,而不进行重新编码。
ffmpeg -ss 10 -i input_test.mp3 -to 20 -vn -acodec copy output_test.mp3
11、容器时长获取
下面命令使用 FFprobe 工具对输入的音频文件 input_test.mp3 进行分析,仅输出该文件的持续时间(时长)。输出的持续时间以秒为单位。通过设置 -v error 选项,只输出错误信息,并使用 -of 选项设置输出格式。
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i input_test.mp3
-v error
:这个选项用于设置错误日志的输出级别为错误级别。-v error 表示只输出错误信息,不输出其他信息。-show_entries format=duration
:这个选项用于指定要显示的信息条目。在这个例子中,使用 format=duration 表示要显示输入文件的持续时间。-of default=noprint_wrappers=1:nokey=1
:这个选项用于设置输出格式。-of default 表示使用默认输出格式,noprint_wrappers=1 表示不打印包装器,nokey=1 表示不打印键名,只输出值。
12、网络资源下载
下面命令使用 FFmpeg 工具从指定的 URL 下载音频文件,并将其保存为 MP3 格式的输出文件 output_test.mp3。通过使用 -c copy选项,输入文件的编码格式将直接复制到输出文件中,而不进行重新编码。使用 -f mp3 选项指定输出文件的格式为 MP3。请注意,https://xxx.xxx.xxxxxx应替换为实际的音频文件的网络地址。
ffmpeg -i https://xxx.xxx.xxxxxx -c copy -f mp3 output_test.mp3
13、播放音频视频
播放 input_test.mp3 文件
ffplay input_test.mp3
14、图片生成 gif 动图
下面命令将一系列图像文件(例如 input_image_001.png、input_image_002.png 等)作为输入,使用 FFmpeg 工具将它们转换为一个 GIF 动画文件 output_test.gif。输入的图像文件按照帧的顺序进行读取,并根据指定的帧率生成 GIF 动画。输出文件的格式是 GIF。
ffmpeg -i input_image_%03d.png -r 5 output_test.gif
-ar 44100
:这个选项用于指定输出音频的采样率。在这个例子中,-ar 44100 表示输出音频的采样率为 44100 Hz。-ac 2
:这个选项用于指定输出音频的通道数。在这个例子中,-ac 2 表示输出音频的通道数为 2,即立体声。-f s16le
:这个选项用于指定输出音频的格式。-f s16le 表示输出音频以 16 位有符号整数的 PCM 格式进行保存。
15、抽取 PCM 数据
下面命令从输入的视频文件 input_test.mp4 中提取音频,并将其保存为 PCM 格式的音频文件 output_test.pcm。通过使用 -vn 选项,视频流被忽略,只处理音频流。使用 -ar 选项指定输出音频的采样率,-ac 选项指定输出音频的通道数,-f 选项指定输出音频的格式为 16 位有符号整数的 PCM。
ffmpeg -i input_test.mp4 -vn -ar 44100 -ac 2 -f s16le output_test.pcm
下面命令使用 ffplay 命令行工具播放 PCM 格式的音频文件 output_test.pcm。通过设置 -ar 选项,指定音频的采样率为 44100 Hz,-ac 选项指定音频的通道数为 2(立体声),-f 选项指定输入音频的格式为 16 位有符号整数的 PCM。
ffplay -ar 44100 -ac 2 -f s16le output_test.pcm