- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本章节暂不考虑服务器性能指标, 目前仅对核心开发板资源占用、延时作为硬性考虑指标 。
目前市面上常见的推拉流协议有:RTMP、HLS、HTTP-FLV、RTSP、WebRTC 。
协议名称 | 延时 | 传输协议 | 优势 | 劣势 | 适用场景 |
---|---|---|---|---|---|
RTMP | 1~5s | TCP | 1. 协议成熟 2. 上手成本低 |
兼容性问题,大部分主流浏览器已不支持 Flash | PC 端延时不敏感直播 |
HLS | >10s | TCP | 1. 点播场景非常适用 2. 平滑播放(像播放视频文件一样直播) |
延迟非常高 | 点播场景 |
HTTP-FLV | 1~5s | TCP | 1. 延时较低且可浏览器播放 | 浏览器上适用需要用到特定本播放器(flv.js) | 对延时有一定要求并期望在浏览器上播放的场景 |
RTSP | <1s | TCP/UDP | 1. 延时极低 |
属于被动协议,需要客户端主动去拉流,不会向外推流(GB28181 可以实现向外推流) | 各大摄像头厂商基本协议 |
WebRTC | <500ms | UDP | 1.延时很低 | 上手难度大 | 低时延直播、会议室 |
上述的表格统计也仅为本人经验总结,欢迎大佬们指正与指点迷津。😀😀 。
🚩 上述延时均为大概范围,具体时间还得看不同的拉流手段、服务器环境、网路环境等因素.
🔶🔶 题外话:
本人项目中也试过这样的推拉流方案:
- 推流端: RTSP
- 拉流端: JSMpeg
- 中转端: FFmpeg
整个流程:RTSP -> FFmpeg -> JAVA 服务 -> WebSocket -> 客户端 。
FFmpeg 拉取 RTSP 流,转码并转成 TCP 流至 JAVA 服务,JAVA 服务将接收到的流通过 WebSocket 推送至浏览器客户端;客户端接收后利用 JSMpeg 来播放整个流 。
当初这样处理主要是为了少搭建一个流媒体服务器,一般情况下我还是会去选择转 RTMP 后适用 flv.js 播放 。
本次实验与测试对象如下 。
服务器相关资源 。
相关环境安装的教程建议参考官方文档(好的项目总是不断更新迭代的,经常翻阅文档将会是一个不错的习惯) 。
目前由于学习成本与时间关系:仅从以下几种低成本的方式进行选择性测试,后续再发文其他方式的相关文章.
由于对延时的要求较高,因此目前暂不考虑 HLS 这等高延时方案,RTSP 由于是一个被动拉取的协议,因此也暂时不考虑 RTSP 的方案,WebRTC 方案技术成本较高,放后续进行测试与整理文档.
如上图所示,在未进行任何推流的情况下资源占用 。
开发板中仅运行了:node_exporter 用于监控开发板资源 。
由于是内网环境,目前下属文件配置环境中的 candidate 设置的 ip 为我局域网 ip 。
# main config for srs.
# @see full.conf for detail config.
listen 1935;
max_connections 1000;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
#这里开启了跨域允许
crossdomain on;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate
candidate 192.168.108.9;
}
vhost __defaultVhost__ {
enabled on;
tcp_nodelay on;
min_latency on;
hls {
#暂不适用hls,不做开启
enabled off;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
nack on;
rtmp_to_rtc on;
twcc on;
}
play{
gop_cache off;
queue_length 10;
mw_latency 350;
}
publish{
mr on;
mr_latency 350;
}
}
此时设备刚开机,CPU 占用~=40%,查看了一下进程,发现是自动更新了某些东西 。
因此等待更新完成后再做下列操作 。
推流前系统资源占用情况 。
推流指令 。
gst-launch-1.0 -v v4l2src device=/dev/video0 ! 'video/x-h264, width=1280, height=720, framerate=30/1' ! h264parse ! flvmux ! rtmpsink location='${ip}'
推流了大概 5 分钟后延时图 。
推流资源占用情况 。
时机 | CPU | 内存 | 网络 |
---|---|---|---|
推流前 | 1% | 10% | 0 kb/s |
推流后 | 2.5% | 10.3% | 60 kb/s ~ 7 Mb/s |
推流直播延时 。
本次推流大概使用的资源如下 。
总的看来,使用 GStreamer 推流时带宽使用的较为大外,资源占用情况还是比较低的 。
我们其实可以看到 Network Traffic Basic 这一栏的波动,前一段是一个平缓的数值,突然间上涨到一个高度,然后再后续下降下来,最后呈现出一个很低的平缓直线 。
一开始我还在好奇,怎么流量上涨了这么多?我好像也没处理什么,还以为有什么其他程序增高了这个 。
但后想了以下,也没开其他应用程序; 。
然后怀疑是 H.264 传输压缩的问题, 测试了一下,当我将摄像头摆在一个画面丰富且动态变化的情况下,此时网络占用非常高;当我将摄像头盖起来(基本上处于一个黑色不变的情况下),此时网络占用几近于无(~=60 kb/s) 。
做了这个实验其实已经证实了我的想法, H.264 编码里面会使用 I帧 、 P帧 、 B帧 来组成画面与减少数据体积;[1] 。
当我们画面几乎不变时 使用 P帧 和 B帧 编码是数据体积会很小,因此节省了很多的带宽资源.
推流前先用了 echo 3 > /proc/sys/vm/drop_caches 命令清空了 buff/cache 。
此时系统占用情况 。
推流指令 。
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
-c:v libx264 -preset veryfast -maxrate 1000k -bufsize 2000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv ${ip}
推流了大概 5 分钟后延时图 。
系统资源占用情况 。
时机 | CPU | 内存 | 网络 |
---|---|---|---|
推流前 | 1.3% | 9.5% | 0 kb/s |
推流后 | 58.2% | 14.3% | 600 kb/s |
推流直播延时 。
本次推流大概使用的资源如下 。
这里可以看到与 Gstreamer 推流相比,FFmpeg 推流下系统资源占用,延时等明显上升了一个台阶,但是带宽稳定在 600 kb/s 。
这里应该是对整个视频流进行了压缩处理导致需要较多的 CPU 资源与 内存占用(目前还没熟悉 FFmpeg 的相关参数,后续对其学习后整理相关的文档在过来重新分析对此进行分析) 。
推流方式 | 延时 | CPU 占用 | 内存占用 | 带宽占用 |
---|---|---|---|---|
GStreamer | 1.3s | 1.5% | ~=3M | 60 kb/s ~ 7 Mb/s(具体看画面变化) |
FFmpeg | 3s | 58% | ~=140M | 600 kb/s |
上面的总结测试并不完整与科学;明显能得出的是 FFmpeg 应该会去压缩画面从而减少带宽,但与之相对应的是系统资源的占用提升;目前由于我们第一要义是选择资源占用小的,延时低的,暂时先选择用 GStreamer 来进行推流;(欢迎各位大佬来帮忙解答这部分) 。
由于推流在方案一里已经做了对比效果,因此本方案只使用 GStreamer 进行推流;然后只针对于 HTTP-FLV 拉流的方式进行查看延时效果 。
拉流效果图 。
总的来说效果还是出乎我的意料的;看上去延时不是特别高,而且最主要还能直接通过浏览器进行播放; 。
由于推流在方案一里已经做了对比效果,因此本方案只使用 GStreamer 进行推流;然后只针对于 WebRTC 拉流的方式进行查看延时效果 。
拉流效果图 。
这个局域网拉流的实际效果已经非常不错了,基本上可以算是一个比较实时的反馈了。当然其实 WebRTC 还是一个比较庞大且复杂的东西,里面还需要我更深入的去研究才能做出更好的选择.
推流方式 | 拉流方式 | 延时 | 备注 |
---|---|---|---|
GStreamer - RTMP | KMPlayer - RTMP | 1.3s | 资推流资源占用较低,但拉流时间较高 |
FFmpeg - RTMP | KMPlayer - RTMP | 3s | 资源占用较高, |
GStreamer - RTMP | HTTP-FLV | 1s | 效果还行,普通的低延时场景够用,如果做远程控制则还是不太足够 |
GStreamer - RTMP | WebRTC | 200ms | 效果不错,但挪到公网上还有待考究 |
最后的总结:
如果双端都能做到走 WebRTC 的方案,延时会更小更稳定一些吧; 如果是普通场景,我觉得我去先择 RTMP + HTTP-FLV 已经十分足够了,但是目前需要做远程控制,而且还需要做到外网控制的话, WebRTC 是一个不错的选择。 当然,本次实验的过程其实可以说是漏洞百出,例如:
# Docker run Prometheus
docker run -itd -p 9090:9090 --name promethues prom/prometheus
# Docker run Grafana
docker run -d --name grafana -p 3000:3000 grafana/grafana-enterprise
https://stackoverflow.com/questions/70655928/live-streaming-from-raspberry-pi-to-nodejs-server-hosted-on-google-app-engine/70675353#70675353 https://opensource.com/article/19/1/gstreamer https://github.com/ossrs/srs/issues/2304 http://www.riqicha.com/beijingshijian.html 。
https://www.cnblogs.com/Lxk0825/p/9925041.html ↩︎ 。
https://ossrs.net/lts/zh-cn/docs/v5/doc/sample-realtime ↩︎ 。
最后此篇关于智能小车开发篇-低时延直播测试的文章就讲到这里了,如果你想了解更多关于智能小车开发篇-低时延直播测试的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我致力于收集互联网广播流文件,例如 m3u,其中包含一个流式链接 (例如 http://aska.ru-hoster.com:8053/autodj )。 我没有找到关于如何检查链接是否可用/有效的示
为了学校,我需要建立一个 HTML5 直播网站。他们有一个他们一直在使用的 Flash 流播放器,但现在他们希望它改用 HTML5。我怎样才能做到这一点?我尝试使用视频标签,但无法正常工作。下面是我的
我正在尝试使用 FFmpeg 将视频循环流式传输到 justin.tv?我已经设法循环图像序列并将其与音频中的线条组合起来: ffmpeg -loop 1 -i imageSequence%04d.j
使用 WebAudio API 播放直播流的正确方法是什么。 我正在尝试使用以下代码,但是我看到的只是正在下载 MP3,但没有播放;可能 MediaElementSource 需要一个文件,而不是连续
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在开发一个播放实时 HTTP 网络广播流(.pls、.mp3 ...)的应用程序。我可以使用 MPMusicPlayerController 播放流吗?塔克斯。 最佳答案 我认为您不能使用 MPM
好的,我一直在努力解决这个 http 直播。我只是不明白,是的,我已经阅读了所有苹果文档并观看了 wwdc 视频,但仍然非常困惑,所以请帮助想成为程序员的人!!! 你写的代码跑到服务器上了?不在 xc
我正在尝试构建一个移动应用程序,该应用程序从设备的摄像头流式传输视频并将其实时发送到服务器。此外,移动设备应该能够播放从服务器接收到的实况视频。 我正在 Flutter 中构建应用程序,但似乎无法在
我正在使用 ffmpeg sdk 在 youtube live 上流式传输实时视频 av_interleaved_write_frame(m_pAvFmtCntx, pkt); av_interlea
我在 android 上使用 ffmpeg 3.4 版本的源代码。我尝试使用它来复用音频/视频元素流作为 m3u8 输出并使用以下选项: int num = av_opt_set_from_s
我正在尝试使用静态图像和音频文件通过 ffmpeg 进行直播。像这样的ffmpeg命令 ffmpeg -re -loop 1 -f image2 -i '/tmp/11.jpg' -f lavfi -
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我希望能够将 iPhone 摄像头的帧/视频(实时)流式传输到互联网。我在线程(streaming video FROM an iPhone)中看到可以使用AVCaptureSession的begin
我想创建一个网站,每个用户都可以创建/开始直播。 但正如我现在所看到的,我只能为我自己的帐户创建一个流。启用了 Youtube 数据 API 的那个。 key 是用代码编写的。所以我无权从某人的帐户创
我正在构建一个监控系统,它可以在白天将视频流式传输到 YouTube,但在夜间会关闭。 YouTube 直播在停止接收数据时会自动关闭流。 我可以使用 API 开始另一个流,但我想为公众保留相同的 Y
我在 YouTube 上有现场事件,我想在我的网站上播放它。我想将我的事件设为私有(private),获取它的 RTMP 广播 URL 并将其粘贴到我的网站上,在 JWPlayer 中。 那可能吗?
1- 哪一个更适合用于流媒体视频? TCP 或 UDP 套接字以及为什么? 2-直播时,音频和视频分别来自服务器,那么如何确保我显示的视频和设备上播放的音频同步? 最佳答案 我不久前编写了一个语音聊天
一直在使用 ffmpeg 通过 HLS 进行直播并通过 video.js 进行播放。它可以工作,但流开始的时间和实际开始播放的时间之间有 20 秒的延迟。 你知道为什么下面的 ffmpeg 命令不会像
除了无法解释的 Sample TV Input 应用 (https://github.com/googlesamples/androidtv-sample-inputs/),没有很多关于如何在 Liv
我真的厌倦了这个问题。如果有人在这方面帮助我,我将不胜感激。 我的一个应用被拒绝,原因是 Video streaming content over a cellular network longer
我是一名优秀的程序员,十分优秀!