Ffmpeg 没有设置正确的变量名称,因此抛出 Unable to select format

问题描述 投票:0回答:1

我正在尝试自动将字幕添加到包含一些视频的文件夹中,因此我编写了以下脚本:

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 无法正确解析它?但在这种情况下,为什么它得到的是第二个单词而不是第一个呢?更重要的是,我能做些什么来解决这个问题?

老实说,我发现了一些其他讨论类似问题的线程,但坦率地说,我仍然是新手,无法理解任何答案以使其适应我的脚本,哈哈。感谢您的帮助,提前非常感谢:)

batch-file video ffmpeg batch-rename subtitle
1个回答
0
投票

我设置了一个目录,其中包含一些与问题名称格式匹配的虚拟文件,并简单地

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
中文件名的名称部分。

© www.soinside.com 2019 - 2024. All rights reserved.