FFMPEG 視頻分割和合並

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秒結束,總共30秒的視頻。這個命令執行很快,因爲只是原始數據的拷貝,中間沒有什麼編碼和解碼的過程。執行這個命令後你能得到output.mp4這個輸出文件。你可以用視頻播放軟件播放這個視頻看看。
    可能有些視頻裁剪後的效果,如期望一致,00秒開始,30秒結束,總共30秒的視頻,但是有些視頻裁剪後你會發現可能開始和結束都不是很準確,有可能是從00秒開始,33秒結束。這是爲什麼呢?
    因爲這些視頻裏30秒處地方剛好不是關鍵幀,而ffmpeg會在你輸入的時間點附近圓整到最接近的關鍵幀處,然後做接下來的事情。如果你不懂什麼是關鍵幀,沒關係,這也不影響你使用這個命令。

如果你的項目要求能夠接受幾秒的誤差,那麼這個命令完全就可以滿足你的需要,接下來的內容你也沒有必要往下看了。
如果你的項目裏要求很嚴格,一定要到確定的時間。那麼就要用另外一種方式。
上面的造成那樣的原因是所選的時間不是關鍵幀,那如果我們將輸入的視頻先轉換成所有的幀都爲關鍵幀的視頻,其實就是將所有的幀的編碼方式轉爲幀內編碼(不理解幀內編碼也沒關係,你就當沒看見它,接着往下看),這個問題就有解了。ffmpeg也可以幫我們完成這個事情。
ffmpeg -i INPUT -sameq -intra OUTPUT
-i 輸入,後面是空格,緊跟着就是輸入視頻文件;
INPUT 輸入文件;
-sameq 表示保持同樣的視頻質量;
-intra, 幀內編碼;
OUTPUT 輸出文件名。

如:
ffmpeg -i ./MyVideo.mpg -sameq -intra ./temp.mpg
這個命令的結果文件就是./temp.mpg.這個文件的視頻和./MyVideo.mpg是一樣的,但是你會發現這個文件會比./MyVideo.mpg大很多倍,原因就是轉換前一般採用的幀間編碼,轉換後變成了幀內編碼。這裏我們說是一般,原因是有些視頻文件本身就採用了幀內編碼。
經過這樣的處理後,我們就可以精確的剪切視頻了。

注意
上面的命令在新版本中已經廢棄,可以參考下面的命令

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
//進行視頻的合併
ffmpeg -f concat -i list.txt -c copy concat.mp4

在list.txt文件中,對要合併的視頻片段進行了描述。
內容如下

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

常用命令如下

// 去掉視頻中的音頻
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 -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
// -y 覆蓋輸出文件

//剪切視頻
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
// -ss 開始時間; -t 持續時間

// 視頻截圖
ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
// -s 設置分辨率; -f 強迫採用格式fmt;

// 視頻分解爲圖片
ffmpeg –i test.mp4 –r 1 –f 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

參數說明:

-vcodec xvid 使用xvid壓縮
-s 320x240 指定分辨率
-r fps 設置幀頻 缺省25
-b <比特率> 指定壓縮比特

-acodec aac 設定聲音編碼
-ac <數值> 設定聲道數,1就是單聲道,2就是立體聲
-ar <採樣率> 設定聲音採樣率,PSP只認24000
-ab <比特率> 設定聲音比特率
-vol <百分比> 設定音量

-y(覆蓋輸出文件

-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置作者
-copyright string 設置版權
-hq 激活高質量設置

-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設置頂部切除帶大小 像素單位
-cropbottom size -cropleft size -cropright size
-padtop size 設置頂部補齊的大小 像素單位
-padbottom size -padleft size -padright size -padcolor color 設置補齊條顏色(hex,6個16進制的數,紅:綠:蘭排列,比如 000000代表黑色)
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩衝區大小
-vcodec codec 強制使用codec編解碼方式。 如果用copy表示原始編解碼數據必須被拷貝。
-sameq 使用同樣視頻質量作爲源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀錄文件名爲file

-map file:stream 設置輸入流映射
-debug 打印特定調試信息

來源:https://www.jianshu.com/p/cf1e61eb6fc8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章