라즈베리 캠에서 H.264를 스트리밍하는 현대적인 방법


16

Pi B +와 Pi 카메라를 얻었으며 이제 카메라에서 홈 서버로 H.264로 인코딩 된 비디오를 스트리밍하기 위해 가장 효율적인 (낮은 CPU) 최소 지연 시간 구성을 찾으려고 노력하고 있습니다.

나는 다음을 읽었다.

  1. http://pi.gbaman.info/?p=150

  2. http://blog.tkjelectronics.dk/2013/06/how-to-stream-video-and-audio-from-a-raspberry-pi-with-no-latency/comment-page-1/#comments

  3. http://www.raspberrypi.org/forums/viewtopic.php?p=464522

(모든 링크는의 gstreamer-1.0을 사용 deb http://vontaene.de/raspbian-updates/ . main합니다.)

이와 관련하여 지난 몇 년간 많은 일이있었습니다.

원래 출력을 파이프 raspividgst-launch-1.0연결해야 했습니다 (링크 1 참조).

그런 다음 (link 2) 공식 V4L2 드라이버가 생성되었으며 현재 표준이며 gstreamer 만 사용하여 파이프없이 데이터를 직접 얻을 수 있습니다 (특히 towolf 의 게시물 참조 »Sat Dec 07, 2013 3:34 pm 링크 참조) 2) :

발신자 (Pi) : gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000

리시버: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false

올바르게 이해하면 두 가지 방법 모두 GPU를 사용하여 H264 디코딩을 수행하지만 후자는 커널간에 프로세스를 거치지 않기 때문에 커널을 다시 거치지 않아도되므로 약간 효율적입니다.


이제 이것에 대해 몇 가지 질문이 있습니다.

  1. 후자는 여전히 카메라에서 H264를 효율적으로 얻는 가장 최근의 방법입니까? 에 대해 읽었으며 gst-omxgstreamer 파이프 라인을 허용 ... video/x-raw ! omxh264enc ! ...합니다. 이것 만 사용하는 것과 다른 것이 video/x-h264있습니까? 아니면 더 효율적일 수 있습니까? 차이점이 뭐야?

  2. video/x-h264 ...파이프 라인을 사용할 때 실제로 어떤 gstreamer 인코딩 플러그인이 사용되는지 어떻게 알 수 있습니까? 이것은 내가 명시 적으로 (같은 (코드) 구성 요소의 이름을 다른 파이프 라인 부분에 비해 단지, 내가 원하는 형식을 지정하는 것 같다 h264parse또는 fpsdisplaysink).

  3. 에서 링크 1이 응답 미카엘 Lepistö는 언급 "나는 측면 스트리밍에서 하나 개 불필요한 필터 패스를 제거" 그는 잘라 것을 의미 gdppay하고 gdpdepay. 그것들은 무엇을 하는가? 왜 필요한가요? 정말 떼어 낼 수 있습니까?

  4. 또한 수신 측 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"의 매개 변수를 지정 udpsrc하여 스트림 중간에 스트리밍을 시작 / 다시 시작할 수 있다고 언급 합니다. 이 캡은 무엇을 달성하며 왜 이러한 특정 선택이 필요한지 어디서 더 읽을 수 있습니까?

  5. 질문 3과 4에서 제안한 작업을 수행하면 ( caps, 삭제 gdppay및 추가 gdpdepay) 비디오 대기 시간이 훨씬 더 나빠집니다 (시간이 지남에 따라 대기 시간이 증가하고 몇 분 후에 비디오가 중지됨)! 왜 그런가요? 원래 명령으로 얻은 대기 시간을 얻고 싶지만 언제든지 스트림에 참여할 수있는 기능이 있습니다.

  6. RTSP + RTP는 일반적으로 TCP와 UDP의 조합을 사용한다는 것을 읽었습니다. TCP는 제어 메시지 및 기타 손실되지 않아야하는 것들과 실제 비디오 데이터 전송을 위해 UDP를 사용합니다. 위의 설정에서 실제로 사용하고 있습니까, 아니면 UDP 만 사용하고 있습니까? gstreamer가 이것을 처리하는지 여부는 약간 불투명합니다.

이 질문들 중 하나라도 대답 해 주셔서 감사합니다!


파이프를 사용하면 |이러한 맥락에서 문제가 발생 한다는 아이디어 는 놀라운 BS입니다. 어떤 raspivid | cvlc방법 을 사용해 보셨습니까 ? 나는 카메라를 오랫동안 가지고 놀지 않았지만 그것을 사용하여 http 스트림 (다른 쪽 끝에서 Linux에서 볼 수 있음)을 생성하는 vlc데 괜찮은 것처럼 보입니다.
goldilocks

@goldilocks 나는 파이프가 "문제"라고 말하지 않고 단지 필요하지 cat file | grep ...않고 대신에 약간의 오버 헤드가 있다고합니다 grep ... file. 이 파이프는 커널과의 또 다른 복사 계층을 추가하며, 특히 메모리 대역폭이 낮은 장치에서 쉽게 측정 할 수 있습니다. gstreamer가 장치 파일에서 독창적으로 읽을 수 있다면 왜 사용하지 않습니까? 귀하의 raspivid | cvlc제안 과 관련하여 : gstreamer 기반 솔루션으로 전환하기 전에 이것을 사용했지만 gstreamer보다 대기 시간이 최대 3 초 더 깁니다 (이유는 모르겠습니다).
nh2

