首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
HarmonyOS
发新帖
0
0
[原创]基于增强QUIC协议优化弱网下的直播观看体验
发表于: 2026-9-9 14:30
529
[原创]基于增强QUIC协议优化弱网下的直播观看体验
HarmonyOS SDK
2026-9-9 14:30
529
如今,直播已成为电商、教育、娱乐等各领域信息传递与线上消费的重要载体,而网络质量则是决定直播体验的核心命脉。然而,当用户一旦置身于地铁、户外等弱网环境中,画面卡顿、画质模糊、音画错位等问题便接踵而至,原本精彩的直播瞬间变得支离破碎,用户观看体验随之直线下降。 基于此,HarmonyOS SDK<a href="elink@e7eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3M7X3g2E0L8%4c8W2i4K6u0V1j5$3!0E0L8i4g2F1K9h3y4S2N6r3W2G2L8W2)9J5k6r3E0A6N6q4)9J5k6r3N6#2K9h3c8W2i4K6y4r3K9r3q4Q4y4h3k6K6L8%4g2J5j5$3g2Q4x3@1c8Z5L8i4x3I4">远场通信服务</a>(Remote Communication Kit)提供了QUIC长连接能力,能够在即时通讯、实时推送、在线直播等场景中,显著提升通信效率,即使在弱网环境下,也能保障直播画面无卡顿、无时延,有效提高用户使用体验。  ### 实现原理 当应用冷启动时,传统网络请求需要经历域名解析、TCP连接建立、TLS握手等建链过程,在一次完整的请求中,连接阶段的网络交互会消耗大量时间,从而影响用户首屏加载体验。而Remote Communication QUIC基于QUIC(Quick UDP Internet Connections)协议实现,相比传统的TCP协议,QUIC在建链速度、弱网传输和并发性能方面更具备核心优势。 我们以应用接收长连接服务端消息推送场景为例来进行说明。在服务端主动推送消息的场景下,QUIC长连接通过0RTT建链和多流复用技术,有效优化传统HTTP/1.1及HTTP/2协议中的握手时间长和队头阻塞,降低网络延迟和资源消耗。此外,QUIC长连接能够保持连接的持久性,减少连接建立和断开频率,进一步提升通信效率。  ### 能力优势 ● 抗弱网算法 采用智能丢包重传与动态抗抖动技术,显著优化弱网丢包和抖动时的传输能力,在30%丢包率下仍保障音视频清晰流畅。 ● 物理链路无感切换 支持Wi-Fi与蜂窝网络间无缝迁移,连接自动保持无需重建,用户无感知,通话或直播不中断,体验稳定可靠。 ● 多路复用 单连接内并行传输多路数据流,彻底消除队头阻塞,降低传输延迟,提升带宽利用率与并发性能,尤其适用于实时通信场景。 ### 接收长连接服务端消息推送的开发实现步骤 1. 在.cpp文件导入模块。 ``` #include "RemoteCommunicationKit/rcp_quic.h" #include <stdio.h> #include <stdlib.h> #include <string.h> ``` 2. 在CMakeLists.txt文件中添加以下lib依赖包。 ``` librcp_quic.so ``` 3. 自定义全局变量,可用于QUIC连接与流配置。 ``` uint64_t g_StreamId = 0; uint64_t userData = 0; char *alpn = "h3"; const char *serverName = "www.example.com"; // 示例代码,仅用于展示调用,实际运行请替换为真实的QUIC协议服务端地址 uint64_t serverPort = 443; // 示例代码,仅用于展示调用,实际运行请替换为真实端口 ``` 4. 自定义回调方法,用于后续步骤注册监听事件,可在回调中补充需要的业务逻辑。 ``` // 连接成功时触发 void OnConnectedImpl(Rcp_QuicConn *conn, void *userObject) { (void)conn; if (userObject == NULL) { return; } } // 异常发生时触发 void OnErrorImpl(Rcp_QuicConn *conn, void *userObject, Rcp_QuicErrorCode errCode, const char *errDetail) { (void)conn; if (errCode == 0 || userObject == NULL || errDetail == NULL) { return; } } // 连接关闭时触发 void OnClosedImpl(Rcp_QuicConn *conn, void *userObject) { (void)conn; if (userObject == NULL) { return; } } // 接收到对端传输数据时触发,需要返回接收到的数据大小 void OnReceiveDataImpl(Rcp_QuicConn *conn, void *userObject, uint64_t streamId, const Rcp_QuicStreamData *streamData) { (void)conn; (void)streamId; (void)userObject; uint64_t totalBytes = 0; for (uint32_t i = 0; i < streamData->iovLen; i++) { totalBytes += streamData->iov[i].length; } return totalBytes; } // 接收到流事件时触发 void onQuicStreamEventImpl(Rcp_QuicConn *conn, void *userObject, uint64_t streamId, Rcp_QuicErrorCode errCode, const char *errDetail) { (void)conn; (void)userObject; (void)streamId; (void)errCode; (void)errDetail; } // 接收到对端创建流时触发 void OnStreamInboundImpl(Rcp_QuicConn *conn, void *userObject, uint64_t streamId) { (void)conn; (void)userObject; g_StreamId = streamId; } ``` 5. 初始化QUIC配置项。 ``` // 创建QUIC会话对象,用于管理全局资源 Rcp_QuicSession *session = HMS_Rcp_QuicCreateSession(); // 创建QUIC连接对象,需要指定ALPN协议和用户对象 Rcp_QuicConn *conn = HMS_Rcp_QuicConnCreate(alpn, &userData); // 设置连接建立成功时的回调 HMS_Rcp_QuicConnSetOpt(conn, RCP_QUIC_CONN_ON_CONNECTED_FUNCTION, &OnConnectedImpl, 0); // 设置发生错误时的回调 HMS_Rcp_QuicConnSetOpt(conn, RCP_QUIC_CONN_ON_ERROR_FUNCTION, &OnErrorImpl, 0); // 设置连接关闭时的回调 HMS_Rcp_QuicConnSetOpt(conn, RCP_QUIC_CONN_ON_CLOSED_FUNCTION, &OnClosedImpl, 0); // 设置服务端创建流时的回调 HMS_Rcp_QuicConnSetOpt(conn, RCP_QUIC_CONN_STREAM_INBOUND_FUNCTION, &OnStreamInboundImpl, 0); ``` 6. 与服务端进行连接。 ``` HMS_Rcp_QuicConnConnect(session, conn, serverName, serverPort); ``` 7. 服务端主动创建流,客户端接收到OnStreamInboundImpl回调后,为返回的对端流streamId设置监听事件。 ``` HMS_Rcp_QuicStreamSetOpt(conn, g_StreamId, RCP_QUIC_STREAM_EVENT_FUNCTION, &onQuicStreamEventImpl, 0); HMS_Rcp_QuicStreamSetOpt(conn, g_StreamId, RCP_QUIC_STREAM_DATA_FUNCTION, &OnReceiveDataImpl, 0); ``` 8. 业务完成后,关闭连接并释放资源。 ``` // 关闭流 uint64_t appErr = 0; // 自定义业务状态码,服务端在流关闭时可以接收到此状态码用于对关闭原因进行判断 HMS_Rcp_QuicConnStreamShutdown(conn, g_StreamId, RCP_QUIC_STREAM_SHUTDOWN_WRITE, appErr); HMS_Rcp_QuicConnStreamShutdown(conn, g_StreamId, RCP_QUIC_STREAM_SHUTDOWN_READ, appErr); // 销毁连接对象,关闭所有流并释放连接资源 if (conn != NULL) { HMS_Rcp_QuicConnDestroy(conn); } // 销毁会话对象,释放QUIC全局资源 if (session != NULL) { HMS_Rcp_QuicDestroySession(session); } ``` **了解更多详情>>** 访问<a href="elink@86cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3M7X3g2E0L8%4c8W2i4K6u0V1j5$3!0E0L8i4g2F1K9h3y4S2N6r3W2G2L8W2)9J5k6r3E0A6N6q4)9J5k6r3N6#2K9h3c8W2i4K6y4r3K9r3q4Q4y4h3k6K6L8%4g2J5j5$3g2Q4x3@1c8Z5L8i4x3I4">远场通信服务联盟官网</a> 获取<a href="elink@fd5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3M7X3g2E0L8%4c8W2i4K6u0V1j5$3!0E0L8i4g2F1K9h3y4S2N6r3W2G2L8W2)9J5k6s2q4#2K9h3y4Q4x3X3c8H3k6i4u0K6K9i4y4@1k6h3&6@1i4K6u0V1j5$3!0F1L8X3g2U0N6r3W2G2L8W2)9K6c8X3S2S2i4K6g2X3M7$3!0#2M7X3y4W2i4K6y4p5K9r3#2K6x3b7`.`.">使用QUIC协议进行网络通信开发指导文档</a>
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
最后于
2026-9-9 17:58 被HarmonyOS SDK编辑 ,原因: 文字错误
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
0
)
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
HarmonyOS SDK
258
发帖
190
回帖
0
RANK
关注
私信
他的文章
[原创]HarmonyOS智慧多窗,让应用在任意窗口都“恰到好处”
90
[原创]AI 赋能 Push Kit 场景化消息开发,高效完成鸿蒙应用推送能力接入
283
[原创]HarmonyOS Push Kit 自分类权益 Skill,助力提升权益申请通过率
362
[原创]基于增强QUIC协议优化弱网下的直播观看体验
525
[原创]焕新鸿蒙应用权限管理方案,应用授权体验再升级
484
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部