일부 프레임을 잃지 않고 비디오에서 프레임을 가져오는 방법은 무엇입니까?

일부 프레임을 잃지 않고 비디오에서 프레임을 가져오는 방법은 무엇입니까?

30개의 PNG 이미지, 15프레임/초에서 AVI 파일을 만들었습니다.

ffmpeg -i %02d.png -r 15 video.avi

하지만 AVI에서 이미지를 다시 가져오려고 했을 때:

ffmpeg -i src.avi %02d.png

이미지가 19개밖에 없는데 30개네요! 나는 또한 다음 두 가지를 시도했습니다.

ffmpeg -i src.avi -r 15 %02d.png
ffmpeg -r 15 -i src.avi %02d.png

둘 다 같은 결과입니다. 누락된 프레임이 있다는 것은 말할 필요도 없습니다(예를 들어 4번째에서 6번째로 점프). 어떻게, 어떻게 해결하나요?

첫 번째 명령의 출력( ffmpeg -i %02d.png -r 15 video.avi):

ffmpeg version N-50314-gf6fff8e Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb 25 2013 21:57:41 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 17.103 / 52. 17.103
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.100 / 54. 63.100
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 41.100 /  3. 41.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '%02d.png':
  Duration: 00:00:01.20, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 713x386 [SAR 3779:3779 DAR 713:386], 25 fps, 25 tbr, 25 tbn, 25 tbc
Output #0, avi, to 'video.avi':
  Metadata:
    ISFT            : Lavf54.63.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 713x386 [SAR 1:1 DAR 713:386], q=2-31, 200 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> mpeg4)
Press [q] to stop, [?] for help
frame=   19 fps=0.0 q=2.0 Lsize=      46kB time=00:00:01.26 bitrate= 297.1kbits/s dup=0 drop=11    

video:40kB audio:0kB subtitle:0 global headers:0kB muxing overhead 15.248175%

두 번째 명령의 출력( ffmpeg -i video.avi %02d.png):

ffmpeg version N-50314-gf6fff8e Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb 25 2013 21:57:41 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 17.103 / 52. 17.103
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.100 / 54. 63.100
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 41.100 /  3. 41.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, avi, from 'video.avi':
  Metadata:
    encoder         : Lavf54.63.100
  Duration: 00:00:01.27, start: 0.000000, bitrate: 297 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 713x386 [SAR 1:1 DAR 713:386], 15 tbr, 15 tbn, 15 tbc
Output #0, image2, to '%02d.png':
  Metadata:
    encoder         : Lavf54.63.100
    Stream #0:0: Video: png, rgb24, 713x386 [SAR 1:1 DAR 713:386], q=2-31, 200 kb/s, 90k tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> png)
Press [q] to stop, [?] for help
frame=   19 fps=0.0 q=0.0 Lsize=N/A time=00:00:01.26 bitrate=N/A    

video:129kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.016665%

답변1

입력과 출력의 프레임 속도가 동일함

-framerate이미지 입력에 대한 프레임 속도를 설정하려면 입력 옵션으로 사용합니다 . 예:

ffmpeg -framerate 15 -i %02d.png -pix_fmt yuv420p output.mp4

-framerate 25이 옵션을 생략하면 기본값이 적용됩니다. 위의 예와 같이 입력 프레임 속도만 제공하는 경우 ffmpeg는 프레임을 삭제하거나 복제하지 않고 출력에 대해 동일한 프레임 속도를 상속합니다.

-pix_fmt yuv420pH.264 영상 출력 시 호환성을 위해 추가하는 것을 권장합니다.

입력 및 출력에 대한 서로 다른 프레임 속도

입력 프레임 속도와 출력 프레임 속도를 변경하려면 -r출력 옵션을 추가하세요. 입력의 프레임 속도는 낮지만 호환성을 위해 더 표준적인 출력 프레임 속도를 원하는 경우에 유용할 수 있습니다.

ffmpeg -framerate 1 -i input_%03d.png -r 24 -pix_fmt youv420p output.mp4

위의 예는 초당 하나의 입력 프레임을 표시하지만 출력 프레임은 복제되므로 출력은 실제로 초당 24프레임으로 재생됩니다.

관련 정보