FFmpeg 추출 클립-스트림 프레임 속도가 컨테이너 프레임 속도와 다릅니다 (x264, aac)


8

요약
H.264 비디오는 추출하려는 비디오 지속 시간 (900 배 낮음)에 적용되는 스케일링 계수가 필요한 프레임 속도가 매우 높은 것 같습니다.

Body
MP4 형식 ( Handbrake 사용 )으로 만든 동영상에서 클립을 추출하려고합니다 . mencoder와 VLC를 시도한 후 코덱 복사와 관련하여 FFmpeg를 사용하는 것이 가장 번거로 웠습니다. 즉, mencoder 및 VLC와 비교하여 결과 파일은 여전히 ​​QuickTime에서 재생할 수 있습니다 (Perian 등에 대해 알고 있습니다.이 모든 것이 어떻게 작동하는지 배우려고합니다).

어쨌든 내 명령은 다음과 같습니다.

ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

복사하는 동안 다음이 나타납니다.

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
  Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
    Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size=    8144kB time=101.60 bitrate= 656.7kbits/s
…

5:59 길이의 클립 대신 나머지 영화 ​​전체를 얻습니다. 그래서 이것을 테스트하기 위해 ffmpeg 명령을로 실행했습니다 -t 00:00:01. 내가 얻은 것은 정확히 15:00 분 클립이었습니다. 그래서 나는 블랙 박스 엔지니어링을했고 -t1 초가 900 초로 해석 될 때 입력 할 값을 계산하여 옵션 을 조정하기로 결정했습니다 . 원하는 359 초 클립의 경우 0.399 초를 계산하여 ffmpeg 명령이 다음과 같이되었습니다.

ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

이것은 효과가 있지만 지속 시간이 900으로 조정되는 이유를 모르겠습니다. 더 조사하면 각 ffmpeg 실행에는 다음 줄이 있습니다.

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)

45000/25 = 1800. 어딘가에 관계가 있어야합니다. 어쨌든 외설적으로 높은 프레임 속도로 인해 타이밍 문제가 발생하고 있습니다. 그 프레임 속도는 어떻게 그렇게 높습니까? 이것에 대한 가장 좋은 부분은 결과 clip.mp4가 (복사 된 비디오 코덱으로 인해) 정확히 동일한 기능을 가지고 있으며, 이로부터 더 많은 클립을 가져 오려면 -t지속 시간 옵션에 대해 동일한 스케일링이 필요하다는 것입니다. 따라서 기꺼이 확인하려는 사람 이 사용할 수 있도록 만들었습니다 .

부록
내 시스템에서 ffmpeg의 프리앰블 (MacPorts ffmpeg 포트를 사용하여 빌드) :

FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    1. 4. 0 /  1. 4. 0
  libswscale     1. 7. 1 /  1. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Jan  4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)

편집
버그인지 아닌지 확실하지 않지만, 현재이 비디오 버전 (MacPorts의 버전 0.6.1)에서는 현재 ffmpeg 버전에서 수정 된 것 같습니다.


재 인코딩은 솔루션이 아니며 5 분 분량의 컨텐츠에 대해 1 시간 분량의 디코딩을 수행하는 것은 비합리적이며 근본적인 문제를 해결하지 못할 수 있습니다. 훌륭한 초기 연구 btw. fps ffmpeg가 감지 한 것이 문제의 근본이라고 가정하면 정확할 것입니다. ffmpeg의 이후 버전에서 문제가 해결 된 것처럼 들리지만 의견을 말하겠습니다. 다른 컨테이너 형식으로 -c 복사를 수행하는 것이 좋습니다. 이것은 다양한 효과를 가질 수 있지만 실험하기에 좋은 다음 단계였습니다.
dstob

답변:


1

ffmpeg를 사용하면 옵션의 위치가 중요합니다. 귀하의 예를 들어, 입력에 -ss 및 -t를 적용하려고합니다. 다음과 같이 옵션을 출력에 적용하는 것처럼 사용하십시오.

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

현재 ffmpeg를 사용하면 올바른 구문은 다음과 같습니다.

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4

1

나는이 같은 문제가 있었고 내 해결책은 다음과 같습니다.

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

exec ( 'ffmpeg -y -i /testmedia/'.$info['filename']. '-vf fps = fps = 1 /'.$ fracduration.'-f image2 /testmedia/images/output%03d.jpg 2 > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);

비디오 길이에 상관없이 모든 비디오에 대해 10 개의 이미지를 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.