0

我正在使用 ffmpeg 将 .avi 文件转换为 .png 图像序列。这个工作得很好:

@ ECHO OFF

FOR %%A IN (*.avi) DO CALL :avi2png "%%A"

:avi2png
ffmpeg.exe -y -i %* -sameq -f image2 -c:v png "%%03d.png"

ECHO.
GOTO :EOF

但我希望脚本从当前正在处理的 .avi 文件中提取不带扩展名的名称。这是图像序列的样子:currentavi001.pngcurrentavi002.png等。我想出的脚本不起作用:

@ ECHO OFF

FOR %%A IN (*.avi) DO CALL :avi2png "%%A"

:avi2png
ffmpeg.exe -y -i %* -sameq -f image2 -c:v png "%%~nA%%03d.png"

ECHO.
GOTO :EOF

%~nA和都试过了%%~nA,但无济于事。脚本返回这个:

Couldn't open file : 
av_interleaved_write_frame(): Input/output error.

我是一个完全的外行,并欢迎每一点帮助。

4

2 回答 2

0

我无法得到上述答案来为我工作。我采用 2 文件方法,每个批处理文件中有 1 行代码,每秒创建一个文件名为 ORIGINALFILENAME_#####.png 的图像。根据您的 ffmpeg.exe 文件的位置以及您为文件命名的任何内容更新您的路径以创建拇指。我正在使用 Windows 7,这对我有用。

包含视频的文件夹中的批处理文件(随意命名)以调用 CreateThumbs.bat 文件:

对于 (*.avi) 中的 /r %1 %%i 执行 "c:\Program Files (x86)\ffmpeg\CreateThumbs.bat" %%i

ffmpeg 文件夹中的 CreatThumbs.bat 以创建拇指:

"c:\Program Files (x86)\ffmpeg\bin\ffmpeg.exe" -i %1 -r 1 -f image2 %~n1_%%05d.png

于 2014-05-26T18:47:51.267 回答
0

您不能引用%%A:avi2png 中的变量。尝试这个:

@ ECHO OFF

set count=0
FOR %%A IN (*.avi) DO CALL :avi2png "%%A"
goto :eof

:avi2png
set /a count=count+1
set Ncount=00%count%
set Ncount=%Ncount:~-3%
ffmpeg.exe -y -i %* -sameq -f image2 -c:v png "%~n1%Ncount%.png"

ECHO.
GOTO :EOF

如果您在当前目录中有一个名为的文件,my_movie.avi ffmpeg将创建 png my_movie001.png

当您callfor循环中获得标签时,您不能再使用原始for循环变量(在本例中为 %%A),而是:label将其视为单独的批处理文件,并且在该行之后的所有变量:label都被视为传递给批处理的开关文件。

所以这...

Call :label one two thee

...与此一起使用...

:label
Echo %1, %2, %3.

...产生这样的输出:

one, two, three.

就像它是一个独立的批处理文件一样。

哦,also%%A等从未被%%A%%(或%A%,完全不同的变量)引用。如果你这样做(并且%%A==Hello)结果将是Hello%,并且可能会在代码中的某个地方吃掉一个字符,从而导致奇怪的错误。

于 2012-09-02T05:19:11.100 回答