batch-file - 使用标题元数据作为输出文件名 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”?
解决方案
因此,在 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
开头,并且标题变量需要用感叹号,而不是百分号,它可以工作!我对其进行了测试,它正确地创建了带有标题的文件。
推荐阅读
- indexing - 为什么需要引用索引?
- r - 为什么在 geom_boxplot 中使用 'varwidth=TRUE' 时我的箱线图没有正确对齐?
- javascript - 为所有 div 元素操作内容#(使用 role="tabpanel") - style="display: none;" 显示:块;
- r - 如何使用 R 重塑多行以分隔列 - 从长到宽?
- javascript - 如何在 Web 应用程序中使用 nodejs 创建微软团队会议链接
- matplotlib - 绘制长时间段的音频数据属性
- python - 是否有 python 函数可以为 LightGBM 迭代添加进度条?
- angular - 无法绑定到“ngForOf”,因为它不是“ng-container”的已知属性
- file - 为 Ant Jar 构建执行 Bat 文件时出现问题
- apache-flink - Flink 用于无状态处理