首页 / 专利库 / 广播 / 数字电视 / 互动电视 / 视频点播 / 一种支持云平台采用双缓冲的实时视频流存储方法

一种支持平台采用双缓冲的实时视频流存储方法

阅读:980发布:2020-05-12

专利汇可以提供一种支持平台采用双缓冲的实时视频流存储方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种支持 云 平台采用双缓冲的实时 视频流 存储方法,包括如下步骤:获取云存储配置文件信息;连接 数据库 ,获取部署ID对应的存储相机列表信息;获取调度 服务器 信息,同时启动存储管理主线程,为每个相机分 配对 应的双缓冲区,建立相机与双缓冲区之间的映射关系;遍历相机列表信息,创建视频流存储线程和视频流接 收线 程;向下级平台或设备发起 视频点播 请求 ,在接收到视频流后,将数据保存到对应的缓冲区中,存储线程根据缓冲区存满标志将视频流存储到云平台上。本发明能够在一定程度上提高了视频存储的效率,减少不可逆转的视频丢失问题,同时也可以在一定程度上提高视频存储的安全性。,下面是一种支持平台采用双缓冲的实时视频流存储方法专利的具体信息内容。

1.一种支持平台采用双缓冲的实时视频流存储方法,其特征在于,所述方法包括如下步骤:
步骤1、获取云存储配置文件信息,所述信息包括服务部署ID、云平台配置信息、数据库配置信息;
步骤2、初始化数据库连接,连接所述数据库,获取所述部署ID对应的存储相机列表信息;
步骤3、获取调度服务信息,同时启动存储管理主线程,为每个相机分配对应的双缓冲区,建立相机与双缓冲区之间的映射关系,进行内存的一次性申请
步骤4、遍历相机列表信息,创建视频流存储线程和视频流接收线程,每路视频对应一个存储线程和一个视频流接收线程,同时建立相机与存储线程、视频流接收线程之间的映射关系,并向调度服务发起实时视频播放请求
步骤5、所述调度服务向下级平台或设备发起视频点播请求,为每路视频开启一个存储线程和一个视频流接收线程;
步骤6、所述视频流接收线程在接收到视频流后,将视频数据保存到对应的缓冲区中,所述存储线程根据缓冲区存满标志将所述视频数据存储到所述云平台上,并将时间节点信息保存至数据库中,所述视频流接收线程接收视频流的具体方式为判断所述视频流的长度是否大于RTP包头长度,如果小于则直接丢弃;否则,获取到视频流数据,获取视频类型;
如果是I帧,判断临时接收缓冲区中是否有数据,如果没有,则直接将数据保存至所述临时缓冲区;如果有数据,则将所述临时缓冲区中的数据保存至所述缓冲区中,将接收到的I帧保存至所述临时缓冲区;如果是P帧,判断是否找到了I帧,如果没有找到,则丢弃掉,如果已经找到,则将视频流保存至临时缓冲区中
步骤7、在存储完成后,重置所述相机的缓冲区,同时将所述视频流存储信息保存到所述数据库中;重复步骤3-7,直到接收到退出指令。
2.根据权利要求1所述的实时视频流存储方法,其特征在于,所述相机双缓冲区为主缓冲区和备用缓冲区,所述主缓冲区和所述备用缓冲区交替使用。
3.根据权利要求2所述的实时视频流存储方法,其特征在于,所述每个缓冲区的结构为{相机编号、存储状态、当前已经存储的数据大小、I帧列表信息(I帧偏移量、时间戳)}。
4.根据权利要求1所述的实时视频流存储方法,其特征在于,所述步骤6中所述存储接口根据所述云平台配置信息中的参数调用云平台接口进行初始化,所述存储线程通过所述云平台的存储接口将所述视频流保存到所述云平台上。
5.根据权利要求3所述的实时视频流存储方法,其特征在于,所述步骤6中所述视频流接收线程接收视频流
每次在处理完成后更新接收序号和接收时间戳信息。
6.根据权利要求5所述的实时视频流存储方法,其特征在于,所述I帧序列数据入双缓冲区实现步骤如下:
步骤11、获取所述I帧序列数据、数据长度、I帧绝对时间信息;
步骤12、获取所述主缓冲区的状态,判断所述备用缓冲区中是否有数据,如果有数据,则执行步骤13;否则执行步骤14;
步骤13、获取所述备用缓冲区的剩余空间,判断所述备用缓冲区的剩余空间是否存够存储,如果是,则将数据拷贝至所述备用缓冲区,执行步骤15;否则将所述备用缓冲区的状态设置成已满,将剩下的空间进行占位填充,同时将数据拷贝至所述主缓冲区,执行步骤
15;
步骤14、判断所述主缓冲区的剩余空间是否足够存储,如果足够存储,则将数据拷贝至所述主缓冲区,执行步骤15;否则将所述主缓冲区的状态设置为已满,将剩下的空间进行占位填充,并将数据拷贝至所述备用缓冲区,执行步骤15;
步骤15、处理完毕。
7.根据权利要求6所述的实时视频流存储方法,其特征在于,所述视频流存储线程实现步骤如下:
步骤21、根据所述配置文件中的云平台配置信息初始化云平台接口、相机编号以及双缓冲区信息;
步骤22、启动所述视频流存储线程;
步骤23、判断是否接收到服务的退出命令,如果接收到退出命令,则退出循环,等待程序退出,否则执行步骤24;
步骤24、判断所述主缓冲区是否已满,如果已满,则调用所述云平台存储接口将数据保存至云平台,如果存储成功,则将视频片段信息保存至数据库,重置缓冲区,执行步骤25;
步骤25、判断所述备用缓冲区是否已经写满,如果所述备用缓冲区已经写满,则调用云平台存储接口将数据保存至云平台,如果存储成功,则将视频片段信息保存至数据库,重置缓冲区,执行步骤26;
步骤26、进行下一轮的判断,执行步骤23。
8.根据权利要求6所述的实时视频流存储方法,其特征在于,所述视频流接收线程实现步骤如下:
步骤31、初始化所述视频流接收线程,包括所述相机编号、双缓冲区;
步骤32、生成视频流接收端口,并设置临时接收缓冲区;
步骤33、启动所述视频流接收线程;
步骤34、在所述视频流接收线程中判断是否接收到退出命令,如果接收到,则执行步骤
35,否则执行步骤36;
步骤35、停止接收视频流,并判断双缓冲区中是否有需要存储的视频数据,如果有,将缓冲区的存满标志置成已满,并进行数据占位填充(保证整个缓冲区都是填满的),如果没有,则退出循环,等待线程退出;
步骤36、准备接收视频流,判断是否接收到所述视频流接收线程的退出信号,如果接收到,则执行步骤35;否则执行步骤37;
步骤37、获取视频数据、帧类型,如果是I帧,判断基准时间是否存在,如果不存在,则将基准时间设置为当前时间,根据RTP数据的时间戳信息以及基准时间更新I帧绝对时间,执行步骤38;如果不是I帧,则执行步骤39;
步骤38、将之前保存的整个I帧序列保存至双缓冲区,将新接收到I帧保存至临时接收缓冲区,并更新序号、时间戳信息,执行步骤36;
步骤39、判断是否已经接收到I帧,如果已经收到了I帧,则将接收到的视频数据保存至临时接收缓冲区,并更新序号、时间戳信息,执行步骤36;否则数据丢弃,更新序号、时间戳信息,执行步骤36。

