您的位置:首页 > 编程语言 > Qt开发

命令行处理视频切分——ffmpeg,avidemux,qt-faststart,mencoder,vlc,MP4Box & gstreamer

2013-08-07 09:58 671 查看
最近作一个项目,跟视频切割相关,对一堆mp4的切割合并

考虑这样一个场景,我们有一个mp4文件 0.mp4,我们需要将其中20-30s之间的数据剪切掉,通过各种gui软件,我们当然可以完成这个工作,但是通过命令行呢?

基本的思路是这样的

1. 将影片分成0-20s ,30s-end两段

2. 将两端片子合在一起

具体使用什么命令的,我们放狗看看;

前期处理,如果需要加亮,锐化,对比度,vlc是个好东西

cvlc 0.mpg --sout="#transcode{vfilter={adjust{}:sharpen{sigma=0.12}:
deinterlace{mode=mean}},vcodec=h264,scale=0,acodec=mp4a}:file{dst=./0.mp4}" --sout-all --sout-keep


影片剪切

1.1
ffmpeg -ss 30 -i 0.mp4 -same_quant 2.mp4


从30s之后的第一个Iframe开始剪切

1.2
ffmpeg -i 0.mp4 -ss 30 -same_quant 2.mp4


先解码然后找到相关时间戳然后解码,慢,内存消耗特别大,经常oom

1.3
ffmepg -i 0.mp4 -ss 30 -vcodec copy -acodec copy 2.mp4


很快,但是音视频不同步

1.4
mencoder -ovc x264 -oac facc -ss 30 0.mp4 -o 2.avi


比ffmpeg用的内存少点,总是从30s之后的第一个Iframe开始处理,生成的是avi格式

1.5
mencoder -ovc copy -oac facc -ss 30 0.mp4 -o 2.avi


比1.5快一点,但是比1.3慢

1.6
mencoder -ovc copy -oac facc -ss 30 0.mp4 -of lavf -o 2.mp4


据说可以生成mp4,但是我失败了。。。

1.7 avidemux 只能通过frame开始进行剪切

综上,完美的剪切影片是不能的。。。。。

不过, man ffmpeg可以发现一个 force_key_frames 的参数,我们可以首先在需要剪切的时间点加上frame,然后再通过1.3进行处理

1.8
ffmpeg -i 0.mp4 -force_key_frames
30.1 -same_quant 0.new.mp4

ffmepg -i 0.new.mp4 -ss 30 -vcodec copy -acodec copy 2.mp4


为什么是30.1,如果是30的话,ffmpeg从30s后的下一个Iframe开始

ps:30.05 也不能工作,因为我试过…..

然后我们就可以合并了

对于mpg文件,我们可以直接通过

cat 1.mpg 2.mpg > 0.mpg

合并通过avidemux重新索引

然后通过ffmpeg 直接专成mp4

ffmpeg -i 0.mpg -same_quant 0.mp4

但是有时候似乎容易出问题,似乎先用avidemux处理一下比较好,不确认

avidemux –autoindex –load 0.mpg –output-format=AVI –save 0.avi –quit

ffmpeg -i 0.avi -same_quant 0.mp4

如果是mp4文件,直接使用MP4Box合并

MP4Box -cat 1.mp4 -cat 2.mp4 new.mp4

如果需要加上各种filter的话,其实gstreamer也是个不错的选择,欢迎大家看看我的 gstreamer of golang.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: