FFmpeg常用命令行讲解及实战一(三)

简介: FFmpeg常用命令行讲解及实战一

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、字幕选项

字幕格式包括:srtassssa,…

①、主要命令选项

  • -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
目录
相关文章
|
1月前
|
XML 编解码 JSON
FFmpeg常用命令讲解及实战二(2)
FFmpeg常用命令讲解及实战二
25 0
|
28天前
|
存储 数据处理 API
ffmpeg过滤器filter理论与实战
ffmpeg过滤器filter理论与实战
10 0
|
1月前
|
编解码 vr&ar 内存技术
FFmpeg常用命令讲解及实战二(1)
FFmpeg常用命令讲解及实战二
18 0
|
1月前
|
编解码
FFmpeg常用命令行讲解及实战一(二)
FFmpeg常用命令行讲解及实战一
23 0
|
1月前
|
编解码 分布式计算 网络协议
FFmpeg常用命令行讲解及实战一(一)
FFmpeg常用命令行讲解及实战一
22 0
|
2月前
|
设计模式 存储 缓存
【ffmpeg C++ 播放器优化实战】优化你的视频播放器:使用策略模式和单例模式进行视频优化
【ffmpeg C++ 播放器优化实战】优化你的视频播放器:使用策略模式和单例模式进行视频优化
58 0
|
2月前
|
机器学习/深度学习 编解码 API
FFmpeg命令行解析
FFmpeg命令行解析
71 1
|
4月前
|
编解码 网络协议 API
ffmpeg命令行工具源码之结构体分析1-命令行参数(未完结,持续更新)
ffmpeg作为多媒体文件转换工具,至少需要有一个要转换的输入文件信息(不仅仅是普通文件,还可以是摄像头设备,网络流等),和通常至少需要一个输出格式的文件(输出文件不仅仅指普通的文件,网络协议比如RTP协议,RTSP协议都可以理解为输出文件),ffmpeg的文件的转换过程主要由以下几个流程 (1)解封装 (2)解码 (3)过滤器 (4)编码 (5)封装 因此ffmpeg工具涉及的结构体主要就从这几个方面来说明这些结构体的含义。
32 0
|
4月前
|
数据采集 Windows
【音视频 ffmpeg 学习】麦克风数据采集,命令行播放 持续更新
【音视频 ffmpeg 学习】麦克风数据采集,命令行播放 持续更新
|
28天前
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
17 0