我已经使用程序 youtube-dl 下载了YouTube播放列表,我选择了单独下载视频和音频,我现在有一个充满视频的文件夹,其中包含我希望的相应音频与ffmpeg合并在一起。
我需要使用批处理脚本来执行此操作,但是问题是youtube-dl在原始文件的标题后添加了偶然的字母,因此视频与相应的音频名称不同,文件名看起来像这样:< / p>
First title in the playlist 5J34JG.mp4
First title in the playlist H3826D.webm
Second title in the playlist 3748JD.mp4
Second title in the playlist 6SHJFZ.webm
如何使用Windows批处理脚本和ffmpeg合并这些多个视频/音频文件?
编辑:我忘了提到.webm文件是音频文件,并且我有多个文件,无法一一重命名。
答案 0 :(得分:0)
@echo off
setlocal
set "outdir=muxed"
if not exist "%outdir%" md "%outdir%" || exit /b 1
:: Get each mp4 file and call the label to mux with webm file.
for %%A in (*.mp4) do call :mux "%%~A"
exit /b
:mux
setlocal
set "videofile=%~1"
set "name=%~n1"
:: Last token of the name is the pattern to remove.
for %%A in (%name:-=- %) do set "pattern=-%%~A"
:: Remove the pattern from the name.
call set "name=%%name:%pattern%=%%"
:: Get the webm filename.
for %%A in ("%name%-*.webm") do set "audiofile=%%~A"
:: Mux if webm file exist and output file does not exist.
if exist "%audiofile%" if not exist "%outdir%\%name%.mp4" (
ffmpeg -i "%videofile%" -i "%audiofile%" -c copy "%outdir%\%name%.mkv"
)
exit /b
该脚本将首先使输出目录保存mp4 文件,以便输出不会成为输入。
主for
循环将获取每个mp4文件名。 :mux
标签以mp4文件名作为参数调用。
变量videofile
存储mp4文件名和
变量name
仅存储不带扩展名的名称。
name
的最后一个标记将是 YTID 模式,而
for
循环会将最后一个令牌设置为pattern
。
call set
将用
名称。这将提供可以与通配符一起使用的名称
找到webm文件名。 for
循环将获取webm
文件名。
如果目标确实存在而不是输出文件,则 ffmpeg会将这两个文件混合成一个输出文件。
输出文件容器格式为mkv。
答案 1 :(得分:0)
由于我需要做类似的事情,所以我发布了较短的代码来帮助其他人。
这是在子文件夹中
FOR /F "tokens=*" %%f IN ('dir /b /s F2M\*.mp4') DO ffmpeg -i "%%~dpnxf" -i "%%~dpnf.m4a" -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 "F2M\%%~nf-clean.mp4"
这是为了在同一目录中执行
for %%f in (*.mkv) do ffmpeg -i "%%~dpnxf" -i "%%~dpnf.m4a" -c:v copy -c:a copy -map 0:0 -map 0:1 -shortest "%%~nf-remux.mp4"
这是ffmpeg不在同一文件夹中
set ffmpeg=C:\ffmpeg.exe
for %%a in (*.mkv) do "%ffmpeg%" -i "%%~dpnxf" -i "%%~dpnf.m4a" -c:v copy -c:a copy -map 0:0 -map 1:0 -shortest "%%~nf-remux.mp4"
只是示例代码,未专门为OP设置格式。谨慎使用。