ffmpeg拼接视频

Posted 六月的翅膀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg拼接视频相关的知识,希望对你有一定的参考价值。

目录

1、两段视频先后播放拼接

2、两段视频同时播放,左右或上下同时显示


1、两段视频先后播放拼接

我没有直接安装ffmpeg,因为好多软件里都已经自带了

想拼接视频的话,找两个视频文件,随便放在一个目录

videolist.txt中写入待拼接的视频文件相对路径

file 'lzbffmpeg/03.mp4'
file 'lzbffmpeg/21.mp4'

然后就可以拼接了

ffmpeg.exe -f concat -i lzbffmpeg\\videos.txt joinoutput.mp4

joinooutput.mp4是输出名

ok了

当然,还有其他不少的拼接方法,这只是其中的一种。

2、两段视频同时播放,左右或上下同时显示

有的小可爱要的可能不是时间线上的拼接,而是类似分屏显示的那种,安排 

ffmpeg -i lzbffmpeg\\03.mp4 -i lzbffmpeg\\21.mp4 -filter_complex "pad=4000:1080:color=red[x0];[0:v]scale=w=1920:h=1080[inn0];[x0][inn0]overlay=0:0[x1];[1:v]scale=w=1920:h=1080[inn1];[x1][inn1]overlay=2000:0" out14.mp4

指令详解 

ffmpeg 
-i lzbffmpeg\\03.mp4 			//视频1
-i lzbffmpeg\\21.mp4 			//视频2
-filter_complex 
"pad=3840:1080[x0];				//合并后的总尺寸
[0:v]scale=w=1920:h=1080[inn0];	//第一个视频的尺寸
[x0][inn0]overlay=0:0[x1];		//第一个视频左上角的起始坐标
[1:v]scale=w=1920:h=1080[inn1];	//第二个视频的尺寸
[x1][inn1]overlay=1920:0" 		//第二个视频左上角的起始坐标
out12.mp4						//输出文件名

假如我想让左右两个视频中间有个分界,留点空隙,就100个像素吧,颜色为绿色

命令修改为

ffmpeg -i lzbffmpeg\\03.mp4 -i lzbffmpeg\\21.mp4 -filter_complex "pad=3940:1080:color=green[x0];[0:v]scale=w=1920:h=1080[inn0];[x0][inn0]overlay=0:0[x1];[1:v]scale=w=1920:h=1080[inn1];[x1][inn1]overlay=2020:0" out15.mp4

ffmpeg 
-i lzbffmpeg\\03.mp4 			//视频1
-i lzbffmpeg\\21.mp4 			//视频2
-filter_complex 
"pad=3940:1080[x0];				//合并后的总尺寸【宽度要加100】
[0:v]scale=w=1920:h=1080[inn0];	//第一个视频的尺寸
[x0][inn0]overlay=0:0[x1];		//第一个视频左上角的起始坐标
[1:v]scale=w=1920:h=1080[inn1];	//第二个视频的尺寸
[x1][inn1]overlay=1920:0" 		//第二个视频左上角的起始坐标【第二个视频起始位置的坐标要加100】
out12.mp4						//输出文件名

 假如想让两个视频上下显示,比如这样

ffmpeg -i lzbffmpeg\\03.mp4 -i lzbffmpeg\\21.mp4 -filter_complex "pad=1920:2160:color=green[x0];[0:v]scale=w=1920:h=1080[inn0];[x0][inn0]overlay=0:0[x1];[1:v]scale=w=1920:h=1080[inn1];[x1][inn1]overlay=0:1080" out16.mp4

ffmpeg 
-i lzbffmpeg\\03.mp4 			//视频1
-i lzbffmpeg\\21.mp4 			//视频2
-filter_complex 
"pad=1920:2160[x0];				//合并后的总尺寸【总尺寸变化了】
[0:v]scale=w=1920:h=1080[inn0];	//第一个视频的尺寸
[x0][inn0]overlay=0:0[x1];		//第一个视频左上角的起始坐标【这个没有变】
[1:v]scale=w=1920:h=1080[inn1];	//第二个视频的尺寸
[x1][inn1]overlay=0:1080" 		//第二个视频左上角的起始坐标【这个需要修改】
out12.mp4						//输出文件名

ffmpeg这单个指令功能看着挺简单,但是一组合就可以变化万千,实现各种各样的功能。

流媒体开发8ffmpeg命令视频拼接图片和视频转换

一、视频拼接

1.1生成测试文件

  • 找三个不同的视频每个视频截取10秒内容
ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i 复仇者联盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i 红海行动.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
如果音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac
  • 将上述1.mp4/2.mp4/3.mp4转成ts格式
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
  • -vbsf,提高视频的兼容性,分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter处理
  • 视频合并,音频和视频的编码格式需要保持一样

1.2开始拼接文件

方法1: ffmpeg -i “concat:1.ts|2.ts|3.ts” -codec copy out_ts.mp4
方法2: ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4

tslist.txt内容:

file '1.ts'
file '2.ts'
file '3.ts'

注意:
1、方法1只适用部分封装格式,比如TS,建议待拼装的码流先转成ts格式
2、建议使用方法2进行拼接
3、待拼接的文件分辨率可以不同,但是编码格式需要统一
4、待拼接的文件音频编码格式需要统一,音频参数(采样率/声道等)也需要统一

二、图片和视频转换

  • 截取一张图片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp

几个参数解析:
-i 输入
-y 覆盖:后面要生成的test.jpg,如果存在直接覆盖,不提醒
-f 格式
image2 一种格式
-ss 起始值
-vframes 帧 如果大于1 那么 输出加文件名要加%03d,test%03d.jpg
-s 格式大小size

  • 转换视频为图片(每帧一张图):
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg 
#生成5s,每秒15帧,一共75
  • 图片转换为视频:
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
#生成5s的视频数据,并且会插帧成25
  • 从视频中生成GIF图片
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
  • 将 GIF 转化为 视频
ffmpeg -f gif -i image2.gif image2.mp4

以上是关于ffmpeg拼接视频的主要内容,如果未能解决你的问题,请参考以下文章

流媒体开发8ffmpeg命令视频拼接图片和视频转换

流媒体开发8ffmpeg命令视频拼接图片和视频转换

FFmpeg实现音视频同步的精准片段拼接

FFmpeg实现音视频同步的精准片段拼接

FFmpeg实现音视频同步的精准片段拼接

FFmpeg实现音视频同步的精准片段拼接