訪客留言簿

星期日, 11月 23, 2014

[影片分割教學] mp4 flv avi mpeg mpg 能播放就能切割(影像處理 ffmpeg my mp4box gui split)

前言

簡單來說用命令列跑 ffmpeg 比較精準,但想快的,可以用 My MP4Box GUI 會比較方便。

總之我也還在摸索中這樣。

(2021.06.29 備註:本篇文章中,會出現 foo bar foobar result 之類的字串,那是無意義字串,主要是在告訴讀者,這個地方要打實際的檔案名稱,再接副檔名,並不是要打前述字串。)

軟體下載

ffmpeg 分割影片基本語法

ffmpeg -i foo -ss 00:00:00.00 -t 00:00:00.00 bar

進純文字命令列,切換資料夾(cd)到 FFmpeg/bin 下工作。

上面的 foo 代表要輸入的影片路徑及名稱(同路徑則打檔名副檔名即可),bar 就是輸出的檔名。

時間有兩處要填。前面的是「開始的時間」,後面的是「總共的長度」。

時間格式為「小時:分鐘:秒鐘.毫秒」(hh:mm:ss.SSS),毫秒基本上只能吃到小數點後兩位的樣子。(hh 跟 SSS 的數字為 00~99;mm 跟 ss 的數字為 00~59)

用 H.264 重新壓縮影片

新的壓縮技術可以更好、更快、更省空間,所以手上有 mpg / mpeg / avi 等的超大影片檔的話,建議可以重新壓成 H.264 mp4 會比較省空間。

ffmpeg -i foo bar

其他 ffmpeg 相關指令

抓 FFmpeg Windows 版的話,裡面至少會附上 ffmpeg 跟 ffplay 兩樣東東。

ffmpeg 就上面介紹的,可以切割影片的。

ffplay 則是播放器,影片可以用這播,那就可以用 ffmpeg 編輯。

ffplay foobar -loop 0

上面這個就是無限循環播放影片的指令。

其他請自行看 FFmpeg/doc 資料夾底下的說明文件。

ffmpeg + ffplay 連續技

要試錯調整分割時間點,又覺得要一直切換指令很麻煩,只要打下面一行就好,ffplay 播影片可以按 q 鍵關閉回命令列視窗。

ffmpeg -i foo -ss 00:00:00.00 -t 00:00:00.00 -y bar && ffplay bar -loop 0

ffplay 鍵盤操作方式

  • f - 切換全螢幕或視窗
  • 空白鍵 - 暫時或繼續
  • q - 關閉視窗
  • 左、右鍵 - 向前、後移動 10 秒
  • 上、下鍵 - 向前、後移動 1 分

影片輸出成動畫圖片或擷圖(gif、apng、jpg...)

研究中,先留筆記下來。靠刪去法查沒看過的參數,這樣子比較快搜尋到。

另外應該也可以直接指定影片段落,來 output 轉成 animation 圖片。

(待研究:轉成多張圖片、多張圖片轉成單張縮圖)

ffmpeg -i 03.mp4 -s 480x270 -r 25 -vframes 250 -f gif a.gif -y

  • -s WxH - 指定寬高(Width、Height)的像素值(pixel),注意乘號是要用英文「x」不是符號「*」(因為這是保留字元 escape character 中常見的萬用字元)。
  • -r Number - 指定每秒的速度的樣子,詳細單位待查,Number 處就是要填數字進去。(好像填 25 就很快了)
  • -vframes Number - 指定要擷取多長的影片的樣子,詳細單位待查,Number 處就是要填數字進去。
  • -f gif Filename - 指定輸出格式(format)成 gif 動畫圖片,Filename 就是檔名。要存成別的靜態圖片,則是寫成「-f image2 Filename」。

ffmpeg -i 03.mp4 -y -ss 00:00:10.00 -t 00:00:10.00 -s 480x270 -r 60 -f gif a.gif

個人覺得比較好的寫法,直接指定時間段落,省去算 frame 幀數的工夫。(順帶一提不指定時間或幀的話,就是整個影片去跑輸出)

下面是本章節的參考資料。

合併圖片跟聲音成影片檔

先寫下參考資料,不知為何 ffmpeg 可以單獨轉 wma 為 mp3 檔,卻不能用下面的一道指令完成合併成影片檔。

ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:v libx264 -c:a copy result.mkv

參考資料

合併影音

有無聲影片,要跟聲音檔合併,可以一行指令匯入兩個檔案,不重新壓縮,最後直接合併成一個檔案。

ffmpeg -i foo.mp4 -i bar.mp3 -c:v copy -c:a aac foobar.mkv

參考資料

Windows 批次檔(對話式)

可能會有人需要,先留個筆記。

@echo off
set /p in=Filename is (FULL NAME with EXTEND): 
set /p begin=Begin from (which time) hh:mm:ss.SS: 
set /p dura=Duration(how long) with hh:mm:ss.SS: 
set /p width=Output width is (PXs): 
set /p height=Output height is (px): 
set /p ratio=How fast it is (fps, ex:25): 
set /p out=Your output gif filename is: 
ffmpeg -i %in% -y -ss %begin% -t %dura% -s %width%x%height% -r %ratio% -f gif %out%.gif
@echo !!!!!!!!!!!!
@echo !!! DONE !!!
@echo !!!!!!!!!!!!
pause

合併影片(concatenate)

ffmpeg -i "concat:foo1|foo2" bar.mp4

