GStreamer - 从 Raspberry 到 VLC-PC 的网络摄像头流
GStreamer - Webcam stream from Raspberry to VLC-PC
我正在尝试使用 gstreamer 1.0 将网络摄像头视频从 Raspberry 流式传输到 VLC 播放器。
现在我得到了树莓派的以下命令:
gst-launch-1.0 -vv -e v4l2src device=/dev/video0 \
! videoscale \
! "video/x-raw,width=352,height=288,framerate=10/1" \
! queue \
! x264enc \
! h264parse \
! rtph264pay config-interval=10 pt=96 \
! udpsink host=239.255.12.42 port=5004
和下面的sdp文件用vlc播放流:
c=IN IP4 239.255.12.42
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264/90000
当我 运行 gst-launch-1.0 命令时,我可以通过 wireshark 看到它正在发送 udp 数据包,但是当我尝试使用 vlc 和 sdp 文件播放流时,我什么也得不到。 vlc 日志说:
es error: cannot peek
es error: cannot peek
live555 error: no data received in 10s, aborting
我不知道怎么了。我可能没有正确构建管道,这就是为什么 vlc 无法将流识别为正确的视频流。有什么想法吗?
在此先感谢您的帮助。
VLC理解ts流结合RTP协议。该方法是在 mpegtsmux 之后使用 rtp payloader,它将 payload 生成的 ts 缓冲区(数据包)。
所以不是这个:
src ! queue ! x264enc ! h264parse ! rtph264pay ! udpsink
你可以这样做:
src ! queue ! x264enc ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink
然后在 vlc 中只使用 rtp://@:port
这样 mpegtsmux 将封装有关 what streams does it contains
的信息
我应该注意到 你的方法并没有错,而且可能会更有效(mpegtsmux 会将视频分割成 188 字节的数据包,但你的方法会分割成 ~ 1400 字节udp 数据包),但您需要为 vlc 提供正确的 SDP 文件才能对其进行流式传输。
例如像 this 但我对此没有太多经验..
所以这是您当前可用的管道:
gst-launch-1.0 -vv -e v4l2src device=/dev/video0 ! "video/x-raw,width=352,height=288,framerate=25/1"\ ! queue ! x264enc speed-preset=1 ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=192.255.10.41 port=5004
使用 zerolatency 可能会取得更好的效果:
像这样x264enc tune=4
它将丢弃所有其他质量参数,如速度预设等。
这是来自关于 tune 属性 的文档:
tune : Preset name for non-psychovisual tuning options
flags: readable, writable
Flags "GstX264EncTune" Default: 0x00000000, "(none)"
(0x00000001): stillimage - Still image
(0x00000002): fastdecode - Fast decode
(0x00000004): zerolatency - Zero latency
我正在尝试使用 gstreamer 1.0 将网络摄像头视频从 Raspberry 流式传输到 VLC 播放器。 现在我得到了树莓派的以下命令:
gst-launch-1.0 -vv -e v4l2src device=/dev/video0 \
! videoscale \
! "video/x-raw,width=352,height=288,framerate=10/1" \
! queue \
! x264enc \
! h264parse \
! rtph264pay config-interval=10 pt=96 \
! udpsink host=239.255.12.42 port=5004
和下面的sdp文件用vlc播放流:
c=IN IP4 239.255.12.42
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264/90000
当我 运行 gst-launch-1.0 命令时,我可以通过 wireshark 看到它正在发送 udp 数据包,但是当我尝试使用 vlc 和 sdp 文件播放流时,我什么也得不到。 vlc 日志说:
es error: cannot peek
es error: cannot peek
live555 error: no data received in 10s, aborting
我不知道怎么了。我可能没有正确构建管道,这就是为什么 vlc 无法将流识别为正确的视频流。有什么想法吗?
在此先感谢您的帮助。
VLC理解ts流结合RTP协议。该方法是在 mpegtsmux 之后使用 rtp payloader,它将 payload 生成的 ts 缓冲区(数据包)。
所以不是这个:
src ! queue ! x264enc ! h264parse ! rtph264pay ! udpsink
你可以这样做:
src ! queue ! x264enc ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink
然后在 vlc 中只使用 rtp://@:port
这样 mpegtsmux 将封装有关 what streams does it contains
我应该注意到 你的方法并没有错,而且可能会更有效(mpegtsmux 会将视频分割成 188 字节的数据包,但你的方法会分割成 ~ 1400 字节udp 数据包),但您需要为 vlc 提供正确的 SDP 文件才能对其进行流式传输。 例如像 this 但我对此没有太多经验..
所以这是您当前可用的管道:
gst-launch-1.0 -vv -e v4l2src device=/dev/video0 ! "video/x-raw,width=352,height=288,framerate=25/1"\ ! queue ! x264enc speed-preset=1 ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=192.255.10.41 port=5004
使用 zerolatency 可能会取得更好的效果:
像这样x264enc tune=4
它将丢弃所有其他质量参数,如速度预设等。
这是来自关于 tune 属性 的文档:
tune : Preset name for non-psychovisual tuning options
flags: readable, writable
Flags "GstX264EncTune" Default: 0x00000000, "(none)"
(0x00000001): stillimage - Still image
(0x00000002): fastdecode - Fast decode
(0x00000004): zerolatency - Zero latency