ffmpeg.exe
두 개의 비디오를 함께 연결 하는 데 사용 하고 있습니다. 첫 번째 비디오는 기본적으로 초당 25 프레임에서 1080p로 렌더링되는 5 초 소개이며 항상 동일한 형식을 유지합니다. 두 번째는 임의 길이 및 형식 일 수있는 임의의 비디오이지만 MP4 파일 (h264)입니다. 이 특정 테스트 사례는 30fps에서 해상도 400x240의 비디오입니다.
이로부터 1080p25의 5 초 소개 비디오가 240p30 비디오에 연결되었습니다. 둘 다 MP4 파일이므로 먼저 mpegts
다음을 사용하여 파일을 각각 파일로 트랜스 코딩합니다 .
ffmpeg -y -i intro.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intro.mp4.ts
ffmpeg -y -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.mp4.ts
두 파일이 결합 가능한 형식으로 변환되었으므로 다음 명령을 실행하여 결합중인 두 비디오를 인코딩합니다.
ffmpeg -y -i "concat:intro.mp4.ts|video.mp4.ts" -c:v libx264 -preset ultrafast -crf 20 -vf fps=60 -b:v 8M -minrate 8M -maxrate 12M -bufsize -8M -c:a aac -b:a 256k output.mp4
이것은 거의 예상대로 작동하지만 한 가지 일이 계속 발생합니다. 인코딩이 5 초 (인트로의 끝 또는 실제 비디오의 시작)에 도달하면 다음 경고가 표시됩니다. DTS 126000 < 619200 out of order
나머지 변환은 정상적으로 실행됩니다. 그러나 출력 파일을 재생할 때 인트로가 재생 된 후 인트로의 끝에서 다음 비디오의 시작 부분으로 이동합니다. 일부 비디오 플레이어는 그 차이를 건너 뜁니다. 다른 플레이어는 특정 영역에서 소리없이 나머지 인트로를 연주하여 이것이 오디오 문제라고 믿게 만들 것입니다.
파일의 나머지 부분은 잘 재생되기 때문에 설정을 실험하고 있었고 x264 사전 설정을 ultrafast
에서 medium
또는로 변경 slow
하면 문제가 더 악화 되었다는 사실에 놀랐습니다 . 실제 비디오는 영향을받지 않습니다. 어디 ultrafast
스킵은 후반에게 비디오 / 오디오의 초를 생략하는 원인이, medium
두 번째 반에 두 번째 야기하고, slow
이초 이상 잘라 것이다.
이 문제의 원인은 무엇이며이 문제를 어떻게 해결할 수 있습니까? 연결하기 전에 두 비디오를 다시 인코딩하는 방법에 대한 제안을 읽었지만 가능하면 소개가 매번 동일하게 유지되므로 가능하면 피하고 싶습니다. 이것이 유일한 해결책이라면, FFmpeg를 한 번만 호출하여 모든 것을 수행 할 수있는 방법이 있습니까? 이 도구는 내가 쓰고있는 C # 프로그램에 의해 호출됩니다.
-y -i intro.mp4 -i video.mp4 -filter_complex \"[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]; [v]scale=1920:1080[v2]\" -map \"[v2]\" -map \"[a]\" -c:v libx264 -preset ultrafast -crf 20 -b:v 8M -minrate 8M -maxrate 12M -bufsize -8M -c:a aac -b:a 256k output.mp4