ffmpeg가 비디오를 출력하지 않습니다


2

ffmpeg를 사용하여 빠른 시간을 더 작은 빠른 시간으로 나누려고합니다. 파이썬에 공급하는 시작 및 종료 지점이있는 csv 파일이 있는데, ffmpeg 명령을 작성합니다. 그러나 비디오가 생성 된 파일 중 일부에 대해 표시되지 않는 것을 알았으므로 명령 줄에서 명령을 직접 실행했습니다.

>ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v copy -c:a copy test.mov
ffmpeg version N-66673-gf0d1b3a Copyright (c) 2000-2014 the FFmpeg developers
  built on Oct  6 2014 22:10:42 with gcc 4.9.1 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
 --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      54.  9.100 / 54.  9.100
  libavcodec     56.  3.101 / 56.  3.101
  libavformat    56.  7.104 / 56.  7.104
  libavdevice    56.  1.100 / 56.  1.100
  libavfilter     5.  1.102 /  5.  1.102
  libswscale      3.  1.100 /  3.  1.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  1.100 / 53.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf56.7.104
  Duration: 00:20:54.46, start: 0.000000, bitrate: 1734 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 1617 kb/s, 24 fps, 24 tbr, 12288 tbn, 24576 tbc (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 113 kb/s (default)
    Metadata:
      handler_name    : DataHandler
File 'test.mov' already exists. Overwrite ? [y/N] y
Output #0, mov, to 'test.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf56.7.104
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 1617 kb/s, 24 fps, 12288 tbn, 12288 tbc (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 113 kb/s (default)
    Metadata:
      handler_name    : DataHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 Lsize=      31kB time=00:00:02.18 bitrate= 115.3kbits/s
video:0kB audio:30kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.003038%

Quicktime은 Adobe Premiere에서 시작되었으며 영화 파일에서 많은 메타 데이터를 제거해야하므로 스크립트가 더 빠르게 실행됩니다. 메타 데이터를 그대로 두어도 차이가 없습니다. 오디오가 올바르게 출력되지만 처음 몇 초 동안 비디오가 누락되는 또 다른 (관련?) 문제가 있습니다.

도움을 주시면 감사하겠습니다.

답변:


2

비트 스트림 ( -c:v copy -c:a copy) 을 복사 할 때 비디오 / 오디오 스트림의 프레임 정확도 (또는 밀리 초 정확도) 분할을 수행 할 수 없습니다 . 출력 비디오는 키 프레임으로 시작해야하고 그렇지 않으면 제대로 재생되지 않으므로 ffmpeg비디오 비트 스트림에서 키 프레임을 찾을 때까지 검색 한 다음 비디오 출력 시작합니다.

특정한 경우 frame=0원본 비디오의 시작 지점과 끝 지점 사이에 키 프레임이 없기 때문에 프레임이 기록되지 않은 것 ( )을 알 수 있습니다. (분명히 일부 오디오는 작성되었지만 기본적으로 오디오 비트 스트림에 액세스 할 수 있습니다.)

정확한 자르기를 원할 경우 비디오를 다시 인코딩하여 새 키 프레임을 생성하는 것이 유일한 선택입니다.

ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v libx264 -c:a aac -strict experimental test.mov

여기에서 품질 설정을 확인해야합니다. x264AAC 안내서를 참조하십시오 . 또한 읽기 는 FFmpeg와 추구 의 위치가 무엇인지 알고 -ss의미한다. 인코딩을 다시 할 때 기본적으로 정확한 절단, -ss항상 갈 필요 -i .


정확한 절단 시간을 신경 쓰지 않으면 segmentmuxer 가 도움이 될 수 있습니다. 여기에서 반드시 다시 인코딩 할 필요는 없습니다. 그러나 참고 :

… 비디오 파일을 정확하게 분할하려면 입력 키 프레임을 세그먼트에서 예상 한 정확한 분할 시간과 일치시켜야합니다. 그렇지 않으면 세그먼트 멀티플렉서가 지정된 시작 시간 다음에 찾은 키 프레임으로 새 세그먼트를 시작합니다. .


대박! 이것은 작동하는 것 같습니다. Btw, '-strict'플래그는 무엇입니까? 다시 감사합니다.
Christopher Spears

그것은 ffmpeg에 내장 된 실험적인 AAC 인코더를 가능하게합니다. (그렇지만 꽤 괜찮습니다)
slhck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.