说明书全文

一种支持平台采用双缓冲的实时视频流存储方法

技术领域

[0001] 本发明涉及云存储技术领域,尤其涉及一种支持云平台采用双缓冲的实时视频流存储方法。

背景技术

[0002] 随着整个安防行业技术平的不断成熟以及社会治安事件复杂度的不断提高,原有的以硬盘存储视频的方式已经达不到破案的要求,视频在存储周期、访问效率以及安全性方面也有了更高的要求。
[0003] 在这个大的应用背景下,基于云存储的实现架构应运而生,如阿里云、百度云、华为云等。一般云存储分为:文件存储、存储和对象存储,文件存储和块存储是传统的存储数据方式;对象存储服务是面向企业和个人开发者提供的高可用,高稳定,强安全的云端存储服务,对象存储是目前最常用的云存储方案,克服了块存储和文件存储的缺点。同原有的存储架构相比,使用云存储在可靠性、安全、成本以及数据处理方面都具有明显的优势。就可靠性而言,对象存储服务的可运行性不低于99.9%,规模自动扩展,不影响对外服务,同时采用了多重冗余备份机制来增强其安全性,而采用自建服务器存储,其可靠性受限于存储服务的硬件环境,相比于对象存储,易出现不可逆转的数据丢失问题;就安全性而言,对象存储提供企业级多层次安全防护,而用户自建存储需要单独实现;就成本而言,对象存储根据存储大小按需收费,成本低,而用户自建存储则是一次性投入、资源的利用率很低,存储受硬盘容量限制;就处理能力而言,采用对象存储架构,提供内容加速分发功能,其存储效率远高于用户自建存储服务模式。

