视频裁剪拼接总结 :
- 视频裁剪 : 保证 视频编码 和 音频编码 统一 , 这样才能在之后 将这些视频 拼接起来 ; 如果后续需要拼接 , 则裁剪 ts 格式视频 ;
- 视频拼接 :
- 设置输入文件 : 使用 list 列表 , 设置输入文件 , 不要使用 concat 字符串设置要拼接的视频文件 , 否则部分封装格式会拼接失败 ;
- 视频格式要求 : 使用 ts 格式进行视频拼接 , 不要使用 mp4 和 flv 格式进行拼接 , 否则有可能导致视频拼接失败 ;
- 视频编码要求 : 视频画面 的 分辨率 可以是不同的 , 但是 视频的 编码格式 必须相同 , 否则会出现问题 ;
- 音频编码要求 : 音频 拼接时 , 音频编码格式需要相同 , 并且 音频 的 采样率 / 通道数 / 采样位数 等参数也必须相同 , 才可以进行拼接 , 否则会出现问题 ;
一、裁剪视频
1、裁剪视频命令
裁剪视频 , 需要指定 输入文件 / 裁剪起始时间 / 裁剪持续时间 / 指定 视频和音频 编码 ;
- 指定 输入文件 : 使用 -i 参数 指定输入文件 ;
- 指定 起始时间 : 使用 -ss 参数 指定起始时间 , 参数值 10 表示从 第 10 秒开始裁剪 , 参数 00:00:10 表示从 第 10 秒 开始裁剪 ;
- 指定 持续时间 : 使用 -t 参数 指定 裁剪持续时间 , 参数值 10 表示裁剪 10 秒视频 , 参数 00:00:10 表示 裁剪 10 秒视频 ;
- 指定 视频编解码器 : 使用 -vcodec 参数 指定 视频编解码器 , 参数值 libx264 表示 H264 视频编解码 ;
- 指定 音频编解码器 : 使用 -acodec 参数 指定 音频编解码器 , 参数值 aac 表示 AAC 音频编解码器 ;
注意 : 裁剪的视频 , 需要 保证 视频编码 和 音频编码 统一 , 这样才能在之后 将这些视频 拼接起来 ;
执行如下命令 , 裁剪出 3 个 5 秒 的 视频片段 ;
ffmpeg -i input.mp4 -ss 00:00:00 -t 5 -vcodec libx264 -acodec aac 1.mp4
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -vcodec libx264 -acodec aac 2.mp4
ffmpeg -i input.mp4 -ss 00:00:20 -t 5 -vcodec libx264 -acodec aac 3.mp4
执行完毕后 , 下图是 裁剪的第一个视频的执行结果 :
执行
ffprobe 1.mp4
查看裁剪出的视频信息 , 时长是 5 秒 , 视频编码是 H264 编码 , 音频编码是 AAC 编码 ;
2、h264 编码的 SPS 和 PPS 数据
在 H.264 视频编码格式中 :
- SPS : 全称 Sequence Parameter Set , 序列参数集 , 主要用于 描述整个视频序列的全局参数 , 如 : 分辨率、宽高比、帧率、比特率 等 视频编码信息 ;
- PPS : 全称 Picture Parameter Set , 图像参数集 , 主要 包含了 图像 或 图像集合 的具体参数 , 如 : 熵编码模式选择、片组数目、初始量化参数等数据 , 这是解码图像数据的必须参数信息 ;
这两种数据 是非常重要的 视频信息单元 , PPS 数据 通常 在 SPS 数据 之后 , 并在 H.264 码流中作为 元数据 传输 ;
裁剪分离 视频 时 , 如果视频格式是 H.264 编码格式的 , 该视频格式中需要写入 SPS 和 PPS 信息 , 如果裁剪出来的视频 没有上述 SPS 和 PPS 数据 , 这个视频就无法播放 ;
将 mp4 格式的视频转为 其它格式时 , 建议添加 -vbsf h264_mp4toannexb
参数 , 可以避免 SPS 和 PPS 数据丢失的问题 , 以增加 视频 的 兼容性 ;
3、将裁剪的视频转为 ts 格式
执行
ffmpeg -i 1.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 3.ts
将 裁剪出的 3 个 mp4 格式的 视频 , 转为 ts 格式的视频 ;
执行
ffprobe 1.ts
命令 , 查看 1.ts 视频容器 中的 视频信息如下 :
4、将裁剪的视频转为 flv 格式
执行
ffmpeg -i 1.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 1.flv
ffmpeg -i 2.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 2.flv
ffmpeg -i 3.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 3.flv
将 裁剪出的 3 个 mp4 格式的 视频 , 转为 flv 格式的视频 ;
执行
ffprobe 1.flv
命令 , 查看 转换后的 1.flv 输出文件 ;
二、拼接视频 - 相同编码和相同容器格式的拼接测试
视频拼接 ,
- 使用 list 列表 , 设置输入文件 , 不要使用 concat 字符串设置要拼接的视频文件 , 否则部分封装格式会拼接失败 ;
- 使用 ts 格式进行视频拼接 , 不要使用 mp4 和 flv 格式进行拼接 , 否则有可能导致视频拼接失败 ;
1、拼接视频命令 - mp4 格式
下面的 2 个命令中 , 使用 mp4 格式进行视频拼接 , 要么拼接失败 , 要么拼接出的视频效果不好 ;
ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy output.mp4
ffmpeg -f concat -i list.txt -codec copy output2.mp4
list.txt :
file '1.mp4'
file '2.mp4'
file '3.mp4'
使用 mp4 格式进行视频拼接 , 多少会出现一点问题 ;
直接使用命令拼接 mp4 视频 - 拼接失败
执行下面的命令 , 拼接 mp4 文件 ,
ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy output.mp4
拼接完成后 , 发现 拼接后的 output.mp4 输出文件 是 1.mp4 , 没有拼接效果 ;
指定文件列表拼接 mp4 视频 - 拼接成功但是播放不正常
编辑一个 list.txt 列表 , 内容如下 :
file '1.mp4'
file '2.mp4'
file '3.mp4'
执行如下命令 , 执行效果与 -i "concat:1.mp4|2.mp4|3.mp4"
效果相同 ;
ffmpeg -f concat -i list.txt -codec copy output2.mp4
执行后 , 视频拼接成功 , 但是播放时 音频 与 视频 轨道并不同步 ;
2、拼接视频命令 - ts 格式
下面的 2 种视频拼接命令 , 效果都很好 ;
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy output.ts
ffmpeg -f concat -i list.txt -codec copy output2.ts
list.txt :
file '1.ts'
file '2.ts'
file '3.ts'
直接使用命令拼接 ts 视频 - 拼接成功
执行
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy output.ts
命令 , 拼接 3 个视频 , 拼接成功 , 播放效果也很好 ;
指定文件列表拼接 ts 视频 - 拼接成功
首先 , 编辑一个 list.txt 文件 , 内容如下 :
file '1.ts'
file '2.ts'
file '3.ts'
然后 , 执行
ffmpeg -f concat -i list.txt -codec copy output2.ts
命令 , 成功拼接视频 , 视频播放效果也很好 ;
3、拼接视频命令 - flv 格式
下面的 2 种视频拼接命令 , 第一个命令拼接视频失败 ,
ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy output.flv
ffmpeg -f concat -i list.txt -codec copy output2.flv
list.txt :
file '1.flv'
file '2.flv'
file '3.flv'
直接使用命令拼接 flv 视频 - 拼接失败
执行
ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy output.flv
命令 , 拼接 3 个视频 , 拼接失败 , output.flv 的文件内容是 1.flv 的内容 ;
指定文件列表拼接 flv 视频 - 拼接成功
首先 , 编辑一个 list.txt 文件 , 内容如下 :
file '1.flv'
file '2.flv'
file '3.flv'
然后 , 执行
ffmpeg -f concat -i list.txt -codec copy output2.flv
命令 , 成功拼接视频 并且可以成功播放 ;
三、拼接视频 - 不同编码和容器格式的拼接测试
视频拼接 ,
- 视频画面 的 分辨率 可以是不同的 , 但是 视频的 编码格式 必须相同 , 否则会出现问题 ;
- 音频 拼接时 , 音频编码格式需要相同 , 并且 音频 的 采样率 / 通道数 / 采样位数 等参数也必须相同 , 才可以进行拼接 , 否则会出现问题 ;
在上一个章节中 , 使用 ts 格式进行视频拼接 , 成功率最高 , 本章节中主要展示 使用不同视频编码格式 , 不同音频编码格式 , 不同音频编码参数 导致失败的案例 ;
错误原因 : 拼接视频时 , 一般都以第一个视频的 编码格式 和 参数为基准 , 如果 后面的视频 编码 和 参数 与 第一个不同 , 就会出现各种问题 ;
1、拼接视频命令 - 不同音频编码格式 导致 拼接失败
执行
ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
命令 , 将 2.mp4 的 视频编码不变 , 音频编码 由 aac 改为 ac3 编码 , 此时 2.ts 的音频编码 与 1.ts 和 3.ts 的 aac 格式音频编码 不同 ;
此时 , 执行
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy output.mp4
命令 , 将 1.ts , 2.ts , 3.ts 这 3 个视频文件进行拼接 , 拼接过程就直接报错了 , 最终输出文件只有 5 秒 , 也就是 1.ts 的内容 , 剩余两个视频没有拼接上去 ;
2、拼接视频命令 - 不同音频编码格式 导致 拼接失败
执行
ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
命令 , 将 2.mp4 的 视频编码不变 , 音频编码不变 , 但是音频的采样率改为 96000 Hz ;
此时 , 执行
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy output.mp4
命令 , 将 1.ts , 2.ts , 3.ts 这 3 个视频文件进行拼接 , 拼接过程也出现了 DTS 警告 , 视频时长是对的 , 但是 第二个音频 的采样率是错误的 , 播放 output.mp4 文件时 , 中间一段直接跳过 , 该输出文件有问题 ;