基于rk3568 Android H265推流SRS低延迟网页播放方案

       在音视频领域,融合推流,低码流,低延迟,浏览器H5化是一个降低成本,提升用户体验的重要手段。同时适配现有直播的生态也是一个必要条件。

      在满足上述要求的情况下,我做了以下实践,取得了良好的效果。

     在实践中,我们选择采用了成熟的rtmp做为推流的主要手段,srs直播多媒体服务器的顶级生态位不可或缺,H265作为良好的视频编解码协议,在节约40%以上的码流带宽情况下比H264拥有更清晰的画质和更好的运动画面表现力,新兴的浏览器传输硬解渲染技术作为跨平台web化的门户比起桌面播放器有太多优势。

       在设备端推流选取了性价比很高的瑞星微rk3568作为硬件载体,其拥有60fps 1080p H265编码能力,内置opengl可以实现低延迟零拷贝的多窗口实时渲染能力。在实践中,我们做了大量的优化工作,提升了多路网络摄像头和本地摄像头及桌面的采集编码和转发推流能力。

       srs作为国内开源多媒体服务器的翘楚,拥有大量的用户,积极拥抱其生态是必然选择,在对接srs rtmp推流时,因为其有严格的格式验证,需要格外小心,不然会导致解析码流失败,当然这个跟良好兼容性形成了鲜明的对比,当然这个是见仁见智的。我们在对接过程中就遇到了一些坑,在这里也提醒其他玩家特别注意。

 下面就是我们处理码流进行推流的核心代码,贴出来以供参考