发明内容

[0004] 有鉴于现有技术的上述缺陷,本发明提供一种支持云平台采用双缓冲的实时视频流存储方法,由云存储服务自动向下级平台或前端设备进行点播请求,获取到视频流,采用自定义的存储模式进行视频流存储,能够在一定程度上提高了视频存储的效率,减少不可逆转的视频丢失问题,同时也可以在一定程度上提高视频存储的安全性。
[0005] 本发明所采用的技术方案是:一种支持云平台采用双缓冲的实时视频流存储方法,包括如下步骤:
[0006] 步骤1、获取云存储配置文件信息,所述信息包括服务部署ID、云平台配置信息、数据库配置信息;
[0007] 步骤2、初始化数据库连接,连接所述数据库,获取所述部署ID对应的存储相机列表信息;
[0008] 步骤3、获取调度服务器信息,同时启动存储管理主线程,为每个相机分配对应的双缓冲区,建立相机与双缓冲区之间的映射关系,进行内存的一次性申请
[0009] 步骤4、遍历相机列表信息,创建视频流存储线程和视频流接收线程,每路视频对应一个存储线程和一个视频流接收线程,同时建立相机与存储线程、视频流接收线程之间的映射关系,并向调度服务发起实时视频播放请求;
[0010] 步骤5、所述调度服务向下级平台或设备发起视频点播请求,为每路视频开启一个存储线程和一个视频流接收线程;
[0011] 步骤6、所述视频流接收线程在接收到视频流后,将视频数据保存到对应的缓冲区中,所述存储线程根据缓冲区存满标志将所述视频数据存储到所述云平台上,并将时间节点信息保存至数据库中;
[0012] 步骤7、在存储完成后,重置所述相机的缓冲区,同时将视频流存储信息保存到所述数据库中;重复步骤3-7,直到接收到退出指令。
[0013] 在本发明较佳实施方式中,所述相机双缓冲区为主缓冲区和备用缓冲区,所述主缓冲区和所述备用缓冲区交替使用。
[0014] 在本发明另一较佳实施方式中,所述每个缓冲区的结构为{相机编号、存储状态、当前已经存储的数据大小、I列表信息(I帧偏移量、时间戳)}。
[0015] 在本发明较佳实施方式中,所述步骤6中所述存储接口根据所述云平台配置信息中的参数调用云平台接口进行初始化,所述存储线程通过所述云平台的存储接口将所述视频流保存到所述云平台上。
[0016] 在本发明另一较佳实施方式中,所述步骤6中所述视频流接收线程接收视频流的具体方式为:
[0017] 判断所述视频流的长度是否大于RTP包头长度,如果小于则直接丢弃;
[0018] 否则获取到视频流数据,获取视频帧类型;
[0019] 如果是I帧,判断临时接收缓冲区中是否有数据,如果没有,则直接将数据保存至所述临时缓冲区;如果有数据,则将所述临时缓冲区中的数据保存至所述缓冲区中,将接收到的I帧保存至所述临时缓冲区;
[0020] 如果是P帧,判断是否找到了I帧,如果没有找到,则丢弃掉,如果已经找到,则将视频流保存至临时缓冲区中;
[0021] 每次在处理完成后更新接收序号和接收时间戳信息。
[0022] 在本发明较佳实施方式中,所述I帧序列数据入双缓冲区实现步骤如下:
[0023] 步骤11、获取所述I帧序列数据、数据长度、I帧绝对时间信息;
[0024] 步骤12、获取所述主缓冲区的状态,判断所述备用缓冲区中是否有数据,如果有数据,则执行步骤13;否则执行步骤14;
[0025] 步骤13、获取所述备用缓冲区的剩余空间,判断所述备用缓冲区的剩余空间是否存够存储,如果是,则将数据拷贝至所述备用缓冲区,执行步骤15;否则将所述备用缓冲区的状态设置成已满,将剩下的空间进行占位填充,同时将数据拷贝至所述主缓冲区,执行步骤15;
[0026] 步骤14、判断所述主缓冲区的剩余空间是否足够存储,如果足够存储,则将数据拷贝至所述主缓冲区,执行步骤15;否则将所述主缓冲区的状态设置为已满,将剩下的空间进行占位填充,并将数据拷贝至所述备用缓冲区,执行步骤15;
[0027] 步骤15、处理完毕。
[0028] 在本发明另一较佳实施方式中,所述视频流存储线程实现步骤如下:
[0029] 步骤21、根据所述配置文件中的云平台配置信息初始化云平台接口、相机编号以及双缓冲区信息;
[0030] 步骤22、启动所述视频流存储线程;
[0031] 步骤23、判断是否接收到服务的退出命令,如果接收到退出命令,则退出循环,等待程序退出,否则执行步骤24;
[0032] 步骤24、判断所述主缓冲区是否已满,如果已满,则调用所述云平台存储接口将数据保存至云平台,如果存储成功,则将视频片段信息保存至数据库,重置缓冲区,执行步骤25;
[0033] 步骤25、判断所述备用缓冲区是否已经写满,如果所述备用缓冲区已经写满,则调用云平台存储接口将数据保存至云平台,如果存储成功,则将视频片段信息保存至数据库,重置缓冲区,执行步骤26;
[0034] 步骤26、进行下一轮的判断,执行步骤23。
[0035] 在本发明较佳实施方式中,所述视频流接收线程实现步骤如下:
[0036] 步骤31、初始化所述视频流接收线程,包括所述相机编号、双缓冲区;
[0037] 步骤32、生成视频流接收端口,并设置临时接收缓冲区;
[0038] 步骤33、启动所述视频流接收线程;
[0039] 步骤34、在所述视频流接收线程中判断是否接收到退出命令,如果接收到,则执行步骤35,否则执行步骤36;
[0040] 步骤35、停止接收视频流,并判断双缓冲区中是否有需要存储的视频数据,如果有,将缓冲区的存满标志置成已满,并进行数据占位填充(保证整个缓冲区都是填满的),如果没有,则退出循环,等待线程退出;
[0041] 步骤36、准备接收视频流,判断是否接收到所述视频流接收线程的退出信号,如果接收到,则执行步骤35;否则执行步骤37;
[0042] 步骤37、获取视频数据、帧类型,如果是I帧,判断基准时间是否存在,如果不存在,则将基准时间设置为当前时间,根据RTP数据的时间戳信息以及基准时间更新I帧绝对时间,执行步骤38;如果不是I帧,则执行步骤39;
[0043] 步骤38、将之前保存的整个I帧序列保存至双缓冲区,将新接收到I帧保存至临时接收缓冲区,并更新序号、时间戳信息,执行步骤36;
[0044] 步骤39、判断是否已经接收到I帧,如果已经收到了I帧,则将接收到的视频数据保存至临时接收缓冲区,并更新序号、时间戳信息,执行步骤36;否则数据丢弃,更新序号、时间戳信息,执行步骤36
[0045] 本发明能充分的提高视频的存储和访问效率,视频存储时每个片段里面都包含有一个或多个I帧序列信息,在下载后通过解析后直接进行播放,不存在找不到I帧而无法播放的问题;同时,当缓冲区的大小不足以存储一个I帧序列时,将缓冲区的存满标志设置为已满,将数据区剩余空间进行占位填充,这样在存储时可以减少存储碎片的产生,提高访问效率。
[0046] 从安全性度而言,由于本发明视频存储时是按照指定的格式进行存储和数据填充,在一定程度上可以提高视频存储的安全性,没有视频存储的结构信息则无法快速的对视频进行解析,从而提高了视频存储和访问的安全性。。附图说明
[0047] 图1是本发明一较佳实施例中的实时视频流存储方法方法流程示意图;
[0048] 图2是本发明另一较佳实施例中的云平台配置信息结构示意图;
[0049] 图3是本发明一较佳实施例中的双缓冲区存储结构示意图;
[0050] 图4是本发明另一较佳实施例中的I帧序列数据入双缓冲区模块实现流程示意图;
[0051] 图5是本发明一较佳实施例中的视频流存储线程实现流程示意图;
[0052] 图6是本发明另一较佳实施例中的视频流接收线程实现流程示意图。

