ffmpeg 批处理文件故障排除。 mkv 到 mp4 转换与字幕硬编码
Troubleshooting ffmpeg batch-file. mkv to mp4 conversion with subtitle hardcode
我正在尝试将大量 .mkv 视频文件批量转换为 .mp4,同时对 .mkv 文件中包含的字幕进行硬编码。我想尽可能保留质量。
我不擅长使用 ffmpeg 或编写批处理文件,所以我一直在网上搜索可以满足我需要的批处理文件。我找到了一些在没有字幕的情况下成功转换的,我发现了一个包含对字幕进行硬编码的命令,但是那个也有我不想深入研究的过多命令,所以我试图组合相关部分这两个脚本。这显然是问题所在。
for %%a in (*.mkv) do ffmpeg -i "%%~a" -vf subtitles=%%~na.mkv copy -c:a aac -q:a 100 "%%~na.mp4"
pause
值得注意的是,脚本原为:
for %%a in (*.mkv) do ffmpeg -i "%%~a" -vcodec copy -c:a aac -q:a 100 "%%~na.mp4"
pause
但我尽我所能对其进行了更改,以包括我发现的一段脚本,该脚本显然应该对字幕进行硬编码。我对这种脚本语言的实际功能缺乏了解,这可能只是让我将命令插入错误的位置或以错误的方式插入。我希望背景信息能让这个问题更容易解决。
预期结果:转换当前文件夹中的每个 .mkv 文件,并将 .mp4 文件保留在同一文件夹中。
实际结果:
[NULL @ 0000026a399f1440] Unable to find a suitable output format for 'copy': Invalid argument.
不是批处理文件用户,但我可以对 ffmpeg
命令发表评论。使用:
for %%a in (*.mkv) do ffmpeg -i "%%~a" -vf subtitles=%%~na.mkv "%%~na.mp4"
pause
您不能将 -vcodec copy
/-c:v copy
与 -vf
一起使用,因为过滤需要编码。
如果输入音频已经是 AAC,则添加 -c:a copy
流复制(重新复用)音频而不是重新编码。
这将依赖默认的stream selection behavior。如果您想要 include/exclude 某些流,例如您的输入有多个视频 and/or 音频流,请参阅 -map
选项。
我想通了,感谢这里的人的评论帮助我搜索了相关信息。
一个主要且最令人尴尬的问题是原始批处理文件是 Linux 格式,而我 运行 在 Windows。
这是我通过编辑别人的批处理文件拼凑而成的工作批处理文件。我也会给原来的批处理文件留下一个link。
for %%A IN (*.mkv) DO ffmpeg -i "%%A" -vf subtitles="%%A" "%%A.mp4"
pause
这是我从中获得原始代码的地方:https://superuser.com/questions/470500/batch-convert-avi-files-using-ffmpeg#470510
这是我获得有关对字幕进行硬编码的信息的地方:https://superuser.com/questions/932730/ffmpeg-mkv-to-mp4-conversion-loses-subtitles
再次感谢:)
我正在尝试将大量 .mkv 视频文件批量转换为 .mp4,同时对 .mkv 文件中包含的字幕进行硬编码。我想尽可能保留质量。
我不擅长使用 ffmpeg 或编写批处理文件,所以我一直在网上搜索可以满足我需要的批处理文件。我找到了一些在没有字幕的情况下成功转换的,我发现了一个包含对字幕进行硬编码的命令,但是那个也有我不想深入研究的过多命令,所以我试图组合相关部分这两个脚本。这显然是问题所在。
for %%a in (*.mkv) do ffmpeg -i "%%~a" -vf subtitles=%%~na.mkv copy -c:a aac -q:a 100 "%%~na.mp4"
pause
值得注意的是,脚本原为:
for %%a in (*.mkv) do ffmpeg -i "%%~a" -vcodec copy -c:a aac -q:a 100 "%%~na.mp4"
pause
但我尽我所能对其进行了更改,以包括我发现的一段脚本,该脚本显然应该对字幕进行硬编码。我对这种脚本语言的实际功能缺乏了解,这可能只是让我将命令插入错误的位置或以错误的方式插入。我希望背景信息能让这个问题更容易解决。
预期结果:转换当前文件夹中的每个 .mkv 文件,并将 .mp4 文件保留在同一文件夹中。
实际结果:
[NULL @ 0000026a399f1440] Unable to find a suitable output format for 'copy': Invalid argument.
不是批处理文件用户,但我可以对 ffmpeg
命令发表评论。使用:
for %%a in (*.mkv) do ffmpeg -i "%%~a" -vf subtitles=%%~na.mkv "%%~na.mp4"
pause
您不能将
-vcodec copy
/-c:v copy
与-vf
一起使用,因为过滤需要编码。如果输入音频已经是 AAC,则添加
-c:a copy
流复制(重新复用)音频而不是重新编码。这将依赖默认的stream selection behavior。如果您想要 include/exclude 某些流,例如您的输入有多个视频 and/or 音频流,请参阅
-map
选项。
我想通了,感谢这里的人的评论帮助我搜索了相关信息。
一个主要且最令人尴尬的问题是原始批处理文件是 Linux 格式,而我 运行 在 Windows。
这是我通过编辑别人的批处理文件拼凑而成的工作批处理文件。我也会给原来的批处理文件留下一个link。
for %%A IN (*.mkv) DO ffmpeg -i "%%A" -vf subtitles="%%A" "%%A.mp4"
pause
这是我从中获得原始代码的地方:https://superuser.com/questions/470500/batch-convert-avi-files-using-ffmpeg#470510
这是我获得有关对字幕进行硬编码的信息的地方:https://superuser.com/questions/932730/ffmpeg-mkv-to-mp4-conversion-loses-subtitles
再次感谢:)