JPEG 实时流 html 慢
JPEG live stream in html slow
从原始视频源,我正在尝试使用 linux.
在嵌入式 platform/board 中尽快将 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 打开网络浏览器并输入 platform/board IP 我可以看到视频流,但问题是图像更新太慢,我希望更多 fluid/fast给定源帧速率 (37fps) 的视频。
有谁知道更新慢的原因是什么?
我认为这值得进行适当的分析,因为它是一个有趣的主题(至少对我而言)。
测试环境
我在同一局域网内的两台电脑上完全复制了场景。
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 浏览器(使用开发人员工具 window)访问 index.html 并显示图像。
用于测试目的
- 我在 gstreamer 管道中添加了
timeoverlay
,它在右下角的每个图像上添加了时间戳。
- 我将 JS 函数的刷新周期增加到 1000 毫秒。
测试结果分析
这里是浏览器的网络日志
时间列显示浏览器从服务器获取(下载)一幅图像所花费的时间(以毫秒为单位)。这些周期 并不总是相同的,对于大小为 ~87KB 的图像,平均为 ~100 毫秒。
抓取时间间隔实际包括:
- HTTP GET 从浏览器到达服务器所需的时间间隔,
- 服务器需要从磁盘读取图像并将其作为 HTTP 响应发回的时间间隔,
- HTTP 响应到达浏览器所需的时间间隔。
第一个和第三个间隔直接取决于"internet"环境:如果浏览器"farther"远离服务器间隔会更大。
第二个间隔与服务器成正比"speed":服务器从磁盘读取图像和处理 HTTP 的速度有多快request/response
还有一个与运行浏览器的 PC "speed" 成正比的区间:PC 处理 HTTP GET request/response 和 re-render 图片的速度。
结论
有很多不可避免的延迟间隔,这取决于测试环境——互联网和服务器机器的能力以及带有浏览器的客户端机器——你的代码在浏览器中的执行速度与它一样快可能可以。
无论如何,37 fps 听起来像是一些直播视频。有专门的协议可以通过提供视频 chunk-by-chunk(每个块包含许多视频帧)在浏览器中显示流式视频(例如 MPEG DASH or HLS)。
从原始视频源,我正在尝试使用 linux.
在嵌入式 platform/board 中尽快将 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 打开网络浏览器并输入 platform/board IP 我可以看到视频流,但问题是图像更新太慢,我希望更多 fluid/fast给定源帧速率 (37fps) 的视频。
有谁知道更新慢的原因是什么?
我认为这值得进行适当的分析,因为它是一个有趣的主题(至少对我而言)。
测试环境
我在同一局域网内的两台电脑上完全复制了场景。
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.jpegpython -m SimpleHTTPServer 8080
PC 2 正在使用 Chrome 浏览器(使用开发人员工具 window)访问 index.html 并显示图像。
用于测试目的
- 我在 gstreamer 管道中添加了
timeoverlay
,它在右下角的每个图像上添加了时间戳。 - 我将 JS 函数的刷新周期增加到 1000 毫秒。
测试结果分析
这里是浏览器的网络日志
时间列显示浏览器从服务器获取(下载)一幅图像所花费的时间(以毫秒为单位)。这些周期 并不总是相同的,对于大小为 ~87KB 的图像,平均为 ~100 毫秒。
抓取时间间隔实际包括:
- HTTP GET 从浏览器到达服务器所需的时间间隔,
- 服务器需要从磁盘读取图像并将其作为 HTTP 响应发回的时间间隔,
- HTTP 响应到达浏览器所需的时间间隔。
第一个和第三个间隔直接取决于"internet"环境:如果浏览器"farther"远离服务器间隔会更大。
第二个间隔与服务器成正比"speed":服务器从磁盘读取图像和处理 HTTP 的速度有多快request/response
还有一个与运行浏览器的 PC "speed" 成正比的区间:PC 处理 HTTP GET request/response 和 re-render 图片的速度。
结论
有很多不可避免的延迟间隔,这取决于测试环境——互联网和服务器机器的能力以及带有浏览器的客户端机器——你的代码在浏览器中的执行速度与它一样快可能可以。
无论如何,37 fps 听起来像是一些直播视频。有专门的协议可以通过提供视频 chunk-by-chunk(每个块包含许多视频帧)在浏览器中显示流式视频(例如 MPEG DASH or HLS)。