赞
踩
视频裁剪拼接总结 :
裁剪视频 , 需要指定 输入文件 / 裁剪起始时间 / 裁剪持续时间 / 指定 视频和音频 编码 ;
注意 : 裁剪的视频 , 需要 保证 视频编码 和 音频编码 统一 , 这样才能在之后 将这些视频 拼接起来 ;
执行如下命令 , 裁剪出 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 编码 ;
在 H.264 视频编码格式中 :
这两种数据 是非常重要的 视频信息单元 , PPS 数据 通常 在 SPS 数据 之后 , 并在 H.264 码流中作为 元数据 传输 ;
裁剪分离 视频 时 , 如果视频格式是 H.264 编码格式的 , 该视频格式中需要写入 SPS 和 PPS 信息 , 如果裁剪出来的视频 没有上述 SPS 和 PPS 数据 , 这个视频就无法播放 ;
将 mp4 格式的视频转为 其它格式时 , 建议添加 -vbsf h264_mp4toannexb
参数 , 可以避免 SPS 和 PPS 数据丢失的问题 , 以增加 视频 的 兼容性 ;
执行
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 视频容器 中的 视频信息如下 :
执行
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 输出文件 ;
视频拼接 ,
下面的 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 文件 ,
ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy output.mp4
拼接完成后 , 发现 拼接后的 output.mp4 输出文件 是 1.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 种视频拼接命令 , 效果都很好 ;
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'
执行
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy output.ts
命令 , 拼接 3 个视频 , 拼接成功 , 播放效果也很好 ;
首先 , 编辑一个 list.txt 文件 , 内容如下 :
file '1.ts'
file '2.ts'
file '3.ts'
然后 , 执行
ffmpeg -f concat -i list.txt -codec copy output2.ts
命令 , 成功拼接视频 , 视频播放效果也很好 ;
下面的 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'
执行
ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy output.flv
命令 , 拼接 3 个视频 , 拼接失败 , output.flv 的文件内容是 1.flv 的内容 ;
首先 , 编辑一个 list.txt 文件 , 内容如下 :
file '1.flv'
file '2.flv'
file '3.flv'
然后 , 执行
ffmpeg -f concat -i list.txt -codec copy output2.flv
命令 , 成功拼接视频 并且可以成功播放 ;
视频拼接 ,
在上一个章节中 , 使用 ts 格式进行视频拼接 , 成功率最高 , 本章节中主要展示 使用不同视频编码格式 , 不同音频编码格式 , 不同音频编码参数 导致失败的案例 ;
错误原因 : 拼接视频时 , 一般都以第一个视频的 编码格式 和 参数为基准 , 如果 后面的视频 编码 和 参数 与 第一个不同 , 就会出现各种问题 ;
执行
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 的内容 , 剩余两个视频没有拼接上去 ;
执行
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 文件时 , 中间一段直接跳过 , 该输出文件有问题 ;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。