ffmpeg를 사용한 저지연 스트리밍

ffmpeg를 사용한 저지연 스트리밍

최근에 다음을 사용하여 원격 데스크톱을 스트리밍하려고 합니다.ffmpeg. 목표는 출력 해상도 등과 같은 설정을 선택하면서 컴퓨터 화면 중 하나에 표시된 내용을 다른 컴퓨터로 보낼 수 있는 것입니다.

그것은 작은거의 일하다개념의 증거. 완료되면 다음을 사용하여 VNC를 교체할 수 있습니다.ffmpeg스트리밍x2x또는시너지 효과키보드 및 마우스 이벤트 전달용.

이제 다음을 사용하여 스트리밍을 시작할 수 있습니다.

ffmpeg -f x11grab -s "1600x1200" -i ":0" \
    -f alsa -i pulse \
    -s 800x600 -b 200k -f mpegts - \
    | mplayer -cache 1024 -
#
# I have pulse audio configured so that `-i pulse` will
# The output can sent through for example netcat to another host
#

대기 시간은 인코딩 옵션에 따라 다릅니다. 이러한 옵션을 사용하면 화면 업데이트와 비디오 업데이트 사이의 지연 시간은 약 800ms입니다.

내가 달성하려는 것 :

  • 다음의 지연 시간에 도달합니다.100ms.
  • mplayer실행될 때 Lear 스트림에서 검색할 수 없다고 불평하며 다음이 있습니다.오디오 없음. 출력을 파일에 저장하고 재생할 때 여전히 소리가 들립니다.

    편집: 추가 후 -cache선형 스트림에서 검색할 메시지가 더 이상 나타나지 않습니다. 출력 형식을 변경하면 -f mpegts오디오가 작동합니다.

  • 인코딩이 CPU 코어 중 하나(2차 목표)를 100% 사용하지 않는다면 좋을 것입니다.

인터넷에서 조사한 결과 이러한 문제는 내가 사용해야 하는 코덱/옵션과 관련이 있다는 생각이 들었습니다. 그러나 나는 기존 가능성의 차이점을 모릅니다. 내 문제를 해결할 수 있는 몇 가지 옵션을 알려주실 수 있나요? 또한 VLC가 좋은 대안입니까? 그렇다면 한 데스크톱에서 다른 데스크톱으로 스트리밍하는 데 해당하는 명령은 무엇입니까?

답변1

DesktopA에서 DesktopB로 스트리밍하는 것은 흥미로운 문제입니다. 비디오/오디오가 필요하지 않다면 대신 NX 프로토콜을 확인하는 것이 좋습니다. VNC보다 훨씬 효율적입니다. FreeNX는 서버이고 NoMachine 등은 NX 클라이언트를 만듭니다. 무료 및 상업용 다른 서버도 있습니다.

F/LOSS 프로젝트로 고성능 원격 데스크톱, SPICE 기능에 대한 작업도 수행되고 있습니다. Redhat이 주도하고 있다고 생각합니다.http://spice-space.org/

이것이 유용한 답변인지는 모르겠지만 아마도 더 유용한 것으로 이어질 수 있습니까?

비디오 스트리밍의 경우 전체 데스크톱 프로토콜의 오버헤드를 피하는 것이 필요할 수 있습니다.

답변2

최근에는 원본 포스터(OP)보다 훨씬 더 엄격한 요구 사항을 갖춘 저지연 스트리밍을 설정해야 했습니다. 부드러운 마우스와 키보드 입력으로 노트북의 추가 모니터로 사용할 수 있을 만큼 잘 작동하는 솔루션을 고안했습니다.

보내는 쪽에서는 다음 ffmpeg명령을 사용했습니다.

ffmpeg -video_size 1920x1080 -r 30 -framerate 30 -f x11grab -i :0.0+0x0 \
    -b:v 40M -maxrate 50M -bufsize 200M \
    -field_order tt -fflags nobuffer -threads 1 \
    -vcodec mpeg4 -g 100 -r 30 -bf 0 -mbd bits -flags +aic+mv4+low_delay \
    -thread_type slice -slices 1 -level 32 -strict experimental -f_strict experimental \
    -syncpoints none -f nut "tcp://10.0.0.1:1234"

이 명령의 중요한 부분은 키프레임 사이에 시간을 추가하여 스트림 비트 전송률을 낮추는 -g 100 인수입니다.

수신 측에서는 Raspberry Pi 3에 스트림을 표시하기 위해 ffplay(에 포함됨 )을 사용했습니다.ffmpeg

ffplay -autoexit -flags low_delay -framedrop -strict experimental \
    -vf setpts=0 -tcp_nodelay 1 "tcp://10.0.0.1:1234\?listen"

원래 질문은 10년이 넘었고 일반 사용자가 사용할 수 있는 처리 능력이 그 이후로 크게 향상되었다는 것을 알고 있지만, 이 두 명령은 로컬 네트워크를 통해 지연 시간이 짧은 스트림을 설정하려는 모든 사람에게 합리적인 시작점을 제공합니다. 저사양 하드웨어에서도 마찬가지입니다.

관련 정보