배경 비디오에서 오디오 및 비디오가 지연된 FFMpeg 비디오 오버레이

배경 비디오에서 오디오 및 비디오가 지연된 FFMpeg 비디오 오버레이

여러 개의 비디오 파일을 사용하여 사진 비디오에서 사진 모양을 만들려고 합니다.

FFMpeg를 사용하여 .mp4 파일을 만들었습니다. 비디오가 Windows "영화 및 TV" 앱에 올바르게 표시됩니다. Chrome, Firefox, VLC Media Player 또는 내가 사용하는 다른 앱에서는 올바르게 표시되지 않습니다. 나는 비디오를 브라우저에 표시할 계획이므로 크로스 브라우저 지원이 나에게 중요합니다.

이 비디오는 화상 통화의 두 부분을 취하고 FFMpeg를 사용하여 다음을 수행하여 생성되었습니다.

  1. 원격 비디오(remote.mp4)를 백그라운드에 넣습니다.
  2. 원격 비디오는 비디오의 첫 번째 이미지를 표시하고 약 2.501초까지 일시 중지된 것처럼 나타나야 합니다. 나는 itoffset을 사용하여 이 작업을 수행했습니다.
  3. 원격 오디오도 2.501초 후에 재생을 시작해야 합니다. itoffset을 설정해도 이 작업이 수행되지 않는 것 같아서 filter_complex에 "adelay" 옵션을 추가했습니다.
  4. 로컬 비디오(local.mp4)를 오른쪽 하단에 오버레이로 배치했습니다.
  5. 로컬 비디오 및 오디오는 0초(비디오 재생 직후)에 재생을 시작해야 합니다.
  6. 배경 사진을 90도 회전했습니다(옆으로 녹화되었습니다).
  7. 원격 비디오에 오디오 지연을 추가하여 시작 후 2.501초 후에 오디오 스트림 재생을 시작합니다.
  8. 오디오 입력을 병합합니다.
  9. aac 코덱을 사용했습니다(인기 있는 것 같아서 유용하다면 기꺼이 바꿀 의향이 있습니다.)
  10. h264 비디오 코덱이 인기가 있는 것 같아서 다시 사용합니다.

내 FFMpeg 명령은 다음과 같습니다.

ffmpeg -itsoffset 2.501 -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501[0adelay]; \
     [0adelay]apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

비디오 속성:

  1. Completed.mp4(16초, 480x640)
  2. local.mp4(16초, 640x480)
  3. remote.mp4 (14초, 640x480, 옆으로 회전)

완성된 영상을 브라우저에서 보면 16초가 아닌 18초로 나오네요. 완성된 비디오에서 ffprobe를 사용하면 Duration: 00:00:16.68이라고 표시됩니다. 로컬 오디오 및 비디오도 브라우저에서 재생되기까지 2.501초를 기다립니다.

어떤 도움이라도 좋을 것입니다. 브라우저가 의도한 것과 다르게 렌더링하는 이유를 모르겠습니다. 감사해요!

답변1

타임스탬프 오프셋을 사용하면 ffmpeg는 출력 MP4의 편집 목록을 통해 이에 영향을 미칩니다. 브라우저가 구문 분석하지 않는 것 같습니다. 따라서 해결 방법이 필요합니다.

ffmpeg -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1,setpts='if(eq(N,0),PTS,PTS+2.501/TB)',fps=30[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501,apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

setpts첫 번째 프레임을 제외한 모든 프레임의 이동 타임스탬프입니다 . 그런 다음 필터 fps는 첫 번째 프레임의 복제본으로 해당 간격을 채웁니다. 입력 스트림 속도를 30으로 가정했습니다.

관련 정보