
我想使用 ffmpeg-normalize 來標準化 100 個 mp4 視訊檔案的音量。有沒有一種方法可以讓程式運行所有這些文件以確定適當的級別 - 或者我必須給它一個文件作為輸入?它可以轉換整個資料夾而不列出 100 個檔案名稱嗎?我嘗試使用 ffmpeg-normalize *.mp4 (而命令列提示符位於視頻目錄中),但它給出錯誤“文件 *.mp4 不存在” 我在 Windows 系統上使用 ffmpeg,但我會通過nVidia Shield 上的KODI 播放器播放檔案。我只是希望能夠在音量沒有大幅波動的情況下播放影片。
答案1
該ffmpeg-normalize
工具可以使用多個文件作為輸入。通配符*.mp4
是 Linux 特定的。在 Windows 上,您可以使用一個簡單的循環,如README
ffmpeg-normalize 中所述:
for %%f in ("*.mp4") do ffmpeg-normalize "%%f" -c:a aac -b:a 192k -ext mp4
這將在 資料夾中建立輸出文件normalized
,並帶有mp4
擴展名和 AAC 編碼(標準化)音訊串流。
由於預設設定是使用 EBU R 128 響度歸一化和給定的目標音量,因此您不必擔心「對齊」多個檔案。只需在所有這些上運行即可。
對於使用問題,請先閱讀 README;否則在 GitHub 上發布問題。
答案2
我見過一個 Windows 解決方案,就像我在這裡製作的那樣,由其他人多年前創建 - 但我不知道它叫什麼,也不知道從哪裡獲得它。我還認為它僅適用於 AVI 文件。我已經從頭開始編寫自己的程式來處理 MP4。我想與任何有興趣的人分享這一點,因為這個網站對我的幫助很大,讓我達到了這一點。
我在 Windows 10 中編寫了一個 DOS 批次腳本,它可以獲取多個 *mp4 檔案(是的 - 名稱中帶有空格)並使用 mp3gain 標準化音量。 (我嘗試了 MP4GAIN,但試用期大約 1 小時就結束了)。我發現,這個處理速度比 MP4GAIN 快得多。我這樣做是因為我可以專門控制 ffmpeg 和 mp3gain 的每一步,並執行 mp4gain 或 ffmpeg-normalize 可能無法執行的操作。
無論如何,它並不是萬無一失的,也不是優化的。相反,它可以成為某人為了自己的目的進行調整/調整的跳板。我將音訊提取為 mp3 VBR,讓 mp3gain 發揮其魔力,然後將其放回去。我發現我可以處理 5 個並發標準化,但如果您想一次嘗試更多,則受可用硬碟空間的限制。
建立資料夾 - C:\Vids 可以在任何位置,但其中包含原始、工作和已完成的資料夾。
C:\Vids
C:\Vids\original
C:\Vids\working
C:\Vids\completed
下載最新版本 - 據我檢查,自 2020 年 9 月 1 日起它們是免費的。我正在使用以下內容:
C:\Vids\ffmpeg.exe ( ffmpeg version git-2020-08-28-ccc7120 )
C:\Vids\mp3gain.exe ( mp3gain version 1.4.6 )
建立一個C:\Vids\normalize.bat
並將其放入其中:
echo off
setlocal enableextensions enabledelayedexpansion
for %%I in (original\*.mp4) DO (
echo Creating working\%%~nI.bat
echo echo off > "working\%%~nI.bat"
echo echo Unpacking audio and video from %%I . >> "working\%%~nI.bat"
echo echo ..\ffmpeg.exe -v 0 -i "..\%%I" -q:a 0 -map a ".\%%~nI_audio_only.mp3" -vcodec copy -map 0:v ".\%%~nI_video_only.mp4" >> "working\%%~nI.bat"
echo ..\ffmpeg.exe -v 0 -i "..\%%I" -q:a 0 -map a ".\%%~nI_audio_only.mp3" -vcodec copy -map 0:v ".\%%~nI_video_only.mp4" >> "working\%%~nI.bat"
echo echo . >> "working\%%~nI.bat"
echo echo Normalizing extracted audio with Mp3Gain. >> "working\%%~nI.bat"
echo echo ..\mp3gain.exe ".\%%~nI_audio_only.mp3" >> "working\%%~nI.bat"
echo ..\mp3gain.exe ".\%%~nI_audio_only.mp3" >> "working\%%~nI.bat"
echo echo Reconstructing normalized video from component parts. >> "working\%%~nI.bat"
echo echo .\ffmpeg.exe -v 0 -i ".\%%~nI_video_only.mp4" -i ".\%%~nI_audio_only.mp3" -codec copy "..\completed\%%~nI%%~xI" >> "working\%%~nI.bat"
echo ..\ffmpeg.exe -v 0 -i ".\%%~nI_video_only.mp4" -i ".\%%~nI_audio_only.mp3" -codec copy "..\completed\%%~nI%%~xI" >> "working\%%~nI.bat"
echo echo Post-process clean up. >> "working\%%~nI.bat"
echo del ".\%%~nI_audio_only.mp3" >> "working\%%~nI.bat"
echo del ".\%%~nI_video_only.mp4" >> "working\%%~nI.bat"
echo echo Done. >> "working\%%~nI.bat"
echo echo on >> "working\%%~nI.bat"
)
pause
echo on
將原始 mp4 放入您的C:\Vids\original
資料夾中並執行 normalize.bat。我是在 cmd.exe DOS 提示字元下執行此操作,但您也可以在 Windows 資源管理器中雙擊該批次檔。它將在原始資料夾中搜尋 mp4 並在C:\Vids\working
.您可以C:\Vids\working
一次啟動一個、兩個或四個批次檔。
每個原始 mp4 都會解包為無音訊的 mp4 和無視訊的 mp3 VBR。
視訊和音訊提取是同時完成的,認為這可能會產生兩個文件,這些文件可以稍後合併在一起,而視訊或音訊不會比另一個文件短。視訊和音訊摘錄進入C:\Vids\working
.
然後 mp3gain.exe 將針對提取的 mp3 運行,然後音訊和視訊串流將再次與 ffmpeg 合併並放入C:\Vids\completed
資料夾中。
過程完成後,臨時解壓縮的 mp4 和 mp3 將被刪除。
=======
限制:
mp4 的檔案名稱不能包含某些特殊字元(如 ! 或 ♫),但可以包含空格 ( ) [ ] # ' @ - _ 等字元。如果您發現生成的腳本失敗或退出太快且無法處理視訊檔案 - 嘗試重命名原始檔案。
我沒有檢查 ffprobe 來查看嵌入的音訊是否已經是 mp3,我發現並非所有 aac 音訊都可以透過 aacgain.exe 進行標準化。因此,我強制所有內容都以最高品質的 mp3 VBR 格式輸出。如果原始音訊品質足夠,我不介意這樣做。
要求
如果人們可以進一步擴展此腳本以使其了解各種音訊類型,並在已經是 mp3 的情況下進行音訊副本,那將會很有幫助。或承認 AAC 音訊需要轉換為 mp3 或保留為 AAC。
讓它處理其他視訊檔案類型(Avi、mkv、wmv 等)
檢查每個步驟後是否發生故障並退出腳本,並允許恢復功能,以便不需要重新提取。
新增標誌以啟用壓縮視訊檔案使用 libx264 -crf 18 -preset veryslow 來節省一些空間 - 但這會使事情運行得非常慢。
您能想到的任何其他增強功能。
謝謝。
~盧姆