예, 확실히 약간의 대기 시간이 있습니다. 파이프, WRT "컨텍스트"에 대한 요점은 여기서 병목 현상이 발생 하지 않을 수 있다는 것입니다. 네트워크 I / O는 수십 배 느려질 것입니다. 그러나 CPU에 비트를 추가 할 수 있습니다 시각. 그냥 많이 베팅하지 않았습니다. 전체 해상도로 실행하면 cvlc~ 45 %를 사용하지만 해당 데이터 속도로 파이프를 통해 실행 하면 (파이프가 속도를 늦추지 않고) 다시 염두에두면 바늘이 거의 움직이지 않을 것이라고 생각합니다. <5 %처럼. 물론 가능한 한 효율적으로이 작업을 수행하려는 경우 전혀 중요하지 않습니다 ...
goldilocks

... 여기 다른 사람이 파이프를 사용하면 대기 시간 문제 또는 다른 문제가 발생할 수 있다는 인상을 받기를 원하지 않습니다. 그것은 빨간 청어입니다. 또는 내가 틀렸을 수도있다;)
goldilocks

효율성이 높은 경우 다양한 방법에 대해 관찰 된 총 CPU 사용량을 특정 해상도 / 프레임 속도로 포함 할 수 있습니다. 내가 시도한 유일한 raspivid | cvlc것은 40-50 %입니다. 사람들은 특정 인물을 개선하도록 도전하는 질문에 더 잘 응답 할 수 있습니다. 지금 당장은 왜 각 이유가 중요한지 설명하지 않고 많은 이유를 묻습니다.
goldilocks

답변:


8

옵션 :

  1. raspivid -t 0 -o - | nc -k -l 1234

  2. raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264

  3. cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'

  4. raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234

  5. gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234

  6. uv4l --driver raspicam

  7. picam --alsadev hw:1,0

고려할 사항

  • 대기 시간 [ms] (클라이언트에게 서버보다 더 많은 fps를 요구하도록 요청하거나 포함하지 않음)
  • CPU 유휴 [%] (로 측정 top -d 10)
  • CPU 1 클라이언트 [%]
  • RAM [MB] (RES)
  • 동일한 인코딩 설정
  • 동일한 기능
    • 오디오
    • 다시 연결
    • OS 독립 클라이언트 (vlc, webrtc 등)

비교:

            1    2    3    4    5    6    7
latency     2000 5000 ?    ?    ?    ?    1300
CPU         ?    1.4  ?    ?    ?    ?    ?
CPU 1       ?    1.8  ?    ?    ?    ?    ?
RAM         ?    14   ?    ?    ?    ?    ?
encoding    ?    ?    ?    ?    ?    ?    ?
audio       n    ?    ?    ?    ?    y    ?
reconnect   y    y    ?    ?    ?    y    ?
any OS      n    y    ?    ?    ?    y    ?
latency fps ?    ?    ?    ?    ?    ?    ?

1
이 표의 모든 값이 " ?"인 이유는 무엇 입니까?
Larsks

@larsks 'community wiki'에 대한 데이터를 테스트하고 채우는 사람은 아무도 없기 때문에
user1133275

6

브라우저에 H264를 스트리밍 하는 유일한 최신 방법은 UV4L을 사용하는 것입니다 . 대기 시간 없음, 구성 없음, 오디오 옵션, 양방향 오디오 / 비디오 옵션. 매직 GStreamer 소스는 없지만 사용법을 확장 할 수 있습니다.


서버 및 스마트 폰으로 스트리밍하려고하므로 브라우저로 스트리밍 할 필요는 없습니다. 또한 브라우저에 추가 제한이있을 수 있습니다 (예 : WebRTC를 사용하지 않는 한 RTSP 없음, TCP 없음). 그러나 UV4L은 여전히 ​​유망한 것으로 보입니다. 네트워크를 통해 스트리밍하기 위해 사용 방법 / 데이터를 가져 오는 방법에 대해 읽을 수있는 장소에 링크 할 수 있습니까?
nh2

성스러운 소, 나는 예제 페이지를 발견 했다고 생각 합니다 ...이 일은 모든 것을 할 수있는 것 같습니다 ! RTMP, RTSP, HTTPS 스트리밍, WebRTC, "실시간 객체 감지 및 객체 추적 + 얼굴 감지" – 대체 무엇입니까? 각각 간단한 명령 행 플래그가 uv4l있습니까? 내 gstreamer 파이프 라인은 이제 구식입니다! 대기 시간이 어떻게 테스트되는지 기다릴 수 없습니다!
nh2

1
아뇨, 폐쇄 소스입니다 :( 이것은 내가 염두에 둔 가정 감시 용도로 실격됩니다 :(
nh2

WebRTC, 2-way WebRTC를 지원합니다. 지연 시간은 ~ 200ms 오디오 / 비디오, 오디오는 적음
prinxis

@ nh2, 링크가 끊어진 것 같습니다. 해당 예제 페이지의 업데이트 된 위치가 있습니까?
Punit Soni

1

1.) 네트워크를 통해 스트리밍되는 h264es (샘플 만 해당)

서버에서 :

raspivid -v -a 524 -a 4 -a "rpi-0 %Y-%m-%d %X" -fps 15 -n -md 2 -ih -t 0 -l -o tcp://0.0.0.0:5001

클라이언트에서 :

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer h264es ffmpeg://tcp://<rpi-ip-address>:5001

2) 네트워크를 통한 mjpeg 스트리밍 (샘플 만 해당)

서버에서 :

/usr/local/bin/mjpg_streamer -o output_http.so -w ./www -i input_raspicam.so -x 1920 -y 1440 -fps 3

클라이언트에서 :

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer lavf http://<rpi-ip-address>:8080/?action=stream

이 모든 것은 RPi Zero W (서버로 구성)에서도 작동합니다.


대답 해줘서 고마워. 무슨 sample only뜻이야?
nh2

나는 '단지 예일뿐'이라고 말하고 싶었다. 필요에 맞게 조정할 수 있습니다.
sparkie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.