첫 번째 비디오의 FFmpeg 연결 끊기 부분


0

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 # 프로그램에 의해 호출됩니다.


2
입력의 너비 x 높이 및 SAR이 동일하도록 입력을 스케일링, 패딩 및 / 또는 자르십시오. 어쨌든 다시 인코딩하므로 concat 프로토콜 대신 concat 필터를 사용하십시오. 그러면 초기 re-muxing 단계를 피할 수 있으며 모든 명령을 한 번에 수행 할 수 있습니다.
llogan

@LordNeckbeard ffmpeg가 나를 위해 이것을 계산하는 방법이 있으므로 원하는 출력 크기를 지정하고 나머지는 자동으로 계산할 수 있습니까? 다음은 비디오의 크기가 같을 때 효과적이지만 크기가 다르기 때문에 크기가 다르면 실패합니다. -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
w0f

답변:


1

이 답변 의 제안을 사용하여 필요한 경우 비디오 크기를 조정할 수 있습니다.

ffmpeg -y -i intro.mp4 -i video.mp4 -filter_complex "\
[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v0]; \
[1:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v1]; \
[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[v][a] \
" -map "[v]" -map "[a]" output.mp4

나는 이것을 모든 입력에 적용했지만 물론 출력 크기와 다른 입력에 대해 선택적으로 수행 할 수 있습니다. SAR이 다른 경우에는 setsar필터를 사용할 수 pad있지만 꼭 필요한 것은 아닙니다.

[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=sar=1[v0]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.