2012-08-30 36 views
0

我正在使用ffmpeg将.avi文件转换为.png图像序列。这一个非常有效:ffmpeg视频图像序列批处理文件

@ 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. 

我是一个完全的门外汉,并欢迎每一位的帮助。

回答

0

您不能参考:avi2png中的%%A变量。如果你有一个名为my_movie.aviffmpeg将创建PNG my_movie001.png当前目录下一个文件

@ 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 

:试试这个。

当你callfor循环的标签,你可以不再使用原来的for循环变量(在这种情况下%% A),而不是:label被视为一个单独的批处理文件,后上线的所有变量:label被视为传递给批处理文件的开关。

所以这...

Call :label one two thee 

... works。这...

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

...产生这样的输出:

one, two, three. 

正如如果它是一个独立的批处理文件。

哦,%%A等也从未被%%A%%(或%A%,一个完全不同的变量)所指。如果你这样做(和%%A==Hello)结果将是Hello%,并且可能会在代码中某处出现某个字符,从而导致奇怪的错误。

+0

产生请求输出的固定代码。 –

+0

感谢詹姆斯的彻底回应。对于像我这样的完整小菜鸟来说,批量脚本就像是仔细地走过雷区。当我回家时,我会试用这些代码,并且可以访问我的电脑,而不仅仅是我的电话。 –

+0

@DaleCooper如果我的答案适合您,请将其选为答案。 :) –

0

我无法得到上述答案为我工作。我在每个批处理文件中使用2行代码的方式创建一个图像,文件名为ORIGINALFILENAME _ #####。png。根据您的ffmpeg.exe文件的位置以及您命名该文件创建拇指的更新路径。我使用的是Windows 7,这对我很有用。

批处理文件与视频文件夹(将其命名为任何你想要的)来调用CreateThumbs。bat文件:

为/ R%1 %%我在(* .AVI)做 “C:\ Program Files文件(x86)的\ ffmpeg的\ CreateThumbs.bat” %%我

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

“C:\ Program Files文件(x86)的\ ffmpeg的\ BIN \ ffmpeg.exe” -i%1 -r -f 1%图像2〜N1 _ %% 05d.png