비디오 입력을 다른 fps와 동기화하는 방법

비디오 입력을 다른 fps와 동기화하는 방법

나는 이것과 비슷한 것을하고 싶다가이드하지만 이 경우 두 입력 모두 동일한 fps를 가지며 두 개의 서로 다른 프레임 속도 입력을 동기화하고 싶습니다. 예는 다음과 같습니다.

ffmpeg \
  -f x11grab \
  -video_size 1920x1080 \
  -framerate 60 \
  -i :0.0 \
  -f v4l2 \
  -video_size 320x240 \
  -framerate 15 \
  -i /dev/video0 \
  -filter_complex '[0:v][1:v]overlay=10:(H-h)/2[o]' \
  -map '[o]' \
  -r 60 \
  -vcodec libx264 \
  -an \
  -f mpegts \
  udp://127.0.0.1:3333

그런 다음 시청하세요.vlc udp://@127.0.0.1:3333

내 경우에는 어색하게 10fps 정도를 주었고 꽤 얼어붙은 것처럼 보였지만 60을 예상했지만 가장 낮았기 때문에 15일 가능성이 더 높았을 것입니다. 누가 알겠어요...

그러나 웹캠 입력을 제거하고 필터링하면 내가 원하는 전체 60fps가 제공되고, 웹캠을 스트리밍하면 15fps가 제공됩니다.

기반으로이 다른 가이드나는 또한 [1:v]fps=fps=60[wc];[0:v][wc]overlay=10:(H-h)/2[o]성공하지 못한 채 필터를 시도했습니다.

나는 출력 fps가 60이고 프레임이 정지 효과를 피하기 위해 어떤 방식으로든 잘 분산되기를 원합니다. ffmpeg를 사용하여 두 개의 비디오 입력을 서로 다른 fps로 동기화하는 방법은 무엇입니까?

증거:

답변1

아직 정확한 이유를 모르지만 다음이 작동합니다.

ffmpeg \
  -f x11grab \
  -video_size 1920x1080 \
  -framerate 60 \
  -i :0.0 \
  -f v4l2 \
  -video_size 320x240 \
  -framerate 15 \
  -i /dev/video0 \
  -filter_complex '[0:v]setpts=RTCTIME-RTCSTART[dt];[1:v]setpts=PTS-STARTPTS[wc];[dt][wc]overlay=10:(H-h)/2[o]' \
  -map '[o]' \
  -r 60 \
  -vcodec libx264 \
  -an \
  -f mpegts \
  udp://127.0.0.1:3333

문서에서 말하는 내용은 RTCTIME더 이상 사용되지 않으며 대부분의 사람들이 사용하는 내용에도 불구하고 PTS-STARTPTS스트림이 일련의 숫자가 아닌 시간을 기반으로 하도록 강제하는 것 같습니다.

편집하다:

다음 필터를 사용하는 것도 효과가 있으며, 이것이 더 적절하다고 생각합니다.

[0:v]setpts=N/FRAME_RATE/TB[dt];[1:v]setpts=N/FRAME_RATE/TB,fps=fps=60[wc];[dt][wc]overlay=10:(H-h)/2[o]

고정된 프레임 속도를 보장하고 출력이 예상 프레임 속도와 동일하도록 웹캠을 조정합니다.

관련 정보