我正在尝试自动将字幕添加到包含一些视频的文件夹中,因此我编写了以下脚本:
forfiles /p "C:\Users\titos\Resilio_Sync\4K_Video_Downloader\videoprocess" /m *.mp4 /C "cmd /c set filename=@fname & ffmpeg -i @file -vf subtitles="C:\Users\titos\Resilio_Sync\4K_Video_Downloader\videoprocess\@fname.srt" -f mp4 "C:\Users\titos\Resilio_Sync\4K_Video_Downloader\donesubs\@fname_srt.mp4""
但是,脚本为每个视频抛出以下错误:
[AVFormatContext @ 0000020c20220680] Unable to choose an output format for 'Der'; use a standard extension for the filename or specify the format manually.
[out#0 @ 0000020c20220580] Error initializing the muxer for Der: Invalid argument
Error opening output file Der.
Error opening output files: Invalid argument
在这种情况下,“Der”是视频标题的第二个单词(它对每个视频执行相同的操作,在第二个单词中抛出错误)。所以我认为这可能是由于视频包含空格而 ffmpeg 无法正确解析它?但在这种情况下,为什么它得到的是第二个单词而不是第一个呢?更重要的是,我能做些什么来解决这个问题?
老实说,我发现了一些其他讨论类似问题的线程,但坦率地说,我仍然是新手,无法理解任何答案以使其适应我的脚本,哈哈。感谢您的帮助,提前非常感谢:)
我设置了一个目录,其中包含一些与问题名称格式匹配的虚拟文件,并简单地
echo
编辑了结果 ffmpeg
行。结果是这样的形式
set filename="1 der 1" _and_ ffmpeg -i "1 der 1.mp4" -vf
subtitles=subtitledir\"1 der 1".srt -f mp4 donesubsdir\"1 der 1"_srt.mp4
(好的 - 为了便于查看,我已经打破了界限,并用
subtitledir
和 donesubsdir
代替了目录名称。)
观察到引用的文件名出现在字符串中,并推测
ffmpeg
可能对这种结构有困难,我建议
SET "vpath=U:\Users\titos\Resilio_Sync\4K_Video_Downloader\videoprocess"
FOR /f "delims=" %%e IN ('dir /b /a-d "%vpath%\*.mp4" 2^>nul') DO ECHO ffmpeg -i "%vpath%\%%~ne" -vf subtitles="subtitledir\%%~ne.srt" -f mp4 "donesubsdir\%%~ne_srt.mp4"
您需要跟随弹跳球进行
subtitledir
和donesubsdir
。
我的结果是:
ffmpeg -i "U:\Users\titos\Resilio_Sync\4K_Video_Downloader\videoprocess\1 der 1" -vf
subtitles="subtitledir\1 der 1.srt" -f mp4 "donesubsdir\1 der 1_srt.mp4"
(好的 - 为了便于查看,我已经打破了界限,并用
subtitledir
和 donesubsdir
代替了目录名称。)
理论:
命令
dir /b /a-d "%vpath%\*.mp4" 2^>nul
被执行并仅生成文件名行 (/b
),没有应用于 /a-d
的目录名 (%%e
)。“delims=”告诉 for
不需要标记化,所以整个名字出现在 %%e
,The 2^>nul
抑制错误消息 - ^
告诉 cmd
>
是 dir
命令的一部分,而不是 for
。
(SO 上发布了数百甚至数千个类似的应用程序)
请参阅
for /?
或 SO 上的数千个示例,了解元变量修饰符的使用。
那么
%%~ne
就是 %%e
中文件名的名称部分。