Raspivid가 h264 인코딩을 건너 뛰도록하려면 어떻게해야합니까? (5 초 지연 시간 스트리밍 비디오 제거)


11

Pi를 감시 카메라로 사용하여 Pi를 사용할 때 5 초의 대기 시간을 없애는 방법에 대한 포럼과 스레드가 많이 있습니다. 많은 튜토리얼은 VLC를 사용하여 RTP 프로토콜을 사용하여 이미지를 인코딩하고 스트리밍하여 ~ 5 초 지연되는 방법을 보여줍니다.

나에 따르면, raspivid는 스트림을 H264로 인코딩하고 VLC는 다시 디코딩하고 RTP가 무엇이든간에 다시 인코딩해야하기 때문입니다. 커맨드 라인은 다음과 같습니다 :

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

첫 번째 부분은 비디오를 표준 출력으로 스트리밍하도록 raspivid에 지시합니다.

raspivid -w 640 -h 480 -o - -t 0 

파이프 뒤의 부분은 VLC에 그것을 픽업하고 h264를 사용하여 디코딩하도록 지시합니다.

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

이 muxing과 demuxing은 상당히 많은 자원입니다!

github에서 raspicam소스를 찾았 으며, 인코더를 건너 뛰기 위해 encoder_buffer_callback 메소드 (현재 848 행)에서 무언가를 수행 할 수 있다고 생각합니다. 그러나 나는 c를 잘하지 못하고 비디오 인코딩에 전혀 익숙하지 않으므로 시작할 곳이 없습니다.

Github에서는 330 개의 포크를 볼 수 있지만 raspicam 전용은 아닙니다 (전체 사용자 영역 프로젝트가 아닌). 인코딩을 제거하거나 mjpeg와 같은 간단한 것을 구현 한 포크를 찾으려고 노력하지 못했습니다.

C 및 비디오 코덱 지식을 가진 사람이 나와 다른 가질 리언 사용자가 대기 시간을 없애는 데 도움이 될 수 있습니까? 아마도 그 해결책 중 하나가 이미 그 포크 중 하나에 있지만 아마도 운없이 검색하는 데 몇 시간을 보냈습니다.

추신 : 나는 브라우저 솔루션을 찾고 있지 않지만 궁극적으로 mjpeg 스트리밍을 사용하여 Synology에 스트리밍하고 싶습니다 (웹 페이지가 아닌 대부분의 상업용 ip-cam에 내장 된 표준 mjpeg 스트림을 통해). 첫 단계는 h264를 없애는 것입니다.


그것은 매우 철저한 조사입니다. 내장 JPEG 인코더에는 라이브러리가 없었고 소프트웨어가 쓰레기이기 때문에 (내가 볼 때) MJPEG를 사용하는 것은 의문의 여지가 없습니다. 나는 nginx-rtmp (FLV 패키지), 사용자 정의 빌드를 사용하여 약 1 초 지연을 HD로 얻었습니다! 파이는 약 30 %의 CPU를 사용했지만 VLC는 누락 된 타이밍 프레임 때문에 FLV를 해독하기 위해 어려움을 겪었습니다 .FLV는 다음과 같습니다. 불안정
Piotr Kula

@ppumkin MJPEG가 의심의 여지가 없다고 생각합니다. H264가 사라지면 디코딩 및 재 인코딩 오버 헤드없이 원하는대로 인코딩 할 수 있습니다. 실제로 H264를 사용하는 것은 매우 사치입니다! 우리는 단지 그것을 끌 수 있어야합니다. 그것은 비좁은 화장실 챔버에 고급스러운 pluche 패딩과 다이아몬드 스터브 왕좌와 같이 방에 맞지 않습니다 (우리가 약간 위아래로 뛸 수있는 헤드 룸 제외). 팔걸이가 높고 앉을 때 다리를위한 공간이 없습니다 ...
Louis Somers

