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

最近作一个项目,跟视频切割相关,对一堆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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值