我正在寻找最快的方法来编码可在html5视频标签中查看的网络摄像头流。我正在使用Pandaboard:http://www.digikey.com/product-highlights/us/en/texas-instruments-pandaboard/686#tabs-2用于硬件。可以使用gstreamer,cvlc,ffmpeg。我将用它来驱动一个机器人,所以在视频流中需要最少的延迟。质量不一定很好,也不需要音频。此外,这仅适用于一个客户端,因此带宽不是问题。到目前为止最好的解决方案是使用带有mpjpeg的ffmpeg给我约1秒的延迟。还有什么更好的吗?
答案 0 :(得分:23)
我被问过这么多次,所以我会尝试回答这个问题,而不只是为了mjpeg。在系统中获得非常低的延迟需要一些系统工程工作以及对组件的理解。
我能想到的一些简单的顶级调整是:
确保编解码器配置为最低延迟。编解码器将具有(特别是嵌入式系统编解码器)低延迟配置。启用它。如果您使用的是H.264,那么它最有用。大多数人没有意识到,根据标准要求,H.264解码器需要在显示之前缓冲帧。对于Qcif,最高可达16,对于720p,最高可达5帧。在第一帧出局方面存在很多延迟。如果您不使用H.264仍然确保您没有启用B图片。这会增加第一张照片的延迟。
由于您使用的是mjpeg,我认为这不适用于您。
编码器也会有速率控制延迟。 (称为init延迟或vbv buf大小)。将其设置为可为您提供可接受质量的最小值。这也将减少延迟。可以将其视为编码器和解码器之间的比特流缓冲器。如果您使用的x264将是vbv缓冲区大小。
一些简单的其他配置:使用尽可能少的I图片(大片段内)。 我的图片很大,增加了通过网络发送的延迟。这在端到端延迟在1秒或更长的范围内的系统中可能不是很明显,但是当您设计需要100ms或更短的端到端延迟的系统时,这个和其他几个方面起作用。还要确保使用低延迟音频编解码器aac-lc(而不是heaac)。
在你的情况下,为了达到更低的延迟,我建议远离mjpeg,至少使用mpeg4而不使用B图片(简单配置文件),或者最好使用H.264基线配置文件(x264提供zerolatency选项)。您将获得更低延迟的简单原因是,您将获得较低的比特率后编码以发送数据,您可以进入全帧速率。如果您必须坚持使用mjpeg,那么在没有编解码器和系统使用开源组件的更多高级功能支持的情况下,您可以获得接近的结果。
另一方面是将内容传输到显示单元。如果你可以使用udp,与tcp相比,它会减少相当多的延迟,尽管根据网络条件,它有时会有损。你提到了html5视频。我很好奇你是如何对html5视频标签进行直播。
还有其他一些方面也可以调整,我会把它放在高级类别中,并要求系统工程师尝试各种各样的事情
操作系统中的网络缓冲是什么?出于性能原因,OS还会在发送数据之前对其进行缓冲。调整这个以在性能和速度之间取得良好的平衡。
您使用的是CR还是VBR编码?虽然CBR非常适合低抖动,但如果编解码器提供它,您也可以使用上限vbr。
您的解码器可以开始解码部分帧吗?因此,在将数据提供给解码器之前,您不必担心将数据成帧。只需尽快将数据推送到解码器即可。
你可以进行字段编码吗?在获得第一张照片之前,将帧编码时间减半。
只要片段可以立即通过网络发送,你能用回调进行切片编码吗?
在以下100毫秒的延迟系统中,我使用了上述所有系统。某些功能可能在开源组件中不可用,但如果您真的需要它并且热情,您可以继续实施它们。
编辑: 我意识到你不能为ipad流媒体解决方案做很多以上的事情,并且因为hls也有限制你可以实现的延迟。但是我希望当你需要任何低延迟系统时,它将在其他情况下证明是有用的。
答案 1 :(得分:3)
我们遇到了类似的问题,在我们的案例中,有必要对外部事件进行计时并将其与视频流同步。我们尝试了几种解决方案,但这里描述的解决方案解决了这个问题并且延迟极低:
它使用gstreamer转码到mjpeg,然后发送到一个小的python流服务器。这样做的好处是它使用标签而不是大多数现代浏览器都可以查看,包括iPhone。
如您所愿< video>标签,一个简单的解决方案是使用http-launch。那 我们尝试的所有解决方案的延迟时间最短,因此它可能适合您。请注意,ogg / theora将无法在Safari或IE上运行,因此那些希望以Mac或Windows为目标的人必须修改管道以使用MP4或WebM。
另一个看起来很有前途的解决方案,gst-streaming-server。我们根本找不到足够的文件来让它值得追求。如果有人可以询问有关应该如何使用的stackoverflow问题,我将不胜感激!