基于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;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为…

Zabbix“专家坐诊”第222期问答汇总

问题一 Q&#xff1a;Zabbix6.4能讲下维护区间吗&#xff1f;启动区间和期间是什么不同&#xff1f; TiuySPzJ6567d4304f4b9.png A&#xff1a;启动区间是这条维护规则的有效时间&#xff1b;期间则是维护的周期&#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;这几个简单的问题就足…

第十一章 软件测试的原则(笔记)

一、软件测试八大原则 1.所有的软件测试都应追溯到用户需求 2.应当把“尽早地和不断的进行软件测试”作为软件测试者的座右铭 a.为什么要尽早的测试? 测试在需求阶段介入,降低bug修复成本,开发在做设计及编码的时候,测试在左侧是设计,分析测试点和用例设计 3.完全测试…

运维工程师的出路到底在哪里?

运维工程师的出路到底在哪里&#xff1f; 运维工程师&#xff0c;这个IT界的"万金油"&#xff0c;他们不仅是系统的守护神&#xff0c;还经常是救火队员、心理咨询师和咖啡机的最佳伙伴。那么&#xff0c;这样的多面手将来的出路在哪里呢&#xff1f;让我们带着一丝…

UR5机器人的旋转向量转换到四元数,再从四元数转换到旋转向量python代码

能够通过接口获得UR5机器人末端在基坐标系下的位姿&#xff0c;姿态表示方法是用旋转向量表示的&#xff0c;一般会涉及到四元数和旋转向量之间的转换。 1、方法一 import numpy as np from pytransform3d import rotations as pr import copy # 输入旋转向量 quaternion2 n…

Ubuntu无网络解决办法

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

【LeetCode 面试经典150题】88. Merge Sorted Array 合并两个有序数组

88. Merge Sorted Array 题目描述 You are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m and n, representing the number of elements in nums1 and nums2 respectively. Merge nums1 and nums2 into a single array so…

C++对象与内联函数

目录 一、C对象 二、对象是类的一个实例化 三、简单的C类和对象的例子 四、C内联函数 一、C对象 当涉及到C对象时&#xff0c;有几个重要的概念需要了解&#xff1a;类、对象、成员函数和成员变量。 类&#xff08;Class&#xff09;&#xff1a;类是一种用户自定义的数据…

服务器终端快速下载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…