我想使用 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 响度标准化,因此您不必担心“对齐”多个文件。只需在所有文件上运行它即可。
对于使用问题,请先阅读自述文件;否则请在 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
。
然后会对提取的 mp3 运行 mp3gain.exe,然后使用 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 来节省一些空间 - 但这会使运行非常缓慢。
您能想到的任何其他增强功能。
谢谢。
~鲁姆