![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
流媒体
文章平均质量分 66
流媒体领域
草根大哥
流媒体专家,IT咨询师,电商建站。
展开
-
Mediasoup在node.js下多线程实现
由于mediasoup-worker也是多进程,因此就成为socket.io server + mediasoup-worker的架构,这种框架,就大大增加SFU这种webrtc-server处理的复杂性。当然还有一个办法是processor#1上的socket.io forward msg to processor#2上的socket.io进行处理(内部转发),消息处理流程显得复杂了,多进程带来的效率提升恐怕也会被吃掉。首先尝试多线程MT方案,用node.js的worker_threads模块。原创 2023-09-01 22:58:47 · 830 阅读 · 0 评论 -
mediasoup性能瓶颈分析
首先,升级mediasoup 至3.10.8. 为保证效果,mediasoup-worker需要合理分配,分离出一个单独的ms-worker作为pipe-worker来使用,而其它的ms-worker组成pool给user使用。故障发生时,观察到推流器obs的码率发生了严重下降,由正常的1.5Mbps下降到约400kbps,显然,这个encoding码率就会导致严重的画质问题。Action: 统计出ms-worker的数量,每个ms-worker上承载的room数量。原创 2022-10-18 22:15:49 · 825 阅读 · 0 评论 -
linux下编译 libmediasoupclient, webrtc过程
libmediasoupclient build-env: POSIX, cmake >= 3.5, gcc and g++ >= 4.9 or clang (win with C++11 support) refer: https://mediasoup.org/documentation/v3/libmediasoupclient/installation/ 由于libmediasoupclient使用libwebrtc,所以如果想编译libmediasoupclient,需先编译原创 2022-06-12 23:28:27 · 594 阅读 · 0 评论 -
jitsi与mediasoup对比
实现多用户直播的Webrtc有两个重要的方案:jitsi和mediasoup。在pc/mobile web兼容性方面,两者表现差不多,都比owt,强许多。Owt是intel领导的MCU方案,https://github.com/open-webrtc-toolkit/owt-server。但这个owt的播放端做得确实烂!我都不拿owt出来做对比了。先看一下jitsi和mediasoup两者的demo对比吧。Owt连个在线demo也没有,真的丢人!Jitsi Meetmediasoup d原创 2022-05-10 06:39:14 · 1878 阅读 · 0 评论 -
部署webrtc开源工程owt
介绍如何部署webrtc开源工程owt的过程原创 2022-03-05 10:14:44 · 1107 阅读 · 0 评论 -
Adaptive-HLS流的优劣分析
HLS是Apple采用的基于http的流媒体格式。媒体切片为mpegts格式,manifest文件被称作m3u8。一个主master.m3u8里包含多个不同resolution/bitrate的子流,由客户端播放器根据显示屏size和网络状况选取其中一个子流进行播放,这就是自适应(adaptive)的过程。下面是一个典型的master.m3u8文件。#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio",NAME="原创 2022-01-19 23:34:49 · 558 阅读 · 0 评论 -
obs和obs-ndi项目编译过程
obs-ndi真的是一个不错的项目,可以在局域网上虚拟出HDMI/SDI线,为obs接多HDMI输入组网应用场景提供了极大的便利。开源工程:https://github.com/Palakis/obs-ndi/releases/tag/4.9.1首先,要编译obs,最新版本是27.1.3OBS requires Windows 10 SDK version 10.0.20348.0: https://developer.microsoft.com/en-us/windows/download...原创 2021-10-29 22:34:00 · 1412 阅读 · 0 评论 -
srs录像丢失调查,50s video lost when recording 6hrs.
SRS录像,发现统计直播时长和录像时长不一致。录像6hour,差了50s。调查发现,on_publish事件和on_unpublish事件之间,差距就有4s。这4s是合理的,并不是录像视频丢失。录像时长实际上是正确的,只是两个ts切片之间有视频计算上的丢失。平均两个ts之间就有15ms的时间被gap。这个问题其实很好解决,上一个ts的end_time作为下一个ts的start_time就行了。[16446][59hd9wz8] hls#1:start_dts=0,dts=8949,duration=原创 2021-03-31 23:58:15 · 517 阅读 · 0 评论 -
srs在直播中断时自动填充式播放广告视频
为什么要这样修改呢?当然是有特别的场景需要。比如某一个直播,推流中断。这时,服务器直接用一个广告推流来替代。当直播恢复后,强行踢掉广告流。因为主播流和广告流是使用的同一个直播地址,因此,需要这个踢流机制。原来的播主网络恢复了,他要继续推流。如何处理呢?最好的办法不是发消息让广告进程停止注入。而是强迫广告进程让出原来的播主频道。srs原来提供了一个kickoff流的http-api。那是利用coroutine的机制来实现的,感觉非常危险。容易易导致程序crash。并且,也没有必要那样做,只需要想办原创 2021-03-31 21:06:18 · 317 阅读 · 0 评论 -
如何在srs的两个实例间传递数据
hls切片器用了两个srs实例,一个是live-srs,一个是hls-srs。live实例负责接受推流,而hls实例则负责切片。这种框架会带来很大的灵活性。在两个情况下,需要这两个srs进程间通信。情况1:由外部传入session_id来动态决定hls的录像路径,也就是ts切片文件存放的子目录。情况2:把流名称stream替换为另外一个随机数如uuid,从而隐藏原始的推流地址信息。涉及进程间通信,用redis缓存来传递数据是比较合适的选择,不需要做持久化。由于复制了2个子流,加上原始流,一共三个原创 2021-03-28 12:29:08 · 203 阅读 · 0 评论 -
直播live-broadcast中断时,hls-server填充预录视频的方法
当主播侧发生网络中断时,为了减小对N多观众端拉流的影响,最佳处理办法是在hls-server填充ts切片并继续更新m3u8索引文件。前端的处理方案要复杂许多。设计思路:1. 新建一个广告线程thread_hls_filler,用于推送填充视频。采用pthread的原因是通知的速度比进程快,用全局变量就可以。2. 在播主推流中断时,通知thread_hls_filler启动注入。notification delay <100ms。3. 当播主推流恢复后,通知thread_hls_filler原创 2021-03-27 21:14:32 · 2984 阅读 · 0 评论 -
srs允许两个进程向同一个rtmp-url地址推流,顺序生成hls切片
首先,需要允许rtmp-url重复。srs的SrsSource类是关键。class SrsSource 有一个类变量pool来保存由stream_url作为key的字典。每次进来一个推流,都要查重。string stream_url = vhost/app/stream三个字段组成。std::map<std::string, SrsSource*> pool;只需要增加一个pool就可以。我这里只允许本机IP可以重复推流。 std::map<std::string, Srs...原创 2021-03-26 22:17:24 · 723 阅读 · 0 评论 -
srs中转码线程如何设计来跟随源视频尺寸
在下面这个函数中,解析出input的size: oriw,orihsrs_error_t SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata){ SrsAmf0Any* prop = NULL; if ((prop = metadata->metadata->ensure_property_number("width")) != NULL) { req->...原创 2021-03-25 18:04:35 · 363 阅读 · 0 评论 -
srs直播时复制子流,但损失了直播开始的20s数据
srs分为两级:源站(origin-node)和分发(edge-node)节点流程是源站负责接受主播推流(rtmp),forward一路流到edge-node,同时,利用ffmpeg产生(转码)出两路子流,这样就有三路流(原始流,标准流和低画质流)。edge-node实现ts切片,产生hls流。由三路hls流组成一路adaptive-hls流。播放器hls-player支持adaptive协议,根据客户端网络状况,自动选择不同速率的子流来适应。测试中发现,转码流启动速度太慢,导致开头的约20s时间原创 2021-03-21 10:02:44 · 276 阅读 · 0 评论 -
直播最佳推流参数推荐
高清推流:1920x1080, 30FPS,2s,3Mbps。标清推流:1280x720,30FPS,2s,1.5Mbps。这组参数是经过反复实践得出来的。高的FPS,在手机上播放视频时,会有极少量的cpu load上升,但户外直播时,观看流畅度远高于20/15 fps。bitrate看起来似乎有点高,但实际上,只是youtube推荐的最低值而已。这个值,可以保证画面质量优良。但继续提升bitrate,会带来肉眼感觉不出来的画质提升,不划算。如果再低一些,画质就会有损伤,不适应这个看颜值的时原创 2021-03-15 21:24:34 · 5111 阅读 · 0 评论 -
SRS中srt2rtmp代码阅读和流程分析
SRS4支持srt2rtmp功能,也就是说,实现了一个srt-server的同时,可以把srt://流转换为rtmp://流。 在测试时发现可以拉rtmp流,但是有明显的延迟。 先阅读一下代码,再分析一下可能的原因并提出解决方案。 in srt_data.cpp中(srt-server cycle): ret = srt_conn_ptr->read(data, DEF_DATA_SIZE); srt_conn_ptr->update_timest...原创 2020-12-30 11:01:29 · 457 阅读 · 0 评论 -
srt(udp)转rtmp(tcp)引擎设计(srs代码阅读)
srt2rtmp流程:接收srt data,然后decode,转封装为rtmp推送给rtmp server。流程的关键是一个decode func。int ts_demux::decode(SRT_DATA_MSG_PTR data_ptr, TS_DATA_CALLBACK_PTR callback){ int ret = -1; std::string path; if (!data_ptr || (data_ptr->data_len() < 188) ||...原创 2020-12-03 19:06:35 · 654 阅读 · 0 评论 -
windows下编译srt.dll过程
编译libsrt.so库,按官方的说明文档来操作,最终成功!中间试图用msys2+mingw64来编译失败了! annot find -lwsock32.lib 和 ld.exe: cannot find -lws2_32.lib。应该是可以解决的。 下面记录用vs2019来编译生成srt.lib/srt.dll的过程。 vcpkg install openssl --triplet x64-windows vcpkg install pthreads --tripl...原创 2020-09-21 22:18:23 · 984 阅读 · 5 评论 -
绿幕现场环境搭建
绿幕抠像技术近年来日益游行。虚拟演播室效果如下:为了保证绿幕布不晃动,还做了一个3/4的围墙,用一层薄木板就可以隔离起来。地胶也是绿幕的一种,独立出来,方便踩踏且不会影响幕布。灯光至关重要,要达到无影的效果,推荐用5束光打光法。且不可在绿幕墙上留下人影。绿幕场景布置过程:首先,要确定两个参数:摄像机的高度,摄像机与桌台聚焦中心之间的夹角,前景与背景之间在画面中的比例。这一般由项目的美工来确定。其次,要调摄像机参数。首先是白平衡,一般用自动白平衡就可以。感光参数尽量调小一些,这会减原创 2020-08-03 21:15:44 · 2930 阅读 · 1 评论 -
音视频开发 面视题(采集/编码/传输/播放)
题1.windows/linux的图像采集接口是什么?参考答案:windows是dshow,linux是v4l。回答结果:题2.video/audio的编码格式有哪些?压缩效率如何?硬件encoder有哪些?参考答案:Video压缩格式:H.264, H.265, VC1, VP8, VP9Audio压缩格式:AAC, AC3, OGG 。h.264压缩比一般在[200,500]区...原创 2020-04-02 21:33:21 · 692 阅读 · 0 评论 -
OBS编译(Windows)过程
先前obs编译,在公司电脑上面,编译不出来obs.exe。在家中电脑上,编译出的obs.exe不支持video capture设备。我一直怀疑是环境原因,后来新换了一台笔记本电脑,我又安装了最新的vs2019和qt5.14.1,再来编译一次。这次成功,记录如下:下载源码: https://github.com/jp9000/obs-studio or https://github.com...原创 2020-02-17 08:01:49 · 568 阅读 · 0 评论 -
RTMP直播视频时延分析
RTMP + CDN的视频直播架构很容易搭建,但问题在于时延大,会累积。一般情况下,视频直播时延在2~3s,网络差一些就会有3~7s。长期播放的累积时延可能超过150s。视频的实时性归纳为三个等级:伪实时: 视频消费延迟超过3秒,单向观看实时,通用架构是CDN + RTMP+HLS,现在基本上所有的直播都是这类技术。准实时: 视频消费延迟1 ~ 3秒,能进行双方互动但互动有障...原创 2019-12-29 09:53:34 · 3450 阅读 · 4 评论 -
基于ffplay的video流测试工具开发
直接基于ffmpeg来修改,去掉SDL。数据库选用mongodb,方便用C语言对接db。既然不需要显示,那还是基于linux来开发比较方便一些。一、setenvyum -y install gcc gcc-c++ make git bzip2二、compilegit clone https://git.videolan.org/git/x264.git编译x264:./co...原创 2019-12-29 09:52:09 · 422 阅读 · 1 评论 -
扑克牌自动图像识别在博彩行业的应用
一、行业痛点通常情况下,扑克牌是通过扫码来识别的。这种方案存在诸多缺陷:游戏桌台须定制,主要是开孔,安装扫码机。 扫码机并不是100%可靠,牌稍有磨损(主要是条码磨损)就会导致多次扫码才能识别出来。 显然,这种方案带来游戏运营的耗材开销。二、技术解决方案图像识别技术在近几年有了长足的发展,如opencv,机器学习平台tensorflow等日趋强大和完善。大家对人脸识别更是记忆深刻吧...原创 2019-12-29 09:50:22 · 7843 阅读 · 17 评论 -
利用SRS搭建商业CDN网络
SRS是一个搭建CDN平台的很好的基础,但在运维支撑方面还做得不够。运维方面需要增加的功能:1. 作为edge时,在线拉流用户数量。2. push时,必须有合法token才允许推。3. pull时,必须有合法token才允许拉。4. 动态配置更新。可以用mqtt pub/sub协议。需要增加的功能feature:1. 支持QUIC(Quick UDP Internet Connect...原创 2019-12-29 09:47:51 · 431 阅读 · 0 评论 -
SRS 转码功能生成竖屏size使用的流
针对移动H5来说,一般推流尺寸是用1280×720,这是横屏使用的流。对于竖屏显示来说,如果在render时做crop的话,图像质量会下降甚至异形。最好是用SRS转码出竖屏需要的流。用ffmpeg.transcode.conflisten 1935;max_connections 1000;srs_log_file ./objs/srs-trans.log;srs_log_tank f...原创 2019-12-29 09:40:57 · 478 阅读 · 0 评论 -
mpv编译过程
mpv是一个优秀的开源播放器。https://github.com/mpv-player/mpv按照windows: https://github.com/mpv-player/mpv/blob/master/DOCS/compile-windows.md指导进行编译,碰到问题#1:播放文件可以但不能播放rtmp://流。实际上ffplay.exe也不行无法播放rtmp流!这说明是ffmp...原创 2019-12-29 09:39:17 · 1326 阅读 · 0 评论 -
SRS节点拉流的同时并forward到其它节点
srs_error_t SrsRtmpConn::acquire_publish(SrsSource* source){ srs_error_t err = srs_success; SrsRequest* req = info->req; if (!source->can_publish(info->edge)) { ...原创 2019-09-09 19:31:07 · 816 阅读 · 0 评论 -
mpv编译过程
mpv是一个优秀的开源播放器。https://github.com/mpv-player/mpv 按照windows: https://github.com/mpv-player/mpv/blob/master/DOCS/compile-windows.md 指导进行编译,碰到 问题#1:播放文件可以但不能播放rtmp://流。 实际上ffplay.exe也不行无法...原创 2019-09-14 23:03:42 · 1939 阅读 · 1 评论 -
在海思hisiv100nptl平台上交叉编译并安装SRS
./configure --with-arm-ubuntu12 && make需要安装:apt-get installgcc-arm-linux-gnueabi ,但hi3516C是用的arm-hisiv100-nptl-gcc,需要替换gcc-arm-linux-gnueabi为arm-hisiv100-nptl-gccauto# gedit setup_variable原创 2016-01-21 00:29:53 · 3150 阅读 · 1 评论 -
nginx运行时报错:error while loading shared libraries: libpcre.so.3
nginx运行时报错:error while loading shared libraries: libpcre.so.3其实nginx的依赖是很少的了,安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装。)[root@localhost release]# ./nginx -p objs/nginx //用srs内置的nginx-1.5原创 2016-04-02 22:46:45 · 6449 阅读 · 0 评论 -
FMLE同时推多路流到SRS异常,推1路则正常。
同时推两路log:[2019-09-04 05:46:54.102][Trace][8386][105] RTMP client ip=::ffff:107.150.28.246, fd=9[2019-09-04 05:46:54.333][Trace][8386][105] simple handshake success.[2019-09-04 05:46:54.333][Trace][...原创 2019-09-09 19:28:43 · 1123 阅读 · 0 评论 -
SRS 转码功能生成竖屏size使用的流
针对移动H5来说,一般推流尺寸是用1280x720,这是横屏使用的流。对于竖屏显示来说,如果在render时做crop的话,图像质量会下降甚至异形。最好是用SRS转码出竖屏需要的流。用ffmpeg.transcode.conflisten 1935;max_connections 1000;srs_log_file ./objs/srs-t...原创 2019-09-09 19:27:11 · 651 阅读 · 0 评论 -
srs3.x代码阅读
srs使用了state-threads协程库,是单线程多协程模型。不用考虑线程安全,数据不用加锁。int SrsServer::listen()中启动if ((ret = listen_rtmp()) != ERROR_SUCCESS)进一步启动:SrsListener* listener = new SrsBufferListener(this, SrsListenerRtmpStream)...原创 2019-09-09 19:26:26 · 426 阅读 · 0 评论 -
腾讯云视频点播和直播使用中碰到的问题
您于 2016-05-06 18:42:45 提交问题描述:请在这里描述您的问题:我的直播突然就不能用了。两个频道都不能推流成功。显示无输入流。我用OBS推流错误信息见附件。附件:OBS推流出错.jpg客服于 2016-05-06 18:42:45 提交您好,您的工单已分配给工程师处理,请您耐心等待。客服于 2016-05-06 18:48:00 提交您的问题已经收到,会尽原创 2016-05-12 17:52:45 · 8222 阅读 · 1 评论 -
nginx: [warn] 4000 worker_connections exceed open file resource limit: 1024
root@d924608c6b73:/home/VodSvr/bin# ./bin/hlssvr -p /home/VodSvr/bin/www/nginx: [warn] 4000 worker_connections exceed open file resource limit: 1024root@d924608c6b73:/home/VodSvr/bin# #*原创 2016-05-25 18:55:09 · 8763 阅读 · 0 评论 -
./ffmpeg: error while loading shared libraries: libiconv.so.2
./ffmpeg: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory[root@centos64-uuc media]# 下载http://www.gnu.org/software/libiconv/#downloadi原创 2016-05-10 09:02:41 · 1751 阅读 · 0 评论 -
使用Yeoman和AngularJS搭建一个功能完整的应用前端环境
前端框架使用Yeoman搭建,使用generator-angular生成app基本骨架,使用bower管理依赖,使用gulp进行构建。以上组件全部基于node服务。 ## node环境搭建首先安装nvm--node版本管理工具。不然无法获取到最新版本。Apt-get install nodejs安装出的版本就是旧的,用不了。 终端输入:通过git clonehttps://原创 2016-04-08 17:55:15 · 1314 阅读 · 0 评论 -
srs/nginx在ubuntu 12.04上面跑得没有问题,可放进centos下面,问题一堆。
1、srs下面的ffmpeg,编译后无法运行./ffmpeg -h./ffmpeg: error while loading shared libraries: libXv.so.1: cannot open shared object file: No such file or directoryffmpeg version 2.1.1 Copyright (c) 2000-原创 2016-04-04 21:47:58 · 1077 阅读 · 0 评论 -
A/V data用TCP来接收(rtp overrtsp),可以收到数据,但解析不对。
/*TS:18:24:59 :tcp recv msg=24TS:18:24:59 :tcp recv msg=2TS:18:24:59 :tcp recv msg=0TS:18:24:59 :tcp recv msg=52TS:18:24:59 :tcp recv 0x52 bytes!idx=1 //只有idx=1?也就是只有track=1即音频数据。长度是固定原创 2016-02-25 22:24:42 · 1049 阅读 · 0 评论