我得到了Pi B +和Pi摄像机,现在正试图找到最高效的(低CPU)和最低的延迟配置,以将H.264编码的视频从摄像机传输到我的家庭服务器。
我已阅读以下内容:
(所有链接都使用的gstreamer-1.0 deb http://vontaene.de/raspbian-updates/ . main
。)
过去几年在这方面已经做了很多工作。
最初,我们必须将输出连接raspivid
到gst-launch-1.0
(请参阅链接1)。
然后(链接2)创建了官方的V4L2驱动程序,该驱动程序现在是标准驱动程序,它允许仅使用gstreamer而不用管道直接获取数据(特别是towolf发表的帖子»Sat Dec 07,2013 3:34 pm in link 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解码,但是后者效率更高,因为它不需要再次经历内核,因为进程之间没有管道。
现在我对此有一些疑问。
后者仍然是从相机有效获取H264的最新方法吗?我读过有关的信息
gst-omx
,它允许使用gstreamer管道... video/x-raw ! omxh264enc ! ...
。这是否与仅使用有所不同video/x-h264
,或者可能更有效?有什么不同?使用
video/x-h264 ...
管道时,如何找出实际使用的gstreamer编码插件?与其他管道部分(我明确命名(代码)组件(例如h264parse
或fpsdisplaysink
))相比,这似乎只是在指定我想要的格式。在对链接1的回复中, MikaelLepistö提到“我从流式传输的一侧删除了一个不必要的过滤器通道”,这意味着他剪切了
gdppay
和gdpdepay
。这些是做什么的?为什么需要它们?我真的可以剥离它们吗?他还提到,通过在接收端指定
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
参数udpsrc
,他就可以在流的中间开始/恢复流。这些上限实现了什么,为什么要选择这些特定的选项,在哪里可以阅读更多有关它们的信息?当我按照问题3和4的建议进行操作时(添加
caps
,删除gdppay
和gdpdepay
),我的视频延迟变得更糟(并且似乎在累积,延迟随着时间的流逝而增加,并且几分钟后视频停止)!为什么会这样呢?我希望获得使用原始命令获得的延迟,但是还具有可以随时加入流的功能。我已经读过RTSP + RTP通常将TCP和UDP结合使用:TCP用于控制消息和其他必不可少的内容,而UDP用于实际的视频数据传输。在上面的设置中,我实际上是在使用它,还是仅在使用UDP?对于gstreamer照顾与否,这对我来说有点不透明。
对于这些问题中的任何一个,我都将不胜感激!
cat file | grep ...
代替一样grep ... file
。管道在内核之间增加了另一层复制,这很容易测量,尤其是在内存带宽较低的设备上。如果gstreamer可以直接读取设备文件,为什么不使用它呢?关于您的raspivid | cvlc
建议:在切换到基于gstreamer的解决方案之前,我一直在使用它,它的延迟比gstreamer多3秒钟(我不知道为什么)。
cvlc
消耗〜45%的内存,但是仅以该数据速率运行一个管道(再次注意,管道并不会降低速度)就几乎不会动针。如<5%。当然,如果您想尽可能高效地执行此操作并不完全无关紧要……
raspivid | cvlc
40-50%。人们可能会更好地回答一个挑战,要求他们改善特定的数字。现在,您在问很多原因,而没有解释每个为什么很重要的原因。
|
在这种情况下,使用管道会产生任何问题的想法是BS不可思议的一环。您是否尝试过任何raspivid | cvlc
方法?我没有很长时间或没有相机来使用它,但是用它来产生一个http流(可在另一端在linux上查看w /vlc
)似乎还可以。