【发布时间】:2016-05-05 03:20:13
【问题描述】:
我目前正在开发一个应用程序,它可以在浏览器中(在 HTML5 视频元素中)显示来自不同来源(主要是 IP 摄像机)的图像。 UI 将允许矩阵视图,因此通常会同时显示 16 个或更多摄像头。 从相机我得到 MJPEG 流或 JPEG 图像(我将其“转换”为 MJPEG 流)。因此,对于相机,我有一个 MJPEG 流,我将其设置为 ffmpeg 的输入。我指示 ffmpeg 将其转换为 MP4 和 H.264,并将输出公开为 tcp 流,如下所示:
ffmpeg -f mjpeg -i "http://localhost/video.mjpg" -f mp4 -vcodec libx264 "tcp://127.0.0.1:5001?listen"
这在 localhost 上工作得很好,我可以在网页中以最佳质量显示流。
但这必须在各种网络条件下工作。我玩了一下 chrome 节流设置,并注意到如果网络速度略低于所需速度(由我在 ffmpeg 中使用的当前压缩设置给出),事情就会开始出错:从流开始被延迟(因此,不再是实时流),直到在浏览器中完全冻结“实时”图像。
我需要的是一种与当前网络速度相关的“自适应”压缩方式。
我的问题是:
ffmpeg 是否能够处理这个问题,以适应网络条件 - 速度低时自动降低压缩质量;因此浏览器中的图像质量会较低,但可以实时显示(在我的情况下这是最重要的)
如果没有,有没有办法解决这个问题?
有没有办法检测网络瓶颈? (然后用较低的压缩参数重启ffmpeg;这不是动态自适应流,但总比没有好)
提前谢谢你!
【问题讨论】:
-
要获得实时自适应流,您必须将其打包为 HLS 或 DASH。使用 ffmpeg,我知道您可以为 VOD 做到这一点,但不能实时多比特率。那将允许浏览器处理比特率适应。更混乱的解决方案是让 ffmpeg 作业运行以产生不同的比特率,如果您看到 HTML5 视频元素缓冲区事件触发下降到较低的比特率源(不是很流畅的体验)
标签: html video ffmpeg video-streaming