热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于音视频:音视频进阶教程SEI直播补充增强信息实现

在音视频流媒体利用中,除了能够流媒体通道推拉音视频内容外,还能够应用流SEI(SupplementalEnhancementInformation,媒体补充加强信息)通过流媒体通道

1 SEI性能简介

在音视频流媒体利用中,除了能够流媒体通道推拉音视频内容外,还能够应用流 SEI(Supplemental Enhancement Information,媒体补充加强信息)通过流媒体通道将文本信息与音视频内容打包在一起,从主播端(推流端)推出,并从观众端(拉流端)接管,以此实现文本数据与音视频内容的精准同步的目标。

个别可用于视频画面的精准布局、远端歌词同步、直播答题等利用场景。

SEI 的相干概念及原理请参考 如何了解和应用 SEI(媒体补充加强信息)。

适宜对音讯发送有较高频率和实时性要求,且音讯失落不会影响业务逻辑时,举荐应用 SEI(Supplemental Enhancement Information,媒体补充加强信息)。

2 SEI示例源码下载

请参考 下载示例源码 获取源码。

相干源码请查看 “/ZegoExpressExample/Examples/Others/SupplementalEnhancementInformation” 目录下的文件。

3 实现SEI之前的前提条件

在实现 SEI 性能之前,请确保:

  • 已在我的项目中集成 ZEGO Express SDK,实现根本的实时音视频性能,详情请参考 疾速开始 – 集成 和 疾速开始 – 实现视频通话。
  • 已在 ZEGO 控制台 创立我的项目,并申请无效的 AppID 和 AppSign,详情请参考 控制台 – 项目管理 中的“我的项目信息”。

4 SEI接口应用步骤

发送与接管 SEI 信息性能须要推流和拉流端配对应用能力展现成果,即须要在推流端发送 SEI 信息,拉流端接管 SEI 信息。以下内容将介绍各端如何应用发送与接管 SEI 信息性能。

主播推流发送 SEI 音讯调用流程如下:

  1. 调用 createEngine 接口创立 engine 对象。
  2. 调用 loginRoom 接口登录房间。
  3. 调用 startPublishingStream 接口推流。
  4. 在推流胜利后,调用 sendSEI 接口发送 SEI 信息。

观众拉流接管 SEI 音讯调用流程如下:

  1. 调用 createEngine 接口创立 engine 对象。
  2. 创立 IZegoEventHandler 对象,并重写接管 SEI 信息的 onPlayerRecvSEI 办法,调用 setEventHandler 接口传入创立的 IZegoEventHandler 监听 onPlayerRecvSEI 的回调。
  3. 调用 loginRoom 接口登录房间。
  4. 调用 startPlayingStream 接口拉流。
  5. 在拉流胜利后,接管到推流端发送的 SEI 信息之后触发 onPlayerRecvSEI 回调。
拉流时,如果开发者通过调用 `mutePlayStreamVideo` 或 `muteAllPlayStreamVideo` 接口,设置了只拉音频流时,将无奈接管 SEI 信息。

4.1 (可选)设置 SEI 类型

设置 SEI 类型

因为 SDK 默认应用 ZEGO 自行定义的 SEI(nalu type = 6, payload type = 243)类型打包,且此类型是 SEI 规范未规定的类型,因而跟视频编码器或者视频文件中的 SEI 不存在抵触。但当开发者须要应用第三方解码器解码时(如 FFmpeg),会导致解不出正确的 SEI,此时须要在推流前调用 setSEIConfig 接口更换 SDK 发送 SEI 的类型,应用 UserUnregister 的 SEI(nalu type = 6, payload type = 5)类型打包。

仅当开发者应用第三方解码器解码 SEI 时须要执行该步骤。

  • 接口原型

    /**
     * 设置媒体加强补充信息(SEI)类型
     *
     * 必须在推流之前设置。
     *
     * @param config SEI 配置属性。默认应用 ZEGO 定义的 SEI 类型。
     */
    public void setSEIConfig(ZegoSEIConfig config);
  • 调用示例

    ZegoSEIConfig seiCOnfig= new ZegoSEIConfig();
    // 采纳 H.264 的 SEI (nalu type = 6,payload type = 5) 类型打包,因为视频编码器本身会产生 payload type 为 5 的 SEI,或者应用视频文件推流时,视频文件中也可能存在这样的 SEI,所以应用此类型时,用户须要把 uuid + content 当作 buffer 塞给 SEI 发送接口;此时为了区别视频编码器本身产生的 SEI, App 在发送此类型 SEI 时,能够填写业务特定的 uuid(uuid长度为16字节),接管方应用 SDK 解析 payload type 为 5 的 SEI 时,会依据设置的过滤字符串过滤出 uuid 相符的 SEI 抛给业务,如果没有设置过滤字符串,SDK 会把所有收到的 SEI 都抛给开发者。
    seiConfig.type = ZegoSEIType.USER_UNREGISTER;
    
    engine.setSEIConfig(seiConfig);
    
    // 通过 advancedConfig 设置 uuid 过滤字段,设置之后 SDK 只会抛出前 12 个字节为开发者所设置 uuid 的 SEI
    ZegoEngineConfig engineCOnfig= new ZegoEngineConfig();
    // 其余用户通过 [onPlayerRecvSEI] 收到的 SEI 信息前 12 个字节肯定是 zegozegozego,其余会被过滤
    engineConfig.advancedConfig.put("unregister_sei_filter", "zegozegozego");
    ZegoExpressEngine.setEngineConfig(engineConfig);
    
    // 开始推流
    engine.startPublishingStream("STREAM_ID");

