使用Logitech C920传输H264


13

我有一个Logitech C920网络摄像头。它具有直接在H264中编码视频的能力。

我想重现使用Beaglebone完成的操作,但是要使用Raspberry Pi:将H264流发送到网络。然后,Raspberry Pi仅在此处用于打包RTP中的流,视频压缩由网络摄像头本身完成。使用video4linux强制执行H264模式。

到目前为止,如果我在最新版本的Ubuntu上使用普通计算机,则可以将VLC用作服务器或GStreamer。例如,如果我在Raspberry Pi上使用以下命令启动VLC服务器:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

...然后,如果我在另一台计算机上使用VLC读取了流,那么一切正常。

但是,如果我使用树莓派发送视频流,则结果会很差。一旦有东西移动,图像中就会有很多垃圾。图像密钥每10秒收到一次,但与此同时,与来自普通计算机的流相比,它还不够好。

我还尝试了使用提供的“捕获”实用程序为beaglebone所描述方法:好的,如果我从真实计算机中进行流式处理,则如果我从Raspberry Pi中进行流式处理,则出现相同的垃圾问题。

这不是网络问题:我使用Wireshark和VLC的统计信息进行了一些网络检查,没有数据包丢失。我尝试过使用Raspbian和用于Raspi的Arch Linux(在raspbian中使用gstreamer 0.10,在Arch Linux中使用gstreamer 1.0)。

我不知道它是否相关,但是我也使用Raspbian的soft float支持版本进行了测试。使用3.2内核必须首先完成更新; 但同样的问题,视频有一些垃圾。

我有什么办法可以提高视频质量吗?


尝试降低帧频。rPi的CPU非常差,所以我想以30FPS传输800x600的图像实在太多了。仅通过MIPI / CIS连接器(而不是USB)连接的新rPI相机板以15-30 FPS的速度流经1080p。
Matthias 2013年

它不是FPS。使用Pi Camera模块,Pi可以60FPS的速度处理高清视频。如果Logitech摄像机发送已经编码的H264视频,则Pi需要重新广播数据包。实际上,它可以在达到极限之前重新广播6个HD @ 25FPS流。一定是V4L驱动程序损坏了数据包
Piotr Kula 2013年

我知道这是一个旧线程,但是您终于找到了可行的方法吗?我试图做类似的事情并陷入困境
Ajith 2014年

我使用了Beaglebone,效果更好。问题是由于Raspbian中RaspberryPi的USB驱动程序错误。据我所知,我后来使用Raspbian的更高版本测试了相同的系统,并且垃圾较少。我可能做了一次rpi更新(如答案之一中所述),但我记不清楚了。但是可以确定的是,使用更新的固件/操作系统后,性能会更好。
Vincent Hiribarren 2014年

Vincent,我收到“无法打开v4l2网址”错误。现在该命令已经过时了吗?
dalanmiller19年

Answers:


5

我遇到了同样的问题,在搜索硬件编码器而不是c920问题时发现了该线程。

尽管如此,为树莓派执行固件更新,垃圾应该消失了

$> sudo rpi更新

我自己在这里找到了解决方案:http : //wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi


为了解决这个问题,我接受该答案。问题是由于USB驱动程序损坏,USB通信中有一些数据包丢失。更新的系统/固件应该可以解决问题。
Vincent Hiribarren 2014年

2

您可以尝试使用FFMPEG。但是问题不在于使用存储库版本,因为它已经过时了。有一个非常好的分支版本。

您将需要花费5个小时左右的时间来编译它,或者下载一个预编译的二进制文件。

然后,您可以使用这些设置将数据从V4L驱动程序传输到FFMPEG。在哪里 -i "fifo"应该只是-i对管道流进行Caputre,而-f您将需要仔细检查如何输出H264。FLV将其重新打包为可与HTML播放器一起播放的FLV。

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

或举例来说,我发现直接将V4L作为目标,但是oyu必须将相机放置/dev/video* 在* 1或更多的位置...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

-f表示格式的输出。这并不意味着它会对其进行转码像H264的FLV只是被包裹在FLV格式。然后将地址更改为您的客户VLC播放器。例如-f mpegts udp:192.168.1.19:1234

VLC在Pi上似乎不太好用。使用UDP将Pi cmaera模块推入PC时,我获得的成功很少。它有效,但不稳定。

您也可以看看使用rtmp模块安装nginx可以正常工作。查看本指南,但您需要稍微调整一下设置。然后,您将VLC播放器连接到nginx-rtmp流,它将像超级按钮一样工作。


1
哪个分叉版本效果很好?
布莱恩(Brian)

1

这似乎至少对我有用... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy


0

在显示视频的客户端上尝试使用更大的缓冲区。对我而言,1000ms缓冲区和200ms缓冲区之间存在巨大差异。5000ms缓冲区看起来比1000ms缓冲区好。

:网络缓存= 2000


它应该可以使用0缓存和LAN上的奇数抖动来工作。我让Pi摄像头模块可以正常工作。
Piotr Kula


-1

如果我了解您的情况,您是否希望Raspberry将视频转码为H264?我认为这就是为什么您获得不好的性能的原因,因为VLC使用的是软件编码,而Raspberry在此任务上功能不强大。

我建议尝试使用Gstreamer和gst-omx插件。硬件视频编码中有一些元素可以使您的Raspberry成为优质服务器。


1
正如他所说,罗技摄像机已经提供了H.264。因此,rPi仅传输帧,而不进行任何编码。
Matthias 2013年

他没有进行代码转换。只是重新广播数据。如它直接使用流。
Piotr Kula 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.