2012-08-30 32 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