剪切視頻
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
* -ss 指定從什么時間開始
* -t 指定需要截取多長時間
* -i 指定輸入文件
這個命令就是從00秒開始裁剪到00+30=30秒結(jié)束,總共30秒的視頻悉患。這個命令執(zhí)行很快肩钠,因為只是原始數(shù)據(jù)的拷貝,中間沒有什么編碼和解碼的過程兽间。執(zhí)行這個命令后你能得到output.mp4這個輸出文件历葛。你可以用視頻播放軟件播放這個視頻看看。
可能有些視頻裁剪后的效果嘀略,如期望一致恤溶,00秒開始,30秒結(jié)束帜羊,總共30秒的視頻咒程,但是有些視頻裁剪后你會發(fā)現(xiàn)可能開始和結(jié)束都不是很準(zhǔn)確,有可能是從00秒開始帐姻,33秒結(jié)束粮宛。這是為什么呢?
因為這些視頻里30秒處地方剛好不是關(guān)鍵幀卖宠,而ffmpeg會在你輸入的時間點附近圓整到最接近的關(guān)鍵幀處巍杈,然后做接下來的事情。如果你不懂什么是關(guān)鍵幀扛伍,沒關(guān)系筷畦,這也不影響你使用這個命令。
如果你的項目要求能夠接受幾秒的誤差刺洒,那么這個命令完全就可以滿足你的需要鳖宾,接下來的內(nèi)容你也沒有必要往下看了。
如果你的項目里要求很嚴(yán)格逆航,一定要到確定的時間鼎文。那么就要用另外一種方式。
上面的造成那樣的原因是所選的時間不是關(guān)鍵幀因俐,那如果我們將輸入的視頻先轉(zhuǎn)換成所有的幀都為關(guān)鍵幀的視頻拇惋,其實就是將所有的幀的編碼方式轉(zhuǎn)為幀內(nèi)編碼(不理解幀內(nèi)編碼也沒關(guān)系,你就當(dāng)沒看見它抹剩,接著往下看)撑帖,這個問題就有解了。ffmpeg也可以幫我們完成這個事情澳眷。
ffmpeg -i INPUT -sameq -intra OUTPUT
-i 輸入胡嘿,后面是空格,緊跟著就是輸入視頻文件钳踊;
INPUT 輸入文件衷敌;
-sameq 表示保持同樣的視頻質(zhì)量;
-intra拓瞪, 幀內(nèi)編碼缴罗;
OUTPUT 輸出文件名。
如:
ffmpeg -i ./MyVideo.mpg -sameq -intra ./temp.mpg
這個命令的結(jié)果文件就是./temp.mpg.這個文件的視頻和./MyVideo.mpg是一樣的吴藻,但是你會發(fā)現(xiàn)這個文件會比./MyVideo.mpg大很多倍瞒爬,原因就是轉(zhuǎn)換前一般采用的幀間編碼,轉(zhuǎn)換后變成了幀內(nèi)編碼沟堡。這里我們說是一般,原因是有些視頻文件本身就采用了幀內(nèi)編碼矢空。
經(jīng)過這樣的處理后航罗,我們就可以精確的剪切視頻了。
注意
上面的命令在新版本中已經(jīng)廢棄屁药,可以參考下面的命令
ffmpeg -i output.mp4 -strict -2 -qscale 0 -intra keyoutput.mp4
合并視頻
//截取從頭開始的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
//進(jìn)行視頻的合并
ffmpeg -f concat -i list.txt -c copy concat.mp4
在list.txt文件中粥血,對要合并的視頻片段進(jìn)行了描述。
內(nèi)容如下
file ./split.mp4
file ./split1.mp4