FFMPEG MKV转换为MP4以及视频分割和合并

619 阅读4分钟

mkv转换为mp4

ffmpeg -i "test.mkv" -vcodec copy -acodec aac 'test.mp4'

分割命令:

ffmpeg -ss 00:00:00 -t 00:49:30 -i input.mp4 -vcodec copy -acodec copy output.mp4

-ss 指定从什么时间开始 -t 指定需要截取多长时间 -i 指定输入文件 这个命令就是从00秒开始裁剪到49分30秒结束。

这个命令执行背后是对原始数据的拷贝,中间没有编码和解码的过程。

执行这个命令后你能得到output.mp4这个输出文件。

某些情况下视频裁剪出来的结果可能会多几秒或者少几秒,是因为裁剪的开头或者末尾处地方刚好不是关键帧,而ffmpeg会在你输入的时间点附近圆整到最接近的关键帧处,然后进行裁剪等操作。

合并命令

//截取从头开始的30s
ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4
//截取从30s开始的30s
ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4
//进行视频的合并
ffmpeg -f concat -i list.txt -c copy concat.mp4

list.txt文件内容:

file ./split.mp4
file ./split1.mp4

合并时可能会出现Operation not permitted的错误,这时候可以使用

ffmpeg -f concat -safe 0 -i list.txt -c copy concat.mp4

注意多了一个-safe 0

常见命令

// 去掉视频中的音频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝

// 提取视频中的音频
ffmpeg -i input.mp4 -acodec copy -vn output.mp3
// -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝

// 音视频合成
ffmpeg -yi input.mp4i input.mp3vcodec copyacodec copy output.mp4
// -y 覆盖输出文件

//剪切视频
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
// -ss 开始时间; -t 持续时间

// 视频截图
ffmpegi test.mp4f image2 -t 0.001 -s 320x240 image-%3d.jpg
// -s 设置分辨率; -f 强迫采用格式fmt;

// 视频分解为图片
ffmpegi test.mp4r 1f image2 image-%3d.jpg
// -r 指定截屏频率

// 将图片合成视频
ffmpeg -f image2 -i image%d.jpg output.mp4

//视频拼接
ffmpeg -f concat -i filelist.txt -c copy output.mp4

// 将视频转为gif
ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
// -pix_fmt 指定编码

// 将视频前30帧转为gif
ffmpeg -i input.mp4 -vframes 30 -f gif output.gif

// 旋转视频
ffmpeg -i input.mp4 -vf rotate=PI/2 output.mp4

// 缩放视频
ffmpeg -i input.mp4 -vf scale=iw/2:-1 output.mp4
// iw 是输入的宽度, iw/2就是一半;-1 为保持宽高比

//视频变速
ffmpeg -i input.mp4 -filter:v setpts=0.5*PTS output.mp4

//音频变速
ffmpeg -i input.mp3 -filter:a atempo=2.0 output.mp3

//音视频同时变速,但是音视频为互倒关系
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4


// 视频添加水印
ffmpeg -i input.mp4 -i logo.jpg -filter_complex [0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map 0:a -codec:a copy output.mp4
// main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距;

// 截取视频局部
ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4

// 截取部分视频,从[80,60]的位置开始,截取宽200,高100的视频
ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4

// 截取右下角的四分之一
ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4

// 截去底部40像素高度
ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4

参考: www.jianshu.com/p/cf1e61eb6…blog.csdn.net/zhenfengshi…

视频转gif

命令:ffmpeg -ss 00:00:03 -t 3 -i Test.mov -s 640x360 -r  15  dongtu.gif

解释:

1、ffmpeg 是你刚才安装的程序;

2、-ss 00:00:03 表示从第 00 分钟 03 秒开始制作 GIF,如果你想从第 9 秒开始,则输入 -ss 00:00:09,或者 -ss 9,支持小数点,所以也可以输入 -ss 00:00:11.3,或者 -ss 34.6 之类的,如果不加该命令,则从 0 秒开始制作;

3、-t 3 表示把持续 3 秒的视频转换为 GIF,你可以把它改为其他数字,例如 1.5,7 等等,时间越长,GIF 体积越大,如果不加该命令,则把整个视频转为 GIF;

4、-i 表示 invert 的意思吧,转换;

5、Test.mov 就是你要转换的视频,名称最好不要有中文,不要留空格,支持多种视频格式;

6、-s 640x360 是 GIF 的分辨率,视频分辨率可能是 1080p,但你制作的 GIF 可以转为 720p 等,允许自定义,分辨率越高体积越大,如果不加该命令,则保持分辨率不变;

7、-r “15” 表示帧率,网上下载的视频帧率通常为 24,设为 15 效果挺好了,帧率越高体积越大,如果不加该命令,则保持帧率不变;

8、dongtu.gif:就是你要输出的文件,你也可以把它命名为 hello.gif 等等。

图片合并为动图:

ffmpeg -threads 2 -r 2 -i %d.jpg 11.gif -y

-threads 2:2 以两个线程进行运行, 加快处理的速度。

-y 对输出文件进行覆盖
-r 2 fps设置为2帧/秒(不同位置有不同含义)
-i  %d.jpg 合并的图片文件,图片文件为 1.jpg 2.jpg ….

参考:www.cnblogs.com/yibinboy/p/…