void VideoPushChannel::onencodeData(AVPacket *packet,int encodertype) {uint8_t *ptr   =packet->data;size_t len  = packet->size;uint64_t dts=packet->dts;uint64_t pts=packet->pts;uint16_t frametype=0;bool isH265=false;if(ptr==NULL||len<=0) return;unsigned char * psrc=ptr;unsigned int srclen=len;unsigned int packelen=0;unsigned char  nalutype=0;unsigned int scrindex=0;unsigned char destCount=0;bool bend=false;do {
//        GetNaluSlice2(unsigned char *  scr,uint32_t scrlen,uint32_t *packetlen,uint8_t * nalutype ,uint16_t * frametype,bool * endframe,uint32_t *pscroffset,uint8_t *destCount,bool* isH265);int result = Nalu::GetNaluSlice2(psrc, srclen, &packelen, &nalutype, &frametype, &bend, &scrindex, &isH265,&destCount);if (result == -1) {break;} else {if (isH265) {processH265Nalu(psrc, scrindex, packelen, nalutype,pts,dts);} else {processH264Nalu(psrc, scrindex, packelen, nalutype,pts,dts);}}// 更新psrc和srclen以处理下一个NALUpsrc += scrindex + packelen;srclen -= scrindex + packelen;} while (!bend && srclen > 0);
}

在rtmp推流组包时,网上基本上就是建议以下的方式

    body[i++] = 0x01; //configurationVersion 必须为1//general_profile_idc 8bitbody[i++] = sps[1]; //HEVCProfileIndication//general_profile_compatibility_flags 32 bitbody[i++] = sps[2];//profile_compatibilitybody[i++] = sps[3];//HEVCLevelIndicationbody[i++] = 0x03;//sps[4];//lengthSizeMinusOne 0x03body[i++] = 0xE1;//sps[5];//sps number SPS的序号,是0xE1// 48 bit NUll nothing deal in rtmp general_constraint_indicator_flags: 48bitsbody[i++] = sps[6];body[i++] = sps[7];body[i++] = sps[8];body[i++] = sps[9];body[i++] = sps[10];body[i++] = sps[11];//general_level_idc  //general_level_idc: 8bitsbody[i++] = sps[12];// 48 bit NUll nothing deal in rtmp//min_spatial_segmentation_idc: xxxx 14bits//parallelism_type: xxxx xx 2bits//chroma_format: xxxx xx 2bits//bit_depth_luma_minus8: xxxx x 3bits//bit_depth_chroma_minus8: xxxx x 3bitsbody[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;//bit(16) avgFrameRate;body[i++] = 0x00;body[i++] = 0x00;// bit(2) constantFrameRate;// bit(3) numTemporalLayers;// bit(1) temporalIdNested;body[i++] = 0x00;// unsigned int(8) numOfArrays; 03body[i++] = 0x03;

但是用这个组包方式肯定是调不通的,需要解析vps sps pps得到HEVCDecoderConfigurationRecord,然后填充进去,因为srs做了严格的HEVCDecoderConfigurationRecord解析,所以大家还是不要偷懒

    ff_buff_write_hvcc(&body[i],pps,pps_len,sps,sps_len,vps,vps_len);i+=22;// unsigned int(8) numOfArrays; 03body[i++] = 0x03;

按这个对接后基本上就可以愉快的用srs自带的播放器进行H265预览了,需要注意的是srs启动时采用./objs/srs -c ./conf/hevc.flv.conf 这个配置,不得不说,srs作为开源的项目能够做的这么完备还是非常牛的,在这里给他一个大大的赞!

      当然做完这些,我们并不满足,因为预览的延迟,并没有达到毫秒级,于是我们做了无插件H265网页低延迟播放器,从srs拉取rtmp流,而不是flv流,实现了webrtc级的低延迟预览,下面是对比测试效果。

当然如果直接采用我们自己的架构延迟会更低

音视频是很复杂 的一门综合性应用,值得深入挖掘,特别是结合实际的落地还有很长的路要走,希望能在漫漫长路的旅途中与志同道合的您结识并相伴而行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赴一场AI星河之约:他们改变了什么?

你认识AI开发者吗&#xff1f; 在工作中&#xff0c;我们会采访形形色色的AI开发者。他们来自不同的地方&#xff0c;说着不同的口音。年纪小的还没上小学&#xff0c;年纪大的在退休之后又找到了新的兴趣与梦想。他们有人心怀温暖&#xff0c;用AI技术帮助听障人士恢复听力&am…

电商数仓可视化1--数据导入

1、数据来源介绍以及数据文件下载 1、业务数据 业务数据往往产生于事务型过程处理&#xff0c;所以一般存储在关系型数据库中&#xff0c;如mysql、oracle 业务数据源&#xff1a; 用户基本信息、商品分类信息、商品信息、店铺信息、订单数据、订单支付信息、活动信息…

小白也能看得懂的Jmeter性能测试中服务端资源监控技术

操作步骤&#xff1a; 1、安装插件管理器 插件管理器的作用&#xff1a;可以提供扩展插件的在线安装升级和卸载。因为我们需要在线安装监控插件&#xff0c;首先我们就要先安装插件管理器。 插件管理器的下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ 如…

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

“Allins正在通过全新的AMM方案为BRC20及多链铭文资产拓展DeFi场景&#xff0c;官网的全新上线意味着铭文资产的交易正式进入AMM时代。” 在2023年1月开始&#xff0c;Ordinals协议的推出成为了铭文赛道发展的开端&#xff0c;并为比特币这类非图灵完备的生态&#xff0c;带来了…

全院级医学影像PACS源码,影像采集传输与存储管理、影像诊断查询与报告管理

全院医学影像PACS源码&#xff0c;数字化影像信息系统源码&#xff0c;带三维影像后处理技术 全院影像设备联网与影像信息数字化存储&#xff0c;建立涵盖全院的PACS/RIS系统&#xff0c;实现从预约、登记、分诊、排队叫号、检查、诊断阅片、报告发布、自助胶片打印等流程化管…

Android逆向入门教程

前言 什么是 Android 逆向开发&#xff1f; Android 逆向开发是指对已发布的 Android 应用进行分析和破解&#xff0c;以了解应用程序的内部工作原理&#xff0c;获取应用程序的敏感信息&#xff0c;或者修改应用程序的行为。逆向开发可以帮助开发人员了解他人的代码实现&…

Java网络编程之IP,端口号,通信协议(UDP,TCP)

目录 1.软件架构2.网络编程三要素3.IP1.IPV42.IPV6 4.端口号5.协议1.UDP协议1.单播2.组播3.广播 2.TCP协议1.三次握手2.四次挥手 1.软件架构 ①C/S&#xff1a;客户端/服务器 在用户本地需要下载安装客户端程序&#xff0c;在远程有一个服务器端程序。 优点&#xff1a;画面精美…

Python学习笔记之(一)搭建Python 环境

搭建Python 环境 1. 使用工具准备1.1 Python 安装1.1.1 下载Python 安装包1.1.2 安装Python 1.2 VScode 安装1.2.1 下载VScode安装包1.2.2 给VScode安装Python 扩展 2. 第一次编写Python 程序 本篇文章以Windows 系统为例。 1. 使用工具准备 1.1 Python 安装 1.1.1 下载Pytho…

【设计模式】策略模式

文章目录 前言一、概述结构 二、实现案例三、优缺点使用场景 四、JDK源码分析总结 前言 【设计模式】策略模式——行为型设计模式。 一、概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为…

性能测评高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

​如何把图片里背景的路人P掉?教你四种方法消除路人

在日常生活中&#xff0c;我们经常会遇到需要将图片中背景的路人P掉的情况。有时候&#xff0c;这些路人会破坏图片的整体美感&#xff0c;或者我们只想要图片中的某些元素&#xff0c;而路人的出现会分散注意力。那么&#xff0c;如何才能有效地将图片中的背景路人P掉呢&#…

天津大数据培训机构 大数据时代已到来!

大数据时代已经来临&#xff0c;越来越多的人开始关注大数据&#xff0c;并且准备转行大数据。但是&#xff0c;对于一个外行人或者小白来说&#xff0c;大数据是什么&#xff1f;大数据需要学什么&#xff1f;什么样的大数据培训机构是靠谱的&#xff1f;这几个简单的问题就足…

Ubuntu无网络解决办法

1.进入root并输入密码 sudo su 2.更新NetworkManager的配置 用vim打开NetworkManager.conf vim /etc/NetworkManager/NetworkManager.conf 将第五行 managedFalse 改为 managedTrue 。 如果本身就是True就不用改了。 3.删除NetworkManager配置 service NetworkManager st…

服务器终端快速下载coco数据集

######解压到当前文件夹 sudo apt-get install aria2 aria2c -c <url> #<url>即为官网下载地址# url # download images http://images.cocodataset.org/zips/train2017.zip http://images.cocodataset.org/zips/val2017.zip# download annotations http://i…

Python等高线图的绘制(Matplotlib篇-11)

Python等高线图的绘制(Matplotlib篇-11)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

力扣hot100 对称二叉树 递归 队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f468;‍&#x1f3eb; 参考思路 递归的难点在于&#xff1a;找到可以递归的点 为什么很多人觉得递归一看就会&#xff0c;一写就废。 或者说是自己写无法写出来&#xff0c;关键就是你对递归理解的深不深。 对于此题&#xf…

蓝桥杯单片机进阶教程2——简单模块

第一章 温度模块DS18B20 1、比赛过程中的参考资料&#xff08;比赛会提供&#xff0c;按照这个就不用记忆了&#xff09; 原理图 文章第四页 文章第十到十二页 2、分析考题 &#xff08;1&#xff09;只考最简单的温度转换&#xff0c;温度读取 3、实验 进行最简单…

Servlet中常用的三大API

HttpServlet 我们写 Servlet 代码的时候&#xff0c;首先第一步就是先创建类&#xff0c;继承自 HttpServlet&#xff0c;并重写其中的某些方法。我们实际开发的时候主要重写 doXXX 方法&#xff0c;很少会重写 init / destory / service。 因为这一些方法的调用时机&#xf…

如何在Windows 10中扩展分区,这里提供步骤

一些PC制造商提供的电脑硬盘分为多个分区&#xff0c;一个用于Windows操作系统&#xff0c;另一个用于个人文件的空“数据”分区。如果你愿意&#xff0c;可以将这些分区合并为一个分区。 此技巧还可以用于删除恢复分区&#xff0c;从而释放通常用于恢复数据的空间。或者&…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构&#xff0c;Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布&#xff0c;包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…