'지난 시간 X.XXX가 너무 큼'은 무엇을 의미합니까?


142

ffmpeg를 사용하여 H.264를 인코딩하면 다음 유형의 경고가 일괄 적으로 나타납니다.

Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large

그들은 무엇을 의미합니까? 온라인이나 ffmpeg 문서에서 명확한 것을 찾지 못했습니다.


2
ffmpeg 질문을 video.stackexchange.com 베타 로 보내 주십시오 . ffmpeg 태그 설명을 참조하십시오.
Ondra Žižka 2

34
@Ondra 다른 스택 교환도? 나는 그 100 개 이상의 하위 사이트와 혼동되고 있습니다. 스택 교환이 향하고있는 긍정적 인 방향인지 확실하지 않습니다.
mxmlnkn

1
@mxmlnkn 동의합니다. 더 짧은 시간 동안 더 오래 갈 수 있습니다 ... :)
Erik

4
나는 생각합니다. StackOverflow는 프로그래밍 용이며 프로그래밍이 아닙니다. 비디오 처리를위한 Q & A 사이트가 있습니다. 이것은 비디오 처리에 관한 질문입니다. 이해하지 못하는 것은 무엇입니까?
Ondra Žižka

태그 설명도 읽으십시오.
Ondra Žižka

답변:


23

특정 인코딩으로 수천 가지 경고가 발생했습니다. 1080p 비디오를 480p로 축소했습니다. 소스 레이저 디스크의 결함으로 인해 약간의 비디오가있는 편집 지점에서 이러한 메시지가 나타나기 시작한 후 모든 프레임에 나타납니다. 그들은이 짧은 발췌와 같이 계속 진행했습니다.

Past duration 0.901115 too large=  535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 31 times
Past duration 0.901115 too large=  535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 34 times
Past duration 0.901115 too large=  535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 36 times
Past duration 0.901115 too large=  535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 39 times

원래 ffmpeg 호출은 다음과 같습니다.

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv

여기에 제안에 따라 먼저 입력에 -framerate 60000/1001을 추가했습니다. 그것은 아무것도 개선하지 못했습니다. -framerate를 유지하고 -r 60000/1001을 출력에 추가했습니다. 그것은 여전히 ​​아무것도 개선하지 못했습니다. 두 가지를 모두 유지하면서 마침내 -async 1 -vsync 1을 추가했습니다. 이로 인해 단일 경고가 표시되고 그게 전부입니다. 그 호출은 다음과 같습니다.

ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1

MediaInfo의 자세한 덤프에서 찾은 유일한 차이점은 원래 호출에서 발견되었지만 두 번째 행에서는 발견되지 않았다는 것입니다.

Delay relative to video                  : -33ms

그러나 파일의 시작 부분과 끝 부분에서 A / V 동기화를 확인했으며 두 파일 간의 동기화에 눈에 띄는 차이가 없었습니다. 그들의 실행 시간도 같았지만 VLC에서 가장 가까운 초까지만 측정되었습니다. 그래서 ffmpeg를 사용하여 프레임 수를 확인했습니다.

ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -

출력 끝 근처에서 "frame = #"을 찾습니다.

소스 비디오의 길이는 375226 프레임이고 원래 호출은 375195 프레임, 두 번째 호출은 375200을 나타 냈습니다. 따라서 경고 메시지가 훨씬 적은 두 번째 호출도 5 개의 프레임이 줄었습니다.

후속 테스트에서 -framerate 및 -r이 불필요하며 두 개의 동기화 플래그를 사용하는 것으로 충분했습니다. 위의 두 번째 호출과 동일한 결과를 얻었으므로 문제를 해결하기 위해 세 번째로 간단한 호출은 다음과 같습니다.

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1

그리고 또 다른 파일은 동기화 플래그로도 이러한 경고를 많이 생성했지만 속도 플래그를 다시 수정하여 (고정 된 경고 대신 두 개만 생성했습니다). 따라서 때로는 세 번째 호출이 작동하지 않을 때 두 번째 호출이 작동합니다. 즉각적인 목적으로 두 번째 호출을 해결하고 이러한 문제가 대부분 해결되기를 바랍니다.

이것은 ffmpeg 버전 4.0에서 모두 이루어졌습니다.


2
감사합니다! 며칠 동안 문제가 발생한 후 문제를 해결 -async 1 -vsync 1했습니다.
Offek

1
이 분석에 감사드립니다 @larryy 매우 유용
deepelement

90

SourceForge의 DVDStyler 프로젝트 관리자 중 한 명은 이에 대해 다음과 같이 말했습니다 .

2015 년 1 월 15 일 이후의 FFMpeg 버전은 종종이 경고를 표시합니다. 가능한 속도 제어 왜곡에 대해 경고하기 위해 추가되었습니다. 그렇지 않으면 해를 끼치 지 않습니다.


'속도 제어 왜곡'은 (주로 비디오) 인코딩과 관련이 있으며이 경고와 관련이 없습니다. 이는 출력 타임 스탬프가 입력 타임 스탬프와 비교하여 너무 (상대적으로) 다른지에 관한 것입니다
Gyan

