首页 > 解决方案 > 使用标题元数据作为输出文件名 ffmpeg

问题描述

是否可以获取输入文件的标题元数据,并将其用作输出文件的文件名?我正在尝试对一系列视频文件进行编码,并且我想自动将剧集的名称附加到文件名中,但是我对使用 ffmpeg 还是很陌生,到目前为止,谷歌搜索被证明是不成功的。

我也在尝试编写一个对整个文件夹进行编码的批处理脚本,目前它看起来像for %%a in ("*.mkv") do ffmpeg -i %%a -filter_complex "[0:v][0:s:1]overlay[subs];[subs]scale=960:720" -map 0:a:1 -acodec copy -sn test.mp4

我应该用什么代替“test.mp4”?

标签: batch-fileffmpeg

解决方案


因此,在 Ilogan 的帮助下,我设法找到了我想要的答案,即使它实际上还不能正常工作,但我决定在这里写下我到目前为止设法找到的东西,部分适合我,其他可怜的灵魂的一部分。

因此,按照 Ilogan 的提示,我设法发现ffprobe -v error -select_streams v:0 -show_entries stream_tags=title -of csv=p=0 "%%a"确实有效并返回了在视频流中编码的标题元数据。

接下来是在批处理文件中使用它作为变量,这已经被回答了好几次,但我也会在此处包含它:您希望将命令包含在具有以下外观的 for 循环中:FOR /F "delims=" %%g IN ('ffprobe -v error -select_streams v:0 -show_entries stream_tags^=title -of csv^=p^=0 "%%a"') do (SET title^=%%g)重要部分:一些教程显示"tokens=*" 而不是 "delims=" 这可能会起作用,但我认为 delims 在这里会更好。最重要的部分是命令包含等号,您需要使用插入符号^来转义并让命令行正确解析这些。

剩下的问题是我的脚本目前看起来像这样:

for %%a in ("*.mkv") do (
FOR /F "tokens=*" %%g IN ('ffprobe -v error -select_streams v:0 -show_entries stream_tags^=title -of csv^=p^=0 "%%a"') do (SET title=%%g)
ffmpeg -i "%%a" -filter_complex "[0:v][0:s:1]overlay[subs];[subs]scale=960:720" -map 0:a:1 -acodec copy -sn "%title%.mp4")) 

似乎windows正在运行文件中第一次出现的命令,到那时标题变量仍然是空的 - 结果我得到了名为“.mp4”的文件并且仍在弄清楚如何处理它

编辑:好的,所以我发现你需要做的是放在setlocal enabledelayedexpansion开头,并且标题变量需要用感叹号,而不是百分号,它可以工作!我对其进行了测试,它正确地创建了带有标题的文件。


推荐阅读