ffmpeg에 비디오 스트림 데이터를 쓰는 가장 빠른 방법은 무엇입니까?

ffmpeg에 비디오 스트림 데이터를 쓰는 가장 빠른 방법은 무엇입니까?

/dev/video0저는 FFmpeg를 사용하여 stdin을 통해 x11 화면을 v4l2 웹캠 장치로 라이브 스트리밍하고 있습니다.

ffmpeg -re -probesize 32 -analyzeduration 0 -i pipe:0 -s 1280x720 -vf scale=1280:720 -preset veryfast -tune zero_latency -vf format=yuv420p -f v4l2 /dev/video0

rxscreen나는 스크린샷 (rust는 libX11에 바인딩되어 있음) 을 캡처하고 이를 ffmpeg의 표준 입력에 쓰기 위해 간단한 Rust 프로그램을 작성했습니다 . 초당 30프레임 이상을 전송하고 있습니다(평균 프레임 크기는 200,000바이트(200kb)).

안타깝게도 이 방법을 통해 스트리밍할 때 5~9초의 지연이 발생하지만 ffmpeg에 내장된 x11 그랩을 사용하면

ffmpeg -framerate 30 -video_size 500x500 -draw_mouse 0 -f x11grab -i :1.0+0,0 -s 1280x720 -vf scale=1280:720 -preset veryfast -tune zero_latency -vf format=yuv420p -f v4l2 /dev/video0

매우 작은 지연(1-2ms)이 있습니다. 원래 방법으로 비디오 지연을 줄이기 위해 할 수 있는 모든 것을 시도했지만 결과는 동일합니다. 이러한 지연은 내 데이터 전송 방법(표준 입력에 대량의 데이터 쓰기)으로 인해 발생하는 반면, ffmpeg의 내장 화면 스크래핑 구현은 메모리에서 직접 데이터를 읽고 쓸 수만 있습니다.

외부 프로그램에서 FFmpeg에 데이터를 쓰는 가장 빠른 방법은 무엇입니까? 표준 입력, UDP, 명명된 파이프, 메모리 매핑 파일

FFmpeg가 이 방법을 기본적으로 지원한다면 가장 좋을 것입니다.

관련 정보