처음 몇 번 경고 메시지가 표시되면 변환을 종료했지만이 조언을 통해 알림을 실행하고 잠시 후에 경고가 중지되고 변환이 성공적으로 완료되었습니다. 감사.
IRTFM

58

이 경고 메시지는 높은 프레임 속도 소스를 낮은 프레임 속도 출력으로 인코딩하려고 할 때 나타납니다. 즉, 프레임을 삭제해야합니다.


일련의 이미지를 비디오로 변환하려고했기 때문에이 오류가 발생했습니다.

ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv

문제는 입력에 프레임 속도가 제공되지 않으면 25fps의 프레임 속도가 가정되는 것입니다.

Input #0, image2, from 'frames/%04d.bmp':
  Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc

이것은 인코딩 된 총 프레임 수에서도 볼 수 있습니다. 400 개의 이미지가 있지만 위의 명령은 384 만 인코딩했습니다.

frame=  384 fps= 68 q=-1.0 Lsize=   10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15    
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%

출력 프레임 속도가 아닌 경우 입력 프레임 속도를 설정하면 오류 메시지가 사라집니다. 그러면 출력 프레임 속도가 입력 속도로 자동 선택됩니다. 또한 최신 ffmpeg 버전에서는 -i옵션 image2이나 v4l2입력 형식 대신 PNG 이미지 를 사용할 때 -framerate대신 사용해야 하므로 옵션 설명서를-r 참조하십시오 .-r

ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv

입력과 출력의 프레임 속도를 별도로 지정할 수도 있습니다.

ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv

이 경우 161/400 프레임 만 인코딩됩니다. 다른 프레임 중간이 삭제됩니다. 또한 오류 메시지가 사라집니다. 스팸으로 stdout으로 ffmpeg 속도를 늦추지 않으려면 다음을 참조하십시오.


3
"-i 옵션과 함께 PNG 이미지를 사용하는 경우에만 -r 대신 -framerate를 사용해야합니다"-이것은 내 문제를 완전히 해결했습니다. 감사합니다!
Anonymous

1
wmv를 mp4로 변환하려고 할 -r때 사용 -framerate하지 않는 곳 에서 사용 했습니다 .
1934286

+1하고 "요약"을 맨 위로 이동하는 것이 좋습니다. 또한 이미지를 비디오로 변환하고 출력 프레임 속도를 높이고 출력 속도를 높이려는 경우를 해결했습니다. 나는이에서 시작 ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"더 이상 경고와 함께이로 ffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"합니다 (주의 -framerate 50입력 추가)
엘 - teedee

49

상기 상대 소스 코드 는 것 같다 0.6 고정 제한 세트 이상에 의해 출력 스트림에 하나의 입력 스트림 상이 프레젠테이션 시간 차이 (PTS).

소스의 스 니펫 :

    delta0 = sync_ipts - ost->sync_opts;
    delta  = delta0 + duration;

...

        if (delta0 < 0 &&
        delta > 0 &&
        format_video_sync != VSYNC_PASSTHROUGH &&
        format_video_sync != VSYNC_DROP) {
        double cor = FFMIN(-delta0, duration);
        if (delta0 < -0.6) {
            av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
        } else
            av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
        sync_ipts += cor;
        duration -= cor;
        delta0 += cor;
    }

이것은 한 눈에 볼 수 있으므로 더 깊이 파고 들어 주시기 바랍니다.


이 문제를 "수정"하거나 출력 pt를 명시 적으로 설정하기 위해 할 수있는 일이 있습니까?
Baodad

1
나는이 문제를 둘러싼 세부 사항을 기억하지만, "수정"하여이 경고를 치우는 의미하는 경우 다음 옵션으로 볼 수 위의 코드를 기반으로하지 않는 format_video_sync = VSYNC_DROP또는 format_video_sync = VSYNC_PASSTHROUGH그 중 하나가 사용 사례에서 가능한 경우를 참조하십시오.
Erik

감사. -r스위치를 사용하여 프레임 속도를 명시 적으로 설정하는 것이 이러한 경고를 "수정"했습니다.
Baodad

1
개인적인 경험에서 얻은 것 : "지난 기간"메시지 스팸 문제가 발생하여 입력 프레임 속도를 -r 25로 설정하여 문제를 해결했지만 오디오가 크게 동기화되지 않기 시작했습니다. -r 옵션을 제거하고 오디오 비동기를 방지하기 위해 "-async 1 -vsync 1"을 사용하면 오디오 문제가 방지되었지만 "지난 기간"스팸도 사라진 것 같습니다.
Jason Lang

v 4.1 이상에서는 로그 레벨이 업그레이드되었으므로 기본 로그 레벨에 나타나지 않습니다.
Gyan


1

명령은 실제로 다음과 같아야합니다.

ffmpeg -loglevel quiet -i input_file.xyz ...

"quiet"매개 변수에는 "-"접두사가 없습니다. 옵션이 아니라 "-loglevel"옵션의 값입니다.

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