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

%%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

名前の付いた現在のディレクトリにファイルが1つある場合はmy_movie.avi ffmpeg、pngが作成されますmy_movie001.png

callループからラベルを付けると、元のループ変数(この場合は%% A)をfor使用できなくなり、代わりに個別のバッチファイルとして扱われ、その後の行のすべての変数はバッチに渡されるスイッチとして扱われます。ファイル。for:label:label

したがって、この...

Call :label one two thee

...これで動作します...

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

...次のような出力を生成するには:

one, two, three.

スタンドアロンのバッチファイルであるかのように。

ああ、また、などは(または、まったく異なる変数)%%Aによって参照されることはありません。そうすると(そして)結果は、コードのどこかで文字を食べてしまい、奇妙なエラーが発生する可能性があります。%%A%%%A%%%A==HelloHello%

于 2012-09-02T05:19:11.100 に答える
0

私は上記の答えを私のために働かせることができませんでした。各バッチファイルに1行のコードを含む2ファイルのアプローチを採用して、ファイル名がORIGINALFILENAME_#####。pngの画像を毎秒作成します。ffmpeg.exeファイルの場所と、サムを作成するためにファイルに名前を付けたものに応じて、パスを更新します。私はWindows7を使用していますが、これでうまくいきます。

CreateThumbs.batファイルを呼び出すために、ビデオのあるフォルダー内のファイルをバッチ処理します(任意の名前を付けます)。

for / r%1 %% i in(* .avi)do "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 に答える