FFmpeg是一个领先的多媒体框架,能够支持多种视频格式,甚至是最古老的格式以及最新的视频格式。官网或github下载FFmpeg后,通过命令行操作,您可以对视频进行分割、合并、格式转换等操作。
FFmpeg分为3个版本:Static、Shared、Dev,前两个版本可以直接在命令行中使用。
- Static版本中的exe体积较大,那是因为相关的Dll都已经编译进exe里面了。
- Shared版本中exe的体积相对小很多,是因为它们运行的时候还需要到相关的dll中调用相应的功能。
- Dev版本用于开发,里面包含了库文件xxx.lib以及头文件xxx.h。
通常下载的压缩包中包含了三个工具:ffmpeg.exe,ffplay.exe和ffprobe.exe。
- ffmpeg 是一个命令行工具箱,用于操作、转换和流式传输多媒体内容。
- ffplay 是一个简约的多媒体播放器。
- ffprobe是一种用于检查多媒体内容的简单分析工具。
FFmpeg的安装
因为该程序只有命令行模式,为了方便使用,需要设置环境变量,如图:
打开cmd命令行窗口,输入命令ffmpeg -version
,窗口返回ffmpeg的版本信息,说明安装成功。接下来你就可以直接使用命令行执行ffmpeg命令进行各种媒体格式的转换了。
编码器
编码器(encoders)是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。
以下是一些 FFmpeg 内置的视频编码器。
- libx264:最流行的开源 H.264 编码器
- NVENC:基于 NVIDIA GPU 的 H.264 编码器
- libx265:开源的 HEVC 编码器
- libvpx:谷歌的 VP8 和 VP9 编码器
- libaom:AV1 编码器
音频编码器如下:
- libfdk-aac
- aac
下面的命令可以查看 FFmpeg 已安装的编码器:
$ ffmpeg -encoders
FFmpeg 的使用格式
FFmpeg 的命令行参数非常多,可以分成五个部分。
$ ffmpeg {1} {2} -i {3} {4} {5}
上面命令中,五个部分的参数依次如下:
- 全局参数
- 输入文件参数
- 输入文件
- 输出文件参数
- 输出文件
参数太多的时候,为了便于查看,ffmpeg 命令可以写成多行。
$ ffmpeg \ [全局参数] \ [输入文件参数] \ -i [输入文件] \ [输出文件参数] \ [输出文件]
下面是一个例子。
$ ffmpeg \ -y \ # 全局参数 -c:a libfdk_aac -c:v libx264 \ # 输入文件参数 -i input.mp4 \ # 输入文件 -c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数 output.webm # 输出文件
上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。
如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。
$ ffmpeg -i input.avi output.mp4
参考:https://ruanyifeng.com/blog/2020/01/ffmpeg.html
众所周知,从某些视频网站下载的视频是分段的。比如新浪视频每隔6分钟分段,俗称“6分钟诅咒”。
现在的任务是将这些视频片段合并起来,并且尽量无损。
FFmpeg concat分离器
这种方法成功率很高,也是最好的。先创建一个文本文件filelist.txt:
file '01.mkv' file '02.mkv' file '03.mkv'
然后合并:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy -y output.mkv
注释:
-f concat
表示采用concat协议-c copy
复制源编码器,不重新编码-safe
为了避免权限报错-y
覆盖输出文件
注意:使用FFmpeg concat分离器时,如果文件名有奇怪的字符,要在filelist.txt中转义。ffmpeg --help
可以查看帮助。
FFmpeg concat协议
对于MPEG格式的视频,可以直接连接:
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
对于非MPEG格式容器,但是是MPEG编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3等),可以包装进TS格式的容器再合并。在新浪视频,有很多视频使用H.264编码器,可以采用这个方法:
ffmpeg -i input1.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts ffmpeg -i input2.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts ffmpeg -i input3.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4
保存QuickTime/MP4格式容器的时候,建议加上-movflags +faststart。这样分享文件给别人的时候可以边下边看。
视频截取
ffmpeg -i ./plutopr.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 ./cutout1.mp4 -y
注释:
-ss
设置开始时点,上例表示从第10秒开始截取-to
结束时点。上例表示在第15秒结束,即截取时长为5s的新视频
也可以使用参数-t
表示截取时长,如-ss 00:00:10 -t 00:00:05
-vcodec copy
表示使用跟原视频一样的视频编解码器。-acodec copy
表示使用跟原视频一样的音频编解码器。-i
表示源视频文件-y
表示如果输出文件已存在则覆盖。
注意:如果将-ss
放在-i ./plutopr.mp4
后面,则-to
不起作用,效果如同-t
,即表示截取多长的视频。所以一定要注意-ss
的位置。
视频分割
输入以下cmd命令,程序会自动将视频文件进行切割。
C:\Windows\System32\ffmpeg.exe -ss 00:01:00 -t 00:03:00 -i E:Renee.avi -vcodec copy -acodec copy E:\AVI\Renee.avi
注释:
- -ss :起始时间
- -i :要分割的视频文件
- -t :分割时长
可以是-t xx
//单位:秒
或者-t 00:06:00
//格式:时:分:秒
注意 :-ss
要放在-i
之前
视频封装
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
视频修复音画同步
ffmpeg -itsoffset 00:00:00.900 -i 源文件.flv -i 源文件.flv -map 0:v -map 1:a -vcodec copy -acodec copy 修复文件.flv
说明:上面的命令把视频推迟0.9秒
注释:
-itsoffset 00:00:00.900
:推迟后面的输入0.9秒-i 源文件.flv
:第一个输入流-i 源文件.flv
:第二个输入流-map 0:v
:提取第一个输入流的视频-map 1:a
:提取第二个输入流的音频-vcodec copy -acodec copy
:视频音频编码均为复制修复文件.flv
:输出新文件
将文件当做直播送至live
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k