使用gstreamer流传Logitech C920的视频和音频

5

我在使用gstreamer方面是个新手。我想要将我的C920网络摄像头的视频和音频流式传输到另一台电脑,但我一直没有正确地进行组合。

使用以下命令,我现在可以从我的C920摄像头向另一台PC流式传输h264视频:

gst-launch-1.0 v4l2src device=/dev/video1 ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! rtph264pay pt=127 config-interval=4 ! udpsink host=172.19.3.103

并使用以下方式查看:

gst-launch-1.0 udpsrc port=1234 ! application/x-rtp, payload=127 ! rtph264depay ! avdec_h264 ! xvimagesink sync=false

我也可以从C920中获取音频,并与测试图像一起记录到文件中:

gst-launch videotestsrc ! videorate ! video/x-raw-yuv,framerate=5/1 ! queue ! theoraenc ! queue ! mux. pulsesrc device="alsa_input.usb-046d_HD_Pro_Webcam_C920_F1894590-02-C920.analog-stereo" ! audio/x-raw-int,rate=48000,channels=2,depth=16 ! queue ! audioconvert ! queue ! vorbisenc ! queue ! mux. oggmux name=mux ! filesink location=stream.ogv

但我试图让类似于下面的代码正常工作。这个不起作用,可能是我做的非常糟糕的组合!

gst-launch v4l2src device=/dev/video1 ! video/x-h264,width=1280,height=720,framerate=30/1 ! queue ! mux. pulsesrc device="alsa_input.usb-046d_HD_Pro_Webcam_C920_F1894590-02-C920.analog-stereo" ! audio/x-raw-int,rate=48000,channels=2,depth=16 ! queue ! audioconvert ! queue ! x264enc ! queue ! udpsink host=127.0.0.1 port=1234

1个回答

1
你需要在链接到混合器之前对视频进行编码。此外,我没有看到你声明使用的混合器类型,也没有将音频放入混合器中。
我不确定在gstreamer中以这种方式发送音频和视频是否可行。我知道gstreamer中的rtsp服务器实现允许音频和视频同时, 但即使在其中,我也不确定它是否仍然是两个流,只是从实现中抽象出来的。
你可能希望只使用两个单独的流,并将它们通过gstrtpbin元素传递。

1
我已经让以下命令基本工作了:gst-launch-1.0 v4l2src device=/dev/video1 ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! muxout. pulsesrc device="alsa_input.pci-0000_00_1b.0.analog-stereo" ! queue ! audioconvert ! voaacenc bitrate=65536 ! aacparse ! muxout. mpegtsmux name=muxout ! queue ! tcpserversink host=192.168.2.13 port=5000'我的意思是,它确实将视频和音频混合,并通过网络播放。但是几个小时后,音频会消失,直到我重新启动(我猜是内存问题?)。 - skipx
@skipx 你应该在你的 caps 过滤器和 h264parse 之间加入一个 x264enc,这样你才能真正地进行编码。你需要重新启动流媒体服务器或接收器吗?这可能是一个内存问题。你应该允许它丢包或者在接收器的 sink 上设置一个延迟 max-lateness,以忽略那些太晚到达的数据包,而不是不断增加缓冲区。 - Benjamin Trent
你的意思是将 h264parse 放在 video/x-h264,width=1280,height=720,framerate=30/1 ! x264enc ! h264parse 这样吗? 因为如果我这样做,会出现“无法将v4l2src0链接到x264enc0”的错误。 至于重启电脑的问题,我现在使用 cvlc tcp://172.19.3.106:5000' 作为客户端。 - skipx
在服务器端,我现在收到了“丢弃17110720个样本”的消息。这很可能是因为下游无法跟上并且消耗样本太慢了。 警告:来自元素/GstPipeline:pipeline0/GstPulseSrc:pulsesrc0:无法快速记录音频。CPU根本没有超载。下次我启动gstreamer和VLC时,音频仍将消失...我必须重新启动整个计算机才能重新开始。它们是否会积累缓冲区?当我在命令行工具“top”中检查时,它们是否与“缓冲区”相同? 另外:我应该使用gstreamer而不是VLC作为客户端吗? - skipx
重新启动整个计算机并没有太多意义,如果您结束VLC和Gstreamer,则应该清除所有已分配的内存。缓冲区是程序内部的,并且不会显示为“top”中除所述程序分配的内存之外的任何内容。我不确定tcpserversink是否具有属性syncasync,但如果有,请尝试将这些属性都设置为false。 VLC应该可以正常工作,但可能存在一些编解码器不兼容的问题。 - Benjamin Trent
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接