2017-04-27 105 views
0

我現在正在瀏覽電視劇並編輯文件以符合我的喜好。我有一套有我想要的視頻,一套有音頻。我有一個批處理文件,可以從文件夾「A」中的每個文件獲取視頻,並從文件夾「B」中的每個文件獲取音頻,並將其輸出到名爲「output」的文件夾。但是對於這個特定的系列,這只是我需要完成的一半。將不同長度的視頻和音頻合併爲批量

在文件的每個情節中的「B」文件夾中的結束還有一些額外的東西。我想要做的是從「A」獲取音頻和視頻,從「B」獲取音頻,將它們合併成一個文件,然後拿「A」和「B」文件,比較時間戳,並添加從「B」到輸出文件的額外視頻。

讓我換一種方式。假設「A」是1080p和日本音頻,長度爲20分鐘。假設「B」是720p並帶有英文音頻,長度爲23分鐘。我想要帶有兩個音軌的整個1080p視頻,以及720p視頻拼接到底。兩個文件都始於同一個地點,因此同步不是問題。問題在於,每一集的時間差異都不相同。所以有些劇集長3分鐘,有的只有30秒。有沒有辦法讓ffmpeg或其他工具查看時間差異,並將多餘的內容添加到輸出文件中?

對不起,長時間囉嗦。感謝您的幫助和指導。

+0

如果您準備好轉碼,可以完成此操作。如果是這樣,我會發布一條命令。 – Mulvya

+0

我沒有任何問題轉碼。這兩個文件夾都有mkv格式的視頻。很確定他們都是X264。我現在不在家裏仔細檢查。 – user2981223

+0

Mulvya,我只是想知道你是否可以發佈命令?註釋會很棒。無論哪種方式,我都很擅長編寫代碼並弄清楚它的功能。謝謝! – user2981223

回答

0

我假定A,並在同一時間B開始兩者,因此不需要一個初始同步通。並具有相同的幀率。 A具有所需的視頻1080p,而B具有音頻+附加功能。

ffmpeg -i A.mp4 -i B.mp4 
    -filter_complex 
     "[1][0]scale2ref[b][a];[b][a]overlay=eof_action=pass[v]" 
    -map "[v]" -map 0:a -map 1:a -crf 18 -c:a copy -movflags +faststart out.mp4 

-i A.mp4 -i B.mp4 - 第一,我們提供兩個輸入的ffmpeg。

-filter_complex - 如果我們希望有選擇地將過濾器應用於多個輸入或以某種相互依賴的方式處理它們,則通過-filter_complex設置過濾器圖。將其整個論證用引號括起來是最安全的。

[1][0]scale2ref[b][a] - 所述scale2ref濾波器縮放B視頻是大小爲A的視頻,這是參考相同。然後將這兩個輸出傳遞給覆蓋過濾器。由於B現在與A的尺寸相同,所以A完全覆蓋了基本視頻B.當A終止時,B顯示出通過;添加eof_action以執行此操作 - 默認行爲是A的最後一幀重複直到B的結尾。此過濾器的輸出標記爲[v]

-map "[v]" -map 0:a -map 1:a - ffmpeg的必須是明確告訴其流輸出到包括,否則它會自動選擇它們。這在這種情況下不適合。包括疊加結果,以及兩個音軌。

-c:v libx264 - 因爲我們輸出到MP4,所以默認的編碼器是libx264,這裏沒有指定,但是可能對未來的使用有所幫助。

-crf 18 - 用於libx264推薦的編碼模式是CRF。較小的值可以更好地保持源質量,但會生成較大的文件。 18至28是一個很好的範圍內保持在

-c:a copy - 映射的音頻數據流被複制即,沒有再壓縮。

-movflags +faststart - 處理完成後,ffmpeg會將生成的MP4的索引移動到其前端,以便在網絡流媒體播放過程中快速播放。如果文件不能通過網絡流式傳輸,可以跳過。

+0

非常感謝!我會在稍後嘗試。我很感激! – user2981223

+0

您能否澄清地圖代碼的作用以及每個命令的用途?我幾乎不熟悉你使用的所有代碼,所以你願意給我更多的細節。 – user2981223

+0

你是絕對驚人的 – user2981223