【问题标题】:merge multiple videos and audios with ffmpeg使用 ffmpeg 合并多个视频和音频
【发布时间】:2018-12-22 05:49:21
【问题描述】:

我已经使用程序 youtube-dl 下载了一个 Youtube 播放列表,我选择单独下载视频和音频,我现在有一个文件夹,里面有我想要的相应音频的视频与ffmpeg合并。

我需要使用批处理脚本来执行此操作,但问题是 youtube-dl 在原始文件的标题后添加了随意的字母,因此视频与其对应的音频名称不同,文件名如下所示:

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 文件是音频文件,我有多个文件,我无法一个一个地重命名它们。

【问题讨论】:

  • 这些后缀不是随机的 - 它们是 YT id。

标签: batch-file ffmpeg video-processing


【解决方案1】:
@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 label 以 mp4 文件名作为参数调用。

变量 videofile 存储 mp4 文件名和 变量name 只存储没有扩展名的名称。

name 的最后一个标记将是 YTID 模式,而 for 循环会将最后一个令牌设置为 pattern

call set 将用“”替换模式 姓名。这将给出一个可以与通配符一起使用的名称 找到 webm 文件名。 for 循环将获取 webm 文件名。

如果目标确实存在而不是输出文件,那么 ffmpeg 会将这两个文件混合到一个输出文件中。

输出文件容器格式为mkv。

【讨论】:

  • 我尝试运行批处理文件,但出现错误'■@' is not recognized as an internal or external command, operable program or batch file. ,我应该将媒体文件放在 ffmpeg 文件夹中吗?我没有注意到的一个细节是文件名和添加到它们的随机字母由破折号 (-) 附加,First title in the playlist-5J34JG.mp4 我希望这不会影响您的脚本,谢谢
  • 方框字符似乎是扩展 ASCII A6,我不知道它来自哪里。扩展 ASCII 可能是一个问题,因此请尽量避免。 @ 来自@echo off,这没关系。另存为新文件并确保 ANSI 或 utf-8 没有 BOM。通过将- 替换为- 来调整破折号的代码以获得模式。该脚本将在 mp4webm 文件所在的当前文件夹中运行。
  • 我从您的帖子中执行了最后一个更新的脚本(使用 ANSI 编码保存)它运行完美并且以正确的方式工作,但我必须将 .mp4 输出更改为 .mkv 否则 ffmpeg 会出错并生成空的 mp4 文件。我还将脚本的第一个版本运行到没有破折号的文件并且它可以工作,但是如果某些文件具有相同的标题,脚本会要求我替换或忽略文件写入,我以 90% 的文件成功转换结束,因为其中一些文件具有相同的标题。
  • 感谢您的帮助,这个脚本解决了我的问题。知道如何编写这样的批处理脚本真的很有用,它可以节省很多时间。
【解决方案2】:

由于我需要做类似的事情,所以我发布了我的简短代码以帮助其他人。

这是在一个子文件夹中

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 格式化。谨慎使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2016-06-13
    相关资源
    最近更新 更多