FFmpeg — bкак разделить видеофайл на png картинки?

Файл cut_1.avi (15 секунд, 25fps) нужно разделить на png картинки.
Я создал папку test, в которую положил ffmpeg.exe и cut_1.avi.
В этой же папке создал папку cut_1_images. Там должны появиться png файлы.

И создал бат файл, в котором прописал следующее:

rem Выбор текущей папки
%~d1
cd "%~p1"
ffmpeg -i cut_1.avi -r 25 -f image2 cut_1_images\images%05d.png
@pause


Но возникает ошибка

C:\TEMP\test>rem ╨Т╤Л╨▒╨╛╤А ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨┐╨░╨┐╨║╨╕

C:\TEMP\test>cd ""
C:\TEMP\test

C:\TEMP\test>ffmpeg -i cut_1.avi -r 25 -f image2 cut_1_images\images"C:\TEMP\tes
t\jpg_from_video.cmd"5d.png
ffmpeg version git-2019-11-13-4e0860e Copyright (c) 2000-2019 the FFmpeg develop
ers
  built with gcc 9.2.1 (GCC) 20191010
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfi
g --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libb
luray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enab
le-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --e
nable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable
-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 -
-enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enab
le-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --en
able-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcode
c --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 -
-enable-avisynth --enable-libopenmpt --enable-amf
  libavutil      56. 35.101 / 56. 35.101
  libavcodec     58. 62.100 / 58. 62.100
  libavformat    58. 35.100 / 58. 35.100
  libavdevice    58.  9.100 / 58.  9.100
  libavfilter     7. 66.100 /  7. 66.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Input #0, avi, from 'cut_1.avi':
  Metadata:
    encoder         : Lavf58.35.100
  Duration: 00:00:16.04, start: 0.000000, bitrate: 102750 kb/s
    Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv420p, 1920x1080, 102861 kb/
s, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, fltp, 128 k
b/s
Stream mapping:
  Stream #0:0 -> #0:0 (ffv1 (native) -> png (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'cut_1_images\imagesC:\TEMP\test\jpg_from_video.cmd5d.png'
:
  Metadata:
    encoder         : Lavf58.35.100
    Stream #0:0: Video: png, rgb24, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb
/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.62.100 png
[image2 @ 0000000000464540] Could not open file : cut_1_images\imagesC:\TEMP\tes
t\jpg_from_video.cmd5d.png
av_interleaved_write_frame(): I/O error
frame=    5 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A dup=3 drop=0 s
peed=0.165x
video:6kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing ove
rhead: unknown
Conversion failed!
Для продолжения нажмите любую клавишу . . .


Could not open file : cut_1_images\imagesC:\TEMP\test\jpg_from_video.cmd5d.png - ???
Разумеется, такого у меня нет.

Как разделить видеофайл на png картинки? Как правильно написать команду?
  • Вопрос задан
  • 925 просмотров
Решения вопроса 1
nidalee
@nidalee
Слишком много лишнего указываете. Для ваших целей достаточно
ffmpeg -i <input> cut_1_images\images%%05d.png
-f вам не нужен, png - всегда png native.
-r тоже, потому что ffmpeg сам прекрасно опознает фреймрейт видео.
Возможно, стоит указать полный путь до папки, с буквы диска. Также хорошо избежать пробелов в этом пути.
Также не понял, зачем вы опознаете и делаете cd в папку, из который запускаете bat-ник, он и так работает из своей папки, просто не запускайте его от админа, ему это и не нужно.

Лучше уж тогда сделайте так:
@echo off
SETLOCAL
:hugly
if "%~1" EQU "" goto mugly
md images
ffmpeg -i "%~1" images\images%%05d.png
shift
goto hugly
:mugly
pause

Потом просто перетаскиваете на сам bat-ник свой AVI файл, он создаст для кадров папку "images" и в нее их извлечет. Если я нигде в коде не опечатался, конечно. Только не забудьте, что папка всегда одна и та же, переименовывайте ее после извлечения кадров.

UP: Переписал оба примера под Windows, решением было добавить к % еще один.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы