从原始视频源中,我试图使用Linux在嵌入式平台/板上尽可能快地将jpeg图像流式传输为html。
在gstreamer端,我可以看到jpeg图像以〜37fps的速度更新,管道如下所示:
appscr -> videoconvert -> jpegenc -> multifilesink
基于此question,我创建了下一个嵌入式html:
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8' />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="app.js"></script>
</head>
<body>
<img id="snapshot" src="snapshot.jpeg"/>
</body>
</html>
和Java脚本:
$(function() {
function refreshImage(){
$("#snapshot").attr("src", 'snapshot.jpeg?' + Math.random());
setTimeout(refreshImage, 20);
}
refreshImage();
})
[从PC打开Web浏览器并键入平台/板IP,我可以看到视频流,但是问题是图像更新速度太慢,鉴于源帧速率,我希望视频更加流畅/快速( 37fps)。
有人知道更新缓慢的原因是什么吗?
我认为这值得进行适当的分析,因为它是一个有趣的主题(至少对我而言)。
测试环境
我在同一局域网内的两台PC上完全复制了方案。
[PC 1正在使用以下管道从实时流创建jpeg图像
gst-launch-1.0 -v rtspsrc location="rtsp://freja.hiof.no:1935/rtplive/_definst_/hessdalen03.stream" \
! rtph264depay ! avdec_h264 \
! timeoverlay halignment=right valignment=bottom \
! videorate ! video/x-raw,framerate=37000/1001 ! jpegenc ! multifilesink location="snapshot.jpeg"
并使用python的简单http服务器提供index.html,app.js和(不断更新)snapshot.jpeg
python -m SimpleHTTPServer 8080
PC 2正在使用Chrome浏览器(带有开发者工具窗口)访问index.html并显示图像。
出于测试目的
timeoverlay
,该代码在右下角的每个图像上添加了时间戳。测试结果分析
这里是浏览器的网络日志
[时间列显示浏览器从服务器获取(下载)一张图像所花费的时间(以毫秒为单位)。对于大小为〜87KB的图像,这些时间段[[并不总是相同平均为〜100ms。
获取时间间隔实际上包括:第二间隔与服务器“速度”成正比:服务器从磁盘读取图像并处理HTTP请求/响应的速度有多快
还有另一个与运行浏览器的PC的“速度”成比例的间隔:PC能够以多快的速度处理HTTP GET请求/响应并重新呈现图像。
结论
不可避免的延迟间隔
取决于测试环境-Internet以及具有浏览器的服务器和客户端计算机的功能-浏览器中的代码将尽可能快地执行。无论如何,37 fps听起来像一些实时流视频
。通过提供视频块(每个块包含许多视频帧),有专门的协议可以流传输可在浏览器中显示的视频(例如MPEG DASH或HLS)。