FFmpeg无损合并视频

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的安装

因为该程序只有命令行模式,为了方便使用,需要设置环境变量,如图:

图01

打开cmd命令行窗口,输入命令ffmpeg -version,窗口返回ffmpeg的版本信息,说明安装成功。接下来你就可以直接使用命令行执行ffmpeg命令进行各种媒体格式的转换了。

图02

编码器

编码器(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}

上面命令中,五个部分的参数依次如下:

  1. 全局参数
  2. 输入文件参数
  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可以查看帮助。

示例1

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
示例2

注释:

  • -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秒

示例03

注释:

  • -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

作者: Hugh

Welcome to Wan's world~