4.2 直播推流方

发送 SEI 信息的接口须要在推流胜利之后调用,接口原型如下:

  • 接口原型

    /**
     * 发送媒体加强补充信息
     *
     * 此接口可在开发者推流传输音视频流数据同时,发送流媒体加强补充信息来同步一些其余附加信息。
     * 个别如同步音乐歌词或视频画面精准布局等场景,可抉择应用发送 SEI。
     * 当推流方发送 SEI 后,拉流方可通过监听 [onPlayerRecvSEI] 的回调获取 SEI 内容。
     * 因为 SEI 信息追随视频帧或音频帧,因为网络问题有可能丢帧,因而 SEI 信息也有可能丢,为解决这种状况,应该在限度频率内多发几次。
     * 限度频率:1秒钟不要超过30次。
     * SEI 数据长度限度为 4096 字节。
     * @param data SEI 内容
     */
    public void sendSEI(byte[] data)
  • 调用示例

    /** 定义 SDK 引擎对象 */
    ZegoExpressEngine engine;
    
    ZegoEngineProfile profile = new ZegoEngineProfile();
    /** 请通过官网注册获取,格局为 123456789L */
    profile.appID = appID;
    /** 请通过官网注册获取,格局为:@"0123456789012345678901234567890123456789012345678901234567890123"(共64个字符)*/
    profile.appSign = appSign; 
    /** 通用场景接入 */
    profile.scenario = ZegoScenario.GENERAL;
    /** 设置app的application 对象 */
    profile.application = getApplication();
    /** 创立引擎 */
    engine = ZegoExpressEngine.createEngine(profile, null);
    // 登录房间
    engine.loginRoom("roomid", new ZegoUser("userid_1"));
    // 推流
    engine.startPublishingStream("streamid");
    // 开发者的其余业务逻辑
    ...;
    // 在业务场景须要的机会发送 SEI 信息
    engine.sendSEI("12345".getBytes());

4.3 直播拉流方

接管 SEI 信息的回调接口须要在拉流胜利之后触发,接口原型如下:

  • 接口原型

    /**
     * 收到远端流的 SEI 内容
     *
     * 拉流胜利后,当远端流调用 sendSEI 后,本端会收到此回调。
     * 若只拉纯音频流,将收不到推流端发送的 SEI 信息。
     * @param streamID 拉流的流 ID
     * @param data SEI 内容
     */
    public void onPlayerRecvSEI(String streamID, byte[] data){
    
    }
  • 调用示例

    /** 定义 SDK 引擎对象 */
    ZegoExpressEngine engine;
    
    ZegoEngineProfile profile = new ZegoEngineProfile();
    /** 请通过官网注册获取,格局为 123456789L */
    profile.appID = appID;
    /** 请通过官网注册获取,格局为:@"0123456789012345678901234567890123456789012345678901234567890123"(共64个字符)*/
    profile.appSign = appSign; 
    /** 通用场景接入 */
    profile.scenario = ZegoScenario.GENERAL;
    /** 设置app的application 对象 */
    profile.application = getApplication();
    /** 创立引擎 */
    engine = ZegoExpressEngine.createEngine(profile, null);
    
    // 创立 IZegoEventHandler 对象, 并重写 onPlayerRecvSEI 办法
    IZegoEventHandler handler = new IZegoEventHandler(){
        // 监听其余回调
        ...;
    
        // 监听接管 SEI 信息的回调, 当发送端调用 sendSEI 发送信息时会触发此回调
        public void onPlayerRecvSEI(String streamID, byte[] data) {
            // 在这里实现业务场景相干的逻辑, 例如展示相干的UI等
            ...;
        }
    
    }
    // 增加监听的回调对象
    engine.setEventHandler(handler);
    // 登录房间
    engine.loginRoom("roomid", new ZegoUser("userid_2"));
    // 拉流, canvas 为 ZegoCanvas 类型的索引 UI 渲染控件的对象
    engine.startPlayingStream("streamid", canvas);
    // 开发者的其余业务逻辑
    ...;

5 获取 SEI更多帮忙

获取本文SEI(Supplemental Enhancement Information,媒体补充加强信息)的开发文档、技术支持,拜访即构文档核心开发文档页,适宜对音讯发送有较高频率和实时性要求,且音讯失落不会影响业务逻辑的开发场景,例直播答题、歌词同步、单流自定义音浪,混流视频画面布局更换的精准管制。

近期有开发布局的开发者可上即构官网查看,恰逢即构七周年全线音视频产品1折的优惠,分割商务获取产品优惠;


推荐阅读
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
想要把迩贴上私人标签92
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有