具体实施方式

[0053] 下面对本发明的较佳实施例进行详细阐述,以使本发明的优点和特征能更易于被本领域技术人员理解,从而对本发明的保护范围做出更为清楚明确的界定。
[0054] 本实施例公开一种支持云平台采用双缓冲的实时视频流存储方法,具体流程如图1所示,包括如下步骤:
[0055] 步骤1、获取云存储配置文件信息,配置文件信息包括服务部署ID、云平台配置信息、数据库配置信息。
[0056] 其中,云平台配置信息结构如图2所示,包括实例编号、云平台登录信息、访问权限和分区配置信息。
[0057] 步骤2、初始化数据库连接,连接数据库,获取部署ID对应的存储相机列表信息。
[0058] 实时视频流存储支持分布式部署。
[0059] 步骤3、获取调度服务器信息,同时启动存储管理主线程,为每个相机分配对应的双缓冲区,建立相机与双缓冲区之间的映射关系,进行内存的一次性申请。
[0060] 其中,视频流的获取由调度服务向下级平台/设备发起请求,由下级平台/设备将码流发给实时视频流存储服务。
[0061] 双缓冲为主缓冲区和备用缓冲区两个缓冲区,主缓冲区和备用缓冲区交替使用,双缓冲区存储结构如图3所示,每个缓冲区结构为{相机编号、存储状态、当前已经存储的数据大小、I帧列表信息(I帧偏移量、时间戳)}。
[0062] 双缓冲区数据保存过程如下:
[0063] 获取当前缓冲区剩余空间,两个缓冲区默认大小设置可以根据实际情况进行设置,当接收到一个完整的I帧序列时数据时,将该数据存入主缓冲区,当不是一个完整的I帧序列数据时,则将该数据保存在临时缓冲区。如果缓冲区剩余空间小于接收到的I帧数据,则将该缓冲区标志设置为已满,并将缓冲区剩余空间进行占位填充,将已经接收到的数据保存至另一个缓冲区中,并将I帧的时间戳信息保存起来,更新数据总大小信息。
[0064] 步骤4、遍历相机列表信息,创建视频流存储线程和视频流接收线程,每路视频对应一个存储线程和一个视频流接收线程,同时建立相机与存储线程、视频流接收线程之间的映射关系,并向调度服务发起实时视频播放请求。
[0065] 步骤5、调度服务向下级平台或设备发起视频点播请求,为每路视频开启一个存储线程和一个视频流接收线程。
[0066] 步骤6、视频流接收线程在接收到视频流后,将数据保存到对应的缓冲区中,存储线程根据缓冲区存满标志将视频流存储到云平台上,并将时间节点信息保存至数据库中。
[0067] 视频流接收线程接收视频流的具体方式为:
[0068] 判断视频流的长度是否大于RTP包头长度,如果小于则直接丢弃;
[0069] 否则获取到视频流数据,获取视频帧类型;
[0070] 如果是I帧,判断临时接收缓冲区中是否有数据,如果没有,则直接将数据保存至临时缓冲区;如果有数据,则将临时缓冲区中的数据保存至缓冲区中,将接收到的I帧保存至临时缓冲区;
[0071] 如果是P帧,判断是否找到了I帧,如果没有找到,则丢弃掉,如果已经找到,则将视频流保存至临时缓冲区中;
[0072] 每次在处理完成后更新接收序号和接收时间戳信息。
[0073] I帧序列数据入双缓冲区实现流程如图4所示,具体步骤如下:
[0074] 步骤11、根据获取到I帧序列数据、数据长度、I帧绝对时间信息;
[0075] 步骤12、获取主缓冲区的状态,判断备用缓冲区中是否有数据,如果有数据,则执行步骤13;否则执行步骤14;
[0076] 步骤13、获取备用缓冲区的剩余空间,判断备用缓冲区的剩余空间是否存够存储,如果是,则将数据拷贝至备用缓冲区,执行步骤15;否则将备用缓冲区的状态设置成已满,将剩下的空间进行占位填充,同时将数据拷贝至主缓冲区,执行步骤15
[0077] 步骤14、判断主缓冲区的剩余空间是否足够存储,如果足够存储,则将数据拷贝至主缓冲区,执行步骤15;否则将主缓冲区的状态设置为已满,将剩下的空间进行占位填充,并将数据拷贝至备用缓冲区,执行步骤15;
[0078] 步骤15、处理完毕。
[0079] 视频流存储线程实现流程如图4所示,具体步骤如下:
[0080] 步骤21、根据配置文件中的云平台配置信息初始化云平台接口、相机编号以及双缓冲区信息;
[0081] 步骤22、启动视频流存储线程;
[0082] 步骤23、判断是否接收到服务的退出命令,如果接收到退出命令,则退出循环,等待程序退出,否则执行步骤24;
[0083] 步骤24、判断主缓冲区是否已满,如果已满,则调用云平台存储接口将数据保存至云平台,如果存储成功,则将视频片段信息保存至数据库,重置缓冲区,执行步骤25;
[0084] 步骤25、判断备用缓冲区是否已经写满,如果备用缓冲区已经写满,则调用云平台存储接口将数据保存至云平台,如果存储成功,则将视频片段信息保存至数据库,重置缓冲区,执行步骤26;
[0085] 步骤26、进行下一轮的判断,执行步骤23。
[0086] 存储接口通过云平台配置信息进行初始化。
[0087] 视频流接收线程实现流程如图5所示,具体步骤如下:
[0088] 步骤31、初始化视频流接收线程,包括相机编号、双缓冲区;
[0089] 步骤32、生成视频流接收端口,并设置临时接收缓冲区;
[0090] 步骤33、启动视频流接收线程;
[0091] 步骤34、在视频流接收线程中判断是否接收到退出命令,如果接收到,则执行步骤35,否则执行步骤36;
[0092] 步骤35、停止接收视频流,并判断双缓冲区中是否有需要存储的视频数据,如果有,将缓冲区的存满标志置成已满,并进行数据占位填充(保证整个缓冲区都是填满的),如果没有,则退出循环,等待线程退出;
[0093] 步骤36、准备接收视频流,判断是否接收到线程的退出信号,如果接收到,则执行步骤35;否则执行步骤37;
[0094] 步骤37、获取视频数据、帧类型,如果是I帧,判断基准时间是否存在,(RTP((Realtime Transport Protocol,实时传输协议))数据获取到的时间戳都是相对时间),如果不存在,则将基准时间设置为当前时间,根据RTP数据的时间戳信息以及基准时间更新I帧绝对时间,执行步骤38;如果不是I帧,则执行步骤39;
[0095] 步骤38、将之前保存的整个I帧序列保存至双缓冲区,将新接收到I帧保存至临时接收缓冲区,并更新序号、时间戳信息,执行步骤36;
[0096] 步骤39、判断是否已经接收到I帧,如果已经收到了I帧,则将接收到的视频数据保存至临时接收缓冲区,并更新序号、时间戳信息,执行步骤36;否则数据丢弃,更新序号、时间戳信息,执行步骤36。
[0097] 步骤7在存储完成后,重置相机的缓冲区,同时将视频流存储信息保存到数据库中;重复步骤3-7,直到接收到退出指令。
[0098] 以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