네 무슨 말인지 이해합니다 CCTV IP 서버에 MJPEG를 적절한 품질로 제공하기 위해 며칠을 보냈습니다. 많은 것들이 바뀌었지만 API를 사용할 수 없기 때문에 하드웨어 JPEG 직접 인코딩 및 스트림으로의 파이프 연결은 존재하지 않습니다. 내가 아는 유일한 방법은 소프트웨어이며 내가 찾은 최고의 솔루션은 nginx-rtmp JPEG 싱크였습니다. 아이폰에 대한 HLS는 실제로 잘 작동하지만 5 ~ 10 초 지연이 있습니다 :(
Piotr Kula

1
카메라 소프트웨어의 Github 프로젝트에서이 문제를 제기 할 수 있습니다. 왜 어려운지에 대한 설명을 얻을 수 있지만 다른 사람들이 유용한 기능을 찾으면 누군가가 그것을 구현할 수 있습니다.
TomG

demux는 디코드와 동일하지 않습니다 ... 이것을 확인하십시오
Flash Thunder

답변:


5

그것은 아마도 당신이 대답에서 원하지 않는 것이지만, VLC 스트리밍을 전혀 권장하지 않습니다.

학교 프로젝트의 경우 RPi에서 스트리밍 옵션을 시도했습니다.

  • VLC
  • MJPEG
  • GStreamer

사용 VLC와 MJPEG (일부 덜 알려진), 나는 .. 3 5 초 사이에 대기 시간을 가지고
있는 GStreamer, 사용 의 지연 시간 과 최고의 해상도 (더 많은 옵션을)!
관심이 있으시면 여기에서 확인 하십시오 .

그리고 당신이 그것을 사용한다면, 여기 내 파이프 라인이 있습니다 :

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
예, 이미 Gstreamer를 사용해 보았으며 PC 등으로 스트리밍 할 때 훌륭하게 작동하지만 Synology DiskStation과 같은 타사 소프트웨어에서는 제대로 작동하지 않습니다. GStreamer는 h264 스트림을 재사용하고 디코딩하지 않고 스트리밍 프로토콜을 감싸는 것처럼 보입니다. 이는 훌륭한 솔루션이지만 불행히도 적은 수의 유스 케이스에 적합합니다. Android 기기에서 스트림을보고 싶다면 자체 앱을 개발해야합니다. MJPEG는 훨씬 더 광범위하게 지원되며, Raspivid를 VLC 등으로 남겨두고 불필요한 인코딩을 건너 뛰도록 변경할 수 있습니다. 팁을 주셔서 감사합니다
Louis Somers

1
나는 또한 Synology를 가지고 있지만 GStreamer를 시도하지 않았습니다 (광산은 충분히 강력하지 않습니다). Btw, Android에 대해서는 GStreamer도 사용할 수 있습니다! 내 프로젝트에 사용하고 있으며 잘 작동합니다 :)!
Val

gstreamer의 문제는 프레임 데이터에 시간 프레임 간격을 포함하지 않으며 싱크로 사용할 수 없습니다 (옵션 추가로도 !!) : 6 개월 전에 CCTV를 saome하려고했지만 .. 그것은 안정적으로 작동하지 않았다 :(
Piotr Kula

@Val true, 안드로이드 용 SDK가 있지만 gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234와 같은 파이프 라인을 지원하는 Play 스토어에 기본 제공되는 플레이어는 많지 않습니다! gdpdepay! rtph264depay! avdec_h264! 비디오 변환! 자동 비디오 싱크 sync = false. iOS의 경우 사용 가능한 기능이 훨씬 적습니다. Synology는 대부분의 메인 스트림 장치를 지원하고 모션 감지, 녹화 및 알림을 모두 수행 할 수있는 (허리 SD 카드없이) 훌륭한 허브입니다.
루이스 소 머스

아직도 이런 식으로 사용하고 있습니까? 이 새로운 U4VL 드라이버는하지만, H264 여전히 같은 지연 문제는 VLC 스트리밍
피오트르 쿨라

0

내가 처음이 질문을 한 이후로 몇몇 사람들은이 문제에 대해 열심히 노력해 왔으며, 이번에는 몇 가지 옵션이 있습니다 (아직 아무도이 질문에 응답하지 않은 것이 이상합니다). RaspberrIPCam 을 사용해 보았지만 성공했지만 rtsp 패킷의 TTL이 매우 짧은 것 같습니다. Pi가 내 PC 옆의 라우터에 직접 연결되면 완벽하게 작동합니다. 그러나 원하는 위치에 캠을 설치하고 두 라우터 사이에서 스트림에 액세스하려고 시도하면 이미지가 도착하지 않습니다. 소스 코드를 확인하고 TTL이 최대로 설정된 것을 발견했습니다. 나는 그것을 완전히 이해하지 못했습니다.

현재 RaspberryIPCamera wich에는 멋진 사용자 인터페이스가 있으며 ( 스크린 샷 참조 ) 이미 준비된 SD 카드 이미지가 있습니다. SD 카드를 사용해 보았지만 여기 에 설명 된대로 수동 설치 (현재 설정) 로 되돌 렸습니다 . Synology DiskStation에 연결하기위한 지침 도 제공 되며 내 시스템에서 완벽하게 작동합니다. SD 카드 이미지의 문제는 파일 시스템을 SD 카드의 전체 범위까지 확장 할 수 없다는 것입니다. GPIO 핀을 통해 일부 릴레이를 제어하기 위해 다른 시스템을 실행하고 싶습니다.

위의 솔루션은 UV4L 프로젝트의 구성 요소를 사용합니다. 이 페이지 에있는 UV4L 프로젝트의 문서 도 언급합니다 :

무엇보다도 다양한 방식으로 비디오 스트림을 볼 수있는 웹 인터페이스와 Video4Linux 응용 프로그램으로 스트리밍하면서 카메라 설정을 완전히 제어 할 수있는 제어 페이지를 제공합니다.

그래도 아직 호수를 시험해 보지 않았습니다 (현재 설정을 엉망으로 만들고 싶지 않기 때문에).


1
이것이 문제인지 확실하지 않지만 라우터를 통해 멀티 캐스트 RTSP 트래픽을 보내는 경우 IGMP 스누핑이 활성화되어 있고 PC가 라우터의 IGMP 쿼리를 차단하지 않는지 확인하십시오. 그렇지 않으면 라우터가 PC가 패킷을 수신하려고 시도한다는 사실을 인식하지 못하므로 패킷을 전달하지 않습니다.
Malvineous
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.