ffmpeg를 사용하여 의도적으로 입력 스트림에 지연을 추가하는 방법

ffmpeg를 사용하여 의도적으로 입력 스트림에 지연을 추가하는 방법

Windows PC에 연결하는 프레임그래버가 있습니다. 캡처 입력 장치는 1080p, 60fps, 4:4:4 원시 비디오입니다. 사용자가 기존 Windows 응용 프로그램에서 작업하고 이미지 압축을 도입하고 해상도를 낮추어 프레임 속도를 저하시키는 테스트 설정에서 이것을 사용하고 싶습니다. 아이디어는 사용자 경험에 대해 알아보고 사용자가 다양한 설정을 평가하도록 하는 것입니다. 내 생각은 ffmpeg를 사용하여 RAW 입력 스트림을 가져와 지연을 도입하고 MJPEG로 트랜스코딩하고 다양한 JPEG 레벨을 추가하고 지연을 추가하는 것입니다. 이미 캡처 장치에 액세스하고 해상도를 변경하고 프레임 속도를 줄일 수 있지만 대부분의 경우 사람들이 오디오 지연을 설명하기 위해 비디오 지연을 도입하고 싶거나 사람들이 원하기 때문에 지연을 도입하는 것이 가능한지 확실하지 않습니다. 의도적으로 비디오 지연을 추가하지 않고 비디오 지연을 줄이기 위해 :-) 현재 스트림을 처리하는 방법은 다음과 같습니다.

ffmpeg -f dshow -i video="framegrabber_capture_1" -vf format=yuv420p,scale=1280x1024,fps=5 -f sdl test

참고 사항: 순수 비디오만 필요하며 테스트 설정에는 오디오가 필요하지 않습니다.

MJPEG로 트랜스코딩하는 방법을 찾지는 못했지만 가능할 것 같습니다. 내가 전혀 찾을 수 없었던 것은 비디오 지연에 대한 정보였습니다. 이는 또한 스트림이 어딘가에 캐시되어 있음을 의미하기 때문입니다. 누군가가 나에게 올바른 방향을 알려줄 수 있다면 좋을 것입니다.

감사해요!

제이.

답변1

FFmpeg는 비디오 플레이어가 아니기 때문에 표시된 비디오를 지연하도록 설계되지 않았습니다.

다음을 사용하여 카메라의 비디오 앞에 짧은 비디오를 연결하여 FFmpeg가 비디오를 지연하도록 강제할 수 있습니다.연결필터.
우리도 추가해야 해요실시간필터 - FFmpeg가 출력 속도를 입력 속도와 일치하도록 강제합니다(필터가 없으면 FFmpeg는 비디오를 가능한 한 빨리 보냅니다).

MJPEG 인코딩에서는 를 사용할 수 없습니다. -f sdl test비디오를 표시하기 위해 FFmpeg 출력을 FFplay로 파이프합니다.


캡처된 비디오를 5초 지연시키는 예:

ffmpeg -an -f dshow -rtbufsize 1G -i video="framegrabber_capture_1" -filter_complex "color=white:size=1280x1024:rate=5:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=5[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay pipe:


  • -rtbufsize 1G- 입력 버퍼의 크기를 1GB로 늘립니다("많은" 입력 비디오 프레임 저장 가능).
  • color=white:size=1280x1024:rate=5:duration=5[w]- 5초 길이, 5fps 속도의 합성 흰색 비디오를 생성합니다. 에 저장하세요 [w].
  • [0:v]scale=1280x1024,setsar=1,fps=5- 입력 비디오의 크기를 조정하고 프레임 속도를 설정합니다. 에 저장하세요 [v0].
  • [w][v0]concat- 5초의 흰색 비디오를 스케일링된 입력 비디오와 연결합니다(5초의 흰색 비디오가 먼저 옵니다).
  • realtime=limit=10- 출력 속도를 입력 속도( limit=10휴지 제한)로 낮춥니다.
  • -c:v mjpeg -f mjpeg- 출력 비디오를 MJPEG 코덱으로 인코딩하고 MJPEG 컨테이너 형식으로 저장합니다.
  • pipe:- stdout을 출력으로 사용합니다.
  • | ffplay pipe:FFmpeg의 stdout 파이프를 FFplay의 stdin 파이프(입력으로 사용됨)로 전달합니다.

참고:
추가로 내장된 지연이 있기 때문에 지연이 정확하지 않습니다.

setpts=0더 높은 프레임 속도를 사용하고 FFplay 명령을 추가하여 지연의 정확성을 향상시킬 수 있습니다 .

ffmpeg -an -f dshow -rtbufsize 1G -i video="Microsoft® LifeCam HD-3000" -filter_complex "color=white:size=1280x1024:rate=25:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=25[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay -vf setpts=0 pipe:

관련 정보