上面的 foo1 跟 foo2 就是要合併的兩個來源檔案,也可以加入完整路徑。(如 "concat:R:\test1.mp4|R:\test2.mp4" 這樣)

不過這邊要注意一件事,就是 mp4 檔,可能無法直接合併,所以要先轉換成 ts 檔。目前我自己在 Windows 7 上,試過品質比較高的轉檔合併法,是下面這三行指令。(不同作業系統可能會需要不同的參數,這邊僅供參考)

ffmpeg -i foo1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts foo1.ts
ffmpeg -i foo2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts foo2.ts
ffmpeg -i "concat:foo1.ts|foo2.ts" bar.mp4

參考
排序錯誤導致的合併失敗(2016.11.10 加註)

有時候你會發現你的 .ts 檔合併後,影片會不正常,那可能原因之一就是順序錯誤了。

例如抓 Twitter 的 video.twimg.com 底下的 .tx 格式影片時,不照順序來合併影片,就會在順序錯誤的地方,造成影片停格的現象。

測試用影片來源:津路参汰 ☆すーぱーそに子10周年☆さんのツイート: "これすごくないっすか… #すーぱーぽちゃ子" https://t.co/IRJcTFMVJg

這影片分割成六個 ts 檔,正確的順序如下,如果你合併時的檔名排序錯誤,出來的影片就會跟著錯誤,這時其實只要把順序寫正確就可以解決了。

  1. aIQqvX7Dhquo-yXT.ts
  2. Taqpr04pi8mAsD-z.ts
  3. S_Z38N_mDpyViqfd.ts
  4. b0hq8vIIla0KyV2X.ts
  5. NdiB1kctv0ACkzgL.ts
  6. kadBY4rVH44247Vw.ts

用 ffmpeg 剪截影片

editing - How can I crop a video with ffmpeg? - Video Production Stack Exchange

ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4
ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4

使用 My MP4Box GUI 分割影片

都圖形介面,也不用教啥。

下載、安裝、執行,然後在「Split」頁面內,選擇「Extract by Duration」就好。

唯一的缺點就是沒法處理毫秒(millisecond)單位的編輯,不然用 Extract 方式切割很快速的。(ffmpeg 應該也有相同的指令可以弄不過暫時懶得找,都英文看不懂)

調整影片時,推薦使用的幾個參數。

影片長度(duration)

有時你只是要測試參數跑下去的結果,所以不需要整個影片都處理,剪開始的幾秒來確認就好。

-ss 00:00:00 -t 00:00:10

切割大小(crop)

有些片源,錄出來會有黑邊,或是因為比例不對而有黑邊之類的,用這先切掉黑邊再說。四組數字依序是「(出來的)寬」「(出來的)高」「(起始的)x軸」「(起始的)y軸」。

-filter:v "crop=960:694:160:13"

長寬比例(aspect)

忽略影片本身的寬高,直接指定要用什麼比例,來播放影片。數字基本上是自由填寫的,但不可以使用小數點,碰上要使用「2.21:1」之類的,請用「221:100」來代替。

-aspect 16:9

縮放影片(scale , resize)

調整影片本身的寬高尺寸,會直接影響檔案的容量大小,所以當然會失真比較嚴重,請在必要時才使用,不然只需要用 aspect 調整即可。

另外,無法跟上面的同時使用,一定要針對處理完的影片,才能縮放尺寸,所以請分開跑另一道指令,或同一行指令,用 && 分開跑兩次 ffmpeg 指令。

-vf scale=960:540

參考資料

加入字幕(檔)

ffmpeg 可以把影片跟字幕合併,輸出成一個新的多媒體封裝格式(mp4、mkv、avi 等,只包裝檔案不破壞性壓縮原始資料),所以如果手上有現成的字幕檔,或是要手動打上字幕(檔)時,就可以用 ffmpeg 快速無損處理。

或是如果你要上傳到 YouTube 的話,用網站內建的字幕功能也可以。

參考資料

旋轉影片(順時針、逆時針)

(※註:我目前並無法正常壓出旋轉過的影片)

逆時針轉 90 度

ffmpeg -i foo bar -vf "transpose=2"

transpose 後面數字的意思

0 = 90CounterCLockwise and Vertical Flip (default) // 順時針右轉 90 度並垂直置中
1 = 90Clockwise // 順時針右轉 90 度
2 = 90CounterClockwise // 逆時針左轉 90 度
3 = 90Clockwise and Vertical Flip // 逆時針左轉 90 度並垂直置中

逆時針轉 180 度

ffmpeg -i foo bar -vf "transpose=2,transpose=2"

參考資料

rotation - Rotating videos with FFmpeg - Stack Overflow

gif 動畫圖連續重播到指定時間長度

ffmpeg -ignore_loop 0 -i foo.gif -t 10 bar.mp4

把 -t 後的 10 改成想要的秒數長度即可

參考資料

2 comments:

匿名 提到...

請問要分割的時候也是最好從關鍵影格切割嗎?

wini 提到...

>匿名

你好,照時間軸( hh:mm:ss.xxx )切割的話,不需要管關鍵影格。

如果你有相關需求,可以自行 Google 以下關鍵字,應該會找到比較符合你需要的文章。
1. ffmpeg Keyframe
2. ffmpeg 關鍵影格

其他一些教學,這邊有找到一篇,可以參考看看。
初學者之卷: FFmpeg 簡易教學

 

本站著作(不包含圖片、影音以及回應留言)係採用 Creative Commons 姓名標示-非商業性-相同方式分享 2.5 台灣 (中華民國) 授權條款授權