Ffmpeg

如何使用 ffmpeg 將 MPEG 影片分成 10 分鐘的塊?

  • July 12, 2021

開源或活躍的開發者社區通常需要線上發布大型影片片段。(聚會影片、露營、技術講座……)由於我是開發人員而不是攝像師,我不想在高級 Vimeo 帳戶上花費額外的划痕。那麼我如何獲取 12.5 GB (1:20:00) MPEG 技術談話影片並將其分割成 00:10:00 的片段以便於上傳到影片共享網站?

$ ffmpeg -i source-file.foo -ss 0 -t 600 first-10-min.m4v
$ ffmpeg -i source-file.foo -ss 600 -t 600 second-10-min.m4v
$ ffmpeg -i source-file.foo -ss 1200 -t 600 third-10-min.m4v
...

將其包裝到一個腳本中以循環執行它並不難。

請注意,如果您嘗試根據呼叫的持續時間輸出計算迭代次數,該ffprobe呼叫是根據剪輯開始時的平均比特率和剪輯的文件大小估計-count_frames的,除非您提供參數,這會大大減慢其操作.

要注意的另一件事是-ss命令行上選項的位置很重要。我現在擁有它的地方很慢但很準確。該答案的第一個版本提供了快速但不准確的替代方案。連結的文章還描述了一種快速但仍然準確的替代方案,您需要為此付出一些複雜性。

除此之外,我不認為你真的想為每個剪輯精確地剪輯 10 分鐘。這將在句子的中間放置切口,甚至是單詞。我認為您應該使用影片編輯器或播放器來找到相隔不到 10 分鐘的自然剪切點。

假設您的文件採用 YouTube 可以直接接受的格式,則您無需重新編碼即可獲取片段。只需將自然剪切點偏移量傳遞給ffmpeg,告訴它使用“複製”編解碼器將編碼的 A/V 原封不動地傳遞:

$ ffmpeg -i source.m4v -ss 0 -t 593.3 -c copy part1.m4v
$ ffmpeg -i source.m4v -ss 593.3 -t 551.64 -c copy part2.m4v
$ ffmpeg -i source.m4v -ss 1144.94 -t 581.25 -c copy part3.m4v
...

-c copy參數告訴它將所有輸入流(音頻、影片和可能的其他流,如字幕)原樣複製到輸出中。對於簡單的 A/V 程序,它相當於更詳細的標誌-c:v copy -c:a copy或舊式標誌-vcodec copy -acodec copy。當您只想複製一個流但重新編碼另一個流時,您將使用更詳細的樣式。例如,多年前 QuickTime 文件的常見做法是使用 H.264 影片壓縮影片,但將音頻保留為未壓縮的 PCM;如果您今天遇到了這樣的文件,您可以對其進行現代化改造,-c:v copy -c:a aac只重新處理音頻流,而不影響影片。

第一個之後的每個命令的起點是前一個命令的起點加上前一個命令的持續時間。

這是單行解決方案

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment output%03d.mp4

請注意,這不會為您提供準確的拆分,但應該適合您的需求。相反,它將在 之後指定的時間之後的第一幀處剪切segment_time,在上面的程式碼中,它將在 20 分鐘標記之後。

如果您發現只有第一個塊可以播放,請嘗試-reset_timestamps 1按照評論中的說明添加。

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment -reset_timestamps 1 output%03d.mp4

引用自:https://unix.stackexchange.com/questions/1670