ffmpeg를 사용하여 H.264를 인코딩하면 다음 유형의 경고가 일괄 적으로 나타납니다.
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
그들은 무엇을 의미합니까? 온라인이나 ffmpeg 문서에서 명확한 것을 찾지 못했습니다.
ffmpeg를 사용하여 H.264를 인코딩하면 다음 유형의 경고가 일괄 적으로 나타납니다.
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
그들은 무엇을 의미합니까? 온라인이나 ffmpeg 문서에서 명확한 것을 찾지 못했습니다.
답변:
특정 인코딩으로 수천 가지 경고가 발생했습니다. 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에서 모두 이루어졌습니다.
-async 1 -vsync 1
했습니다.
SourceForge의 DVDStyler 프로젝트 관리자 중 한 명은 이에 대해 다음과 같이 말했습니다 .
2015 년 1 월 15 일 이후의 FFMpeg 버전은 종종이 경고를 표시합니다. 가능한 속도 제어 왜곡에 대해 경고하기 위해 추가되었습니다. 그렇지 않으면 해를 끼치 지 않습니다.
이 경고 메시지는 높은 프레임 속도 소스를 낮은 프레임 속도 출력으로 인코딩하려고 할 때 나타납니다. 즉, 프레임을 삭제해야합니다.
일련의 이미지를 비디오로 변환하려고했기 때문에이 오류가 발생했습니다.
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 속도를 늦추지 않으려면 다음을 참조하십시오.
-r
때 사용 -framerate
하지 않는 곳 에서 사용 했습니다 .
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
입력 추가)
상기 상대 소스 코드 는 것 같다 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;
}
이것은 한 눈에 볼 수 있으므로 더 깊이 파고 들어 주시기 바랍니다.
format_video_sync = VSYNC_DROP
또는 format_video_sync = VSYNC_PASSTHROUGH
그 중 하나가 사용 사례에서 가능한 경우를 참조하십시오.
-r
스위치를 사용하여 프레임 속도를 명시 적으로 설정하는 것이 이러한 경고를 "수정"했습니다.
당 # 4700는 FFmpeg 문제 - 과거 기간 0.999992 너무 큰 그것은 단지 경고입니다. 사용하다:
ffmpeg -loglevel -quiet -i input_file.xyz ....
중지합니다.
네드