【问题标题】:Stream webcam video with gstreamer 1.0 over UDP to PC使用 gstreamer 1.0 通过 UDP 将网络摄像头视频流式传输到 PC
【发布时间】:2015-03-14 04:57:47
【问题描述】:

我正在尝试将视频从 Raspberry Pi(在 Raspbian 上)流式传输到 Windows 7 PC,如下视频所示:https://www.youtube.com/watch?v=lNvYanDLHZA

我有一个连接到 Raspberry Pi 的 Logitech C270,并设法通过 TCP 使用以下方式传输网络摄像头视频:

gst-launch v4l2src device=/dev/video0 ! \
'video/x-raw-yuv,width=640,height=480' ! \
x264enc pass=qual quantizer=20 tune=zerolatency ! \
rtph264pay ! tcpsink host=$pi_ip port=5000

来自我的 Pi。使用 VLC 作品接收此信息,但延迟 3 秒。 我想通过 UDP 执行此操作以获得更短的延迟(如果我错了,请纠正我)。但不能为我的生活弄明白。我试过以下:

gst-launch-1.0 v4l2src device=/dev/video0 ! \
'video/x-raw-yuv,width=640,height=480' ! \
x264enc pass=qual quantizer=20 tune=zerolatency ! \ 
rtph264pay ! udpsink host=$pc_ip port=1234

gst-launch-1.0 udpsrc port=1234 ! \ 
"application/x-rtp, payload=127" ! \
rtph264depay ! ffdec_h264 ! fpsdisplaysink sync=false text-overlay=false

分别用于 Pi 和 PC 端(取自 Webcam streaming using gstreamer over UDP) 但没有运气。 (试图将 video/x-raw-yuv 更改为适合 1.0 版本但仍然没有运气)

任何提示将不胜感激!

编辑

使用 raspi 相机(不是网络摄像头),以下工作:

Windows 批处理脚本:

@echo off
cd C:\gstreamer\1.0\x86_64\bin
gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 !        
rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false    
text-overlay=false

树莓派 Bash 脚本:

#!/bin/bash
clear
raspivid -n -t 0 -rot 270 -w 960 -h 720 -fps 30 -b 6000000 -o - | gst-       
launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 !   
udpsink host=***YOUR_PC_IP*** port=5000

但我不知道如何以相同的方式使用网络摄像头而不是树莓派相机(即 v4l2src 而不是 raspivid)

编辑 2

以下工作,但非常慢并且有很大的延迟:

RPi

gst-launch-1.0 -vv -e v4l2src device=/dev/video0  \
! videoscale \
! "video/x-raw,width=400,height=200,framerate=10/1" \
! x264enc pass=qual quantizer=20  tune=zerolatency  \
! h264parse \
! rtph264pay config-interval=5 pt=96  \
! udpsink host=$myip port=$myport

电脑:

gst-launch-1.0 -e -v udpsrc port=5001 ! ^
application/x-rtp, payload=96 ! ^
rtpjitterbuffer ! ^
rtph264depay ! ^
avdec_h264 ! ^
autovideosink sync=false text-overlay=false

我现在怀疑(感谢@Mustafa Chelik 的暗示)巨大的延迟是由于树莓派必须对网络摄像头视频进行编码,而树莓派视频已经编码,不确定这是否会导致有道理吗?

【问题讨论】:

  • 我认为从 TCP 更改为 UDP 不会减少延迟(尽管我对此不是百分百肯定)。你为什么这么认为?顺便问一下,RaspberryPi 可以对高清视频进行编码并流式传输吗?! RaspberryPi 的速度这么快吗?视频的帧率是多少? 25 岁?
  • 我认为 UDP 对于实时流传输更快,因为它是一个无连接协议,而 TCP 是面向连接的,因此有一些重传延迟(三次握手等等)。不确定它是否能够流式传输高清视频,但它应该能够流式传输高质量的视频。不确定帧率,仍在努力解决。

标签: udp raspberry-pi gstreamer


【解决方案1】:

http://www.z25.org/static/rd/videostreaming_intro_plab/找到解决方案的提示

以下内容非常适合从树莓派上的罗技 c270 流式传输视频到 Windows 7 电脑:

PC端:

gst-launch-1.0 -e -v udpsrc port=5001 ! ^
application/x-rtp, encoding-name=JPEG,payload=26 ! ^
rtpjpegdepay ! jpegdec !  ^
autovideosink 

RPi 端:

gst-launch-1.0 -v v4l2src device=/dev/video0  \
! "image/jpeg,width=1280, height=720,framerate=30/1" \
! rtpjpegpay \
! udpsink host=$myip port=$myport

我怀疑是在树莓派上将网络摄像头视频编码为 h264 太慢了,但是网络摄像头已经提供了 jpeg 帧,因此无需使用“image/jpeg”进行编码

【讨论】:

  • 对我不起作用。首先我进行了测试:gst-launch-1.0 -vvv v4l2src device=/dev/video1 ! "image/jpeg,width=800,height=600,framerate=8/1" ! jpegdec ! xvimagesink 然后开始流式传输:gst-launch-1.0 -vvv v4l2src device=/dev/video1 ! "image/jpeg,width=800,height=600,framerate=8/1" ! rtpjpegpay ! udpsink host=127.0.0.1 port=5000 并接收:gst-launch-1.0 -vvv v4l2src device=/dev/video1 ! "image/jpeg,width=800,height=600,framerate=8/1" ! rtpjpegpay ! udpsink host=127.0.0.1 port=5000 失败:“GstJpegDec:jpegdec0:不支持的组件数:0(最多 3 个)”
【解决方案2】:

我为我的网络摄像头流使用了 MJPG-Streamer,并获得了 0.2 秒的延迟。 http://wiki.ubuntuusers.de/MJPG-Streamer

而且好处是可以用网络浏览器观看。

【讨论】:

  • 谢谢,但我更喜欢使用 gstreamer 以便使用 python gstreamer binding 与 python 集成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多