it-swarm.dev

'지난 기간 X.XXX 너무 큼'이란 의미는 무엇입니까?

Ffmpeg를 사용하여 H.264를 인코딩 할 때 다음과 같은 유형의 경고가 대량으로 발생합니다.

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

그게 무슨 뜻이야? 나는 온라인이나 ffmpeg 문서에서 명확한 것을 발견하지 못했다.

124
Erik

특정 인코딩으로 수천 개의 경고가 나타났습니다. 나는 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

여기에 제안한 내용에 따라 입력에 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

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

이것은 모두 ffmpeg 버전 4.0이었습니다.

15
larryy

SourceForge에 관한 DVDStyler 프로젝트의 관리자 중 한 명은 그것에 대해 말했습니다 :

2015 년 1 월 15 일 이후의 FFMpeg 버전에는이 경고가 표시되는 경우가 많습니다. 가능한 속도 제어 왜곡에 대해 경고하기 위해 추가 되었으 며, 그렇지 않으면 해를 입히지 않습니다.

85
Josh Davis

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


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

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 속도를 늦추지 않으려면 다음을 참조하십시오.

52
mxmlnkn

소스 코드 를 보면, 입력 스트림의 표현 시간 (pts)과 출력 스트림의 표현 시간 (pts)의 차이가 0.6으로 고정 된 한계 이상으로 차이가 나는 것처럼 보입니다.

출처의 발췌 문장 :

    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;
    }

이것은보기에 불과하므로 더 깊게 파고보십시오.

47
Erik

FFmpeg 문제 # 4700 - 지난 기간 0.999992 너무 큼 그것은 단지 경고 일뿐입니다. 용도:

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

그것을 막을 수 있습니다.

네드

2
Ned