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

这篇具有很好参考价值的文章主要介绍了基于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以处理下一个NALU
        psrc += scrindex + packelen;
        srclen -= scrindex + packelen;
    } while (!bend && srclen > 0);
}

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

    body[i++] = 0x01; //configurationVersion 必须为1

    //general_profile_idc 8bit
    body[i++] = sps[1]; //HEVCProfileIndication
    //general_profile_compatibility_flags 32 bit
    body[i++] = sps[2];//profile_compatibility
    body[i++] = sps[3];//HEVCLevelIndication
    body[i++] = 0x03;//sps[4];//lengthSizeMinusOne 0x03
    body[i++] = 0xE1;//sps[5];//sps number SPS的序号,是0xE1

    // 48 bit NUll nothing deal in rtmp general_constraint_indicator_flags: 48bits
    body[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: 8bits
    body[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 3bits
    body[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; 03
    body[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; 03
    body[i++] = 0x03;

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

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

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

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

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

音视频是很复杂 的一门综合性应用,值得深入挖掘,特别是结合实际的落地还有很长的路要走,希望能在漫漫长路的旅途中与志同道合的您结识并相伴而行文章来源地址https://www.toymoban.com/news/detail-790011.html

到了这里,关于基于rk3568 Android H265推流SRS低延迟网页播放方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568平台开发系列讲解(音视频篇)RTMP 推流

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP 、 RTSP 、 HLS 、 MPEG-DASH 、 WebRTC 流媒体传输协议等。 RTSP (Real-Time Streaming Protocol):实时流传输协议,用于控制媒体服务器上的实时流传输,支持音频

    2024年02月05日
    浏览(74)
  • 迅为RK3568开发板RTMP推流之视频监控

    1 搭建 RTMP 媒流体服务器 nginx-rtmp 是一个基于 nginx 的 RTMP 服务模块,是一个功能强大的流媒体服务器模块, 它提供了丰富的功能和灵活的配置选项,适用于构建各种规模的流媒体平台和应用。无论是搭建实时视频直播平台、点播系统或多屏互动应用, Nginx-RTMP 都是一个值得考

    2024年02月07日
    浏览(43)
  • Android WebRTC+SRS/ZLM视频通话(4):Android使用WebRTC推流SRS/ZLMediaKit

    来自奔三人员的焦虑日志 接着上一章内容,继续来记录Android是如何使用WebRTC往SRS或ZLMediaKit进行推流。想要在Android设备上实现高质量的实时流媒体推送?那么不要错过 WebRTC、SRS 和 ZLMediaKit 这三个工具! WebRTC 是一种使用标准的 Web 技术实现 P2P 实时通信的开源技术,对于实时

    2024年02月16日
    浏览(38)
  • 基于GB28181-2022实现web无插件播放H265视频

            目前发布的GB28181-2022增加了对前端设备视频H265编码格式的支持,所以实现国标平台通过浏览器对H265视频流的无插件的解码播放将是未来的趋势。         目前大多的方案都是通过平台端把H265转码为H264,再推送到web前端进行解码播放,这种方式因为需要中间的媒体

    2024年02月06日
    浏览(46)
  • 基于Python的pyAV读取H265(HEVC)编码的视频文件

            利用海康威视相机拍出来的视频是H265格式的,相比于常规的H264编码,压缩率更高,但因此如果直接用之前的方法读取,会出现无法读取的情况,如下。         可以看到,对于帧间没有改变的部分,H265编码就只保存一份,因此直接解析出来就都是空白的,只

    2024年02月22日
    浏览(52)
  • RK3568 Android 13 系统裁剪

    android 13 系统裁剪是个大工程,裁剪也是需要大量的测试,才能保证系统的稳定性,以下是RK官方给出的裁剪方案,有兴趣的可以去看一下,对裁剪不是要求过高的可以根据官方的建议,对系统进行裁剪: Rockchip Android平台内存优化及系统裁剪_build_with_go_opt-CSDN博客 然后官方的裁

    2024年02月22日
    浏览(74)
  • android kernel移植5-RK3568

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前面我们已经学会了移植uboot,其实就是把瑞芯微的关于uboot的一些文件的名字和编译指定的文件改为自己定义的问价和名字,那么接下来的Android kernel其实也是一个道理。 需要找到我们的内核默认配置

    2024年02月13日
    浏览(49)
  • rk3568 安卓11 修改android id

    frameworksbasepackagesSettingsProvidersrccomandroidproviderssettingsSettingsProvider.java 系统应用获取的android id 直接写死 上层普通应用 android id跟着sn变化 android id跟着IMEI变化

    2024年04月28日
    浏览(49)
  • RK3568平台 Android13 GKI架构开发方式

    GKI:Generic Kernel Image 通用内核映像。 Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块

    2024年02月04日
    浏览(54)
  • FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

    FPGA基于VCU的H265视频压缩,支持4K60帧,提供工程源码+开发板+技术支持 Xilinx Zynq UltraScale+ ZUEV系列FPGA自带VCU视频编解码功能,VCU有以下特点: • 支持多达 32 个流的同步编码和解码 (最大聚合带宽为3840x2160 @ 60fps) • 低时延速率控制 • 灵活的速率控制:CBR、 VBR 和常量 QP •

    2024年04月13日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包