一种基于KCP协议的Android端到端直播方法

文档序号:1315078 发布日期:2020-07-10 浏览:10次 >En<

阅读说明:本技术 一种基于KCP协议的Android端到端直播方法 (Android end-to-end live broadcast method based on KCP protocol ) 是由 王进 周郁淳 于 2020-02-17 设计创作,主要内容包括:本发明请求保护一种基于KCP协议的Android端到端直播方法,包括:101Android推流端采集直播音视频数据进行本机预览并拷贝到本机;102Android推流端对拷贝的数据进行转码;103Android推流端通过KCP将数据发送到Android播放端;104Android播放端通过KCP对数据进行接收;105Android播放端对收到的数据进行计算;106Android播放端对数据进行播放。本发明主要是通过Android推流端对采集到的音视频数据进行拷贝和转码,通过KCP协议进行发送,Android播放端对接收到的数据行进解压、计算和播放,使得直播能够在网络不佳的情况下依旧能维持观看的实时性、流畅性,优化用户的直播体验。(The invention discloses an Android end-to-end live broadcast method based on a KCP protocol, which comprises the following steps: 101, an Android plug-in terminal collects live audio and video data to preview the local computer and copies the live audio and video data to the local computer; 102Android plug-flow terminals transcode copied data; 103, the Android streaming end sends data to an Android playing end through KCP; 104 receiving the data by the Android playing terminal through KCP; 105, calculating the received data by the Android playing end; and 106, playing the data by the Android playing end. According to the method, the Android stream pushing end is mainly used for copying and transcoding the collected audio and video data, the Android stream pushing end is used for sending the audio and video data through a KCP (KCP protocol), and the Android playing end is used for decompressing, calculating and playing the received data, so that live broadcasting can still maintain the real-time performance and the fluency of watching under the condition of poor network, and the live broadcasting experience of a user is optimized.)

一种基于KCP协议的Android端到端直播方法

技术领域

本发明属于视频传输技术领域,尤其基于KCP协议的Android端到端直播方法。

背景技术

偏传统的Android端到端直播方法通常采用RTMP和HLS协议进行传播。RTMP 的直播时延可以维持在2s,但是当网络不稳定时,由于RTMP是基于TCP的协议,它充分利用网络带宽的属性将使得其在直播方案中接收端无法按时接收到的数据,于是便造成了直播延时;HLS协议由于其设计原理是必须用4-10s的时间缓存M3U8文件和TS的Playlist,导致HLS的直播时延一定是4s以上。

KCP协议是一个以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果的协议,他可以在网络状态很差的场景下,更快的传输数据。由于KCP的流量耗费巨大,仅用于游戏研发领域。而在网络状态很差的情况下,KCP对流量的高耗费将使得数据更高效的传播,于是本文将它应用于Android’端到端的视频直播,可以在网络状态很差的情况下保证Android播放端能准时接收到Android推流端的视频数据,从而提高直播的实时性和流畅性。基于网络状态很差的场景,进行了本发明创造。

发明内容

本发明旨在解决现有技术中的问题。提出了一种使得直播能够在网络不佳的情况下依旧能维持观看的实时性、流畅性、优化用户的直播体验基于KCP协议的Android端到端直播方法。本发明的技术方案如下:

一种基于KCP协议的Android端到端直播方法,其包括以下步骤:

101.Android推流端采集直播音视频数据,进行本机预览后拷贝到本机;

102.Android推流端对拷贝的数据进行转码;

103.Android推流端通过KCP(快速可靠传输协议)将数据发送到Android 播放端;

104.Android播放端通过KCP对数据进行接收;

105.Android播放端对收到的数据采用追帧算法进行计算;

106.Android播放端对数据进行播放。

进一步的,所述步骤101Android推流端采集直播音视频数据进行本机预览并拷贝到本机,具体步骤为:

1011.直播音视频数据采集:打开手机前置或后置摄像头,再设置欲得数据的宽和高,然后在手机摄像头回调函数中循环获取视频数据Image0,每次获得的Image0为当前时刻摄像头产生的图片;

1012.直播音视频数据拷贝:对每个Image0进行拷贝,将拷贝的数据Image1 依次存于阻塞队列Queue0;

1013.直播音视频数据预览:将Image0依次显示于手机显示屏上。

进一步的,所述步骤102Android推流端对拷贝的数据进行转码的具体步骤为:

1021.直播音视频拷贝数据加水印:依次从Queue0中取出数据a0,并将a0 用数组a0[i0][j0]存储,其中i0表示该图片的宽度,单位为像素;j0表示该图片的高度,单位为像素;

将当前日期和时间生成为一张图片,并用数组a1[i1][j1]存储,其中i1表示该水印的宽度,单位为像素;j1表示该水印的高度,单位为像素,a1中表示日期和时间的元素值为1,其它元素值为0;

如需将水印加在离a0图片左边界x像素距离,离a0图片上边界y像素距离的位置,则从a0中找到从a0[x][y]开始,到a0[x+i1][y+j1]为结束的矩阵 a2[i1][j1],将a1[a][b]与a2[a][b]进行对比,当a1[a][b]元素值为1时,将 a2[a][b]的元素值置为c,c为想要添加的水印颜色在当前编码格式中对应的数值,其中,a∈{0,i1-1},b∈{0,j1-1};

1022.直播音视频拷贝数据转码:加水印后的a0的格式为NV21,需将a0转为NV12后,再将a0按照H264编码为a1,最后,Android推流端会将a1保存到阻塞队列Queue1中,等待被发送;

1023.用户可选择的将所推视频数据存于Android推流端本地:将a1进行拷贝,剔除SPS、PPS数据,即可将数据封装为MP4数据存储于指定的手机存储位置。

进一步的,所述步骤103Android推流端通过KCP将数据发送到Android播放端的具体步骤为:

1031.创建并初始化KCP对象:创建并初始化KCP对象Object-KCP,并为Object-KCP设置传输回调函数F0,F0的作用是调用底层的UDP接收函数F1;

1032.循环调用KCP更新函数KCP-Update:每10ms调用一次KCP-Update,在KCP-Update中处理数据接收逻辑和数据发送逻辑;

KCP-Update中数据接收逻辑为:应用层通过F1将收到数据D0通过KCP入口函数KCP-Input传输给KCP-Update中的F0,F0会将D0解析和二次封装成D1后传递到KCP接收函数KCP-Recv中,应用层通过调用KCP-Recv就可以获取到处理好的D1;

KCP-Update中数据发送逻辑为:应用层通过KCP发送函数KCP-Send将需要发送的数据D2发送到KCP-Update,KCP-Update中会将D2分片和编号并封装成D3,再通过KCP出口函数KCP-Out调用UDP发送函数F2,将D3发送出去;

1033.Android推流端对KCP-Update的调用方法:Android推流端使用KCP- Update中数据发送逻辑发送Queue1中的视频数据包,使用KCP-Update中数据接收逻辑接收Android播放端发送过来的确认收包回复ACK并且根据ACK判断是否需要进行重传。

进一步的,所述步骤104Android播放端通过KCP对数据进行接收的具体步骤为:

Android播放端对KCP-Update的调用方法:Android播放端使用KCP-Update 中数据发送逻辑发送视频数据包的确认收包回复ACK,使用KCP-Update中数据接收逻辑接收Android推流端发送过来的视频数据包,再根据包的编号判断是否需要进行丢包,Android播放端会将需要播放的数据包保存到阻塞队列Queue2 中。

进一步的,所述步骤105Android播放端对收到的数据进行计算的具体步骤为:

1051.Android播放端对收到的数据进行解码:从Queue2中取出需要播放的视频数据,该视频数据为H264数据,需要解码后成NV12数据后才能进行显示,解码后的数据放在阻塞队列Queue3中;

1052.Android播放端对收到的视频数据进行追帧运算:假设一个时间单位 t内播放端会收到一个包。当网络不稳定时,播放端可能会从第z个时间单位起收不到数据包,而在第z+n个时间单位收到n个数据包,此时播放器如果依次从Queue2中取包进行解码和播放的话,直播画面就会有延迟,因为原本在第z 个时间单位就应该播放的包,在第z+n个时间单位才收到,Android播放端会启动追帧以使播放器播放与当前时间对应的数据,具体追帧算法为:丢弃第z+n 个时间单位收到n个数据包的前n-1个包,直接解码并播放第n个数据包。

进一步的,所述步骤106Android播放端对收到的数据进行播放的具体步骤为:

1061.Android播放端对收到的数据进行渲染:从Queue3中取出视频数据并绘制于Android播放端的显示屏幕上;

1062.用户可选择对Android播放端进行暂停播放操作和继续播放操作:当用户选择暂停播放时,播放器将先停止向Queue1放数据,即不再存储任何一个数据包,然后清空Queue1,继而清空Queue2。当用户暂停后又选择继续播放时,播放器重新开始对每一个收到的包进行存储、解码和渲染。

本发明的优点及有益效果如下:

本发明的创新点主要是步骤103和步骤104。由于KCP的流量耗费巨大,仅用于游戏研发领域。而在网络状态很差的情况下,KCP对流量的高耗费将使得数据更高效的传播,于是本文将它应用于Android’端到端的视频直播,可以在网络状态很差的情况下保证Android播放端能准时接收到Android推流端的视频数据,从而提高直播的实时性和流畅性。

附图说明

图1是本发明实施例一提供的一种基于KCP协议的Android端到端直播方法的流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、详细地描述。所描述的实施例仅仅是本发明的一部分实施例。

本发明解决上述技术问题的技术方案是:

参考图1,图1为本发明实施例一提供一种基于KCP协议的Android端到端直播方法的流程图,具体包括:

101.Android推流端采集直播音视频数据进行本机预览并拷贝到本机,具体如下:

1011.直播音视频数据采集:打开手机前置或后置摄像头,再设置欲得数据的宽和高,然后在手机摄像头回调函数中循环获取视频数据Image0,每次获得的Image0为当前时刻摄像头产生的图片。

1012.直播音视频数据拷贝:对每个Image0进行拷贝,将拷贝的数据Image1 依次存于阻塞队列Queue0。

1013.直播音视频数据预览:将Image0依次显示于手机显示屏上。

102.Android推流端对拷贝的数据进行转码,具体如下:

1021.直播音视频拷贝数据加水印:依次从Queue0中取出数据a0,并将a0 用数组a0[i0][j0]存储,其中i0表示该图片的宽度,单位为像素;j0表示该图片的高度,单位为像素。

将当前日期和时间生成为一张图片,并用数组a1[i1][j1]存储,其中i1表示该水印的宽度,单位为像素;j1表示该水印的高度,单位为像素。a1中表示日期和时间的元素值为1,其它元素值为0。

如需将水印加在离a0图片左边界x像素距离,离a0图片上边界y像素距离的位置,则从a0中找到从a0[x][y]开始,到a0[x+i1][y+j1]为结束的矩阵 a2[i1][j1],将a1[a][b]与a2[a][b]进行对比,当a1[a][b]元素值为1时,将 a2[a][b]的元素值置为c(c为想要添加的水印颜色在当前编码格式中对应的数值),其中,a∈{0,i1-1},b∈{0,j1-1};

1022.直播音视频拷贝数据转码:加水印后的a0的格式为NV21,需将a0转为NV12后,再将a0按照H264编码为a1。最后,Android推流端会将a1保存到阻塞队列Queue1中,等待被发送。

1023.用户可选择将所推视频数据存于Android推流端本地:将a1进行拷贝,剔除SPS、PPS数据,即可将数据封装为MP4数据存储于指定的手机存储位置。

103.103Android推流端通过KCP将数据发送到Android播放端,具体如下:

1031.创建并初始化KCP对象:创建并初始化KCP对象Object-KCP,并为 Object-KCP设置传输回调函数F0。F0的作用是调用底层的UDP接收函数F1。

1032.循环调用KCP更新函数KCP-Update:每10ms调用一次KCP-Update,在KCP-Update中处理数据接收逻辑和数据发送逻辑。

KCP-Update中数据接收逻辑为:应用层通过F1将收到数据D0通过KCP入口函数KCP-Input传输给KCP-Update中的F0,F0会将D0解析和二次封装成 D1后传递到KCP接收函数KCP-Recv中,应用层通过调用KCP-Recv就可以获取到处理好的D1。

KCP-Update中数据发送逻辑为:应用层通过KCP发送函数KCP-Send将需要发送的数据D2发送到KCP-Update,KCP-Update中会将D2分片和编号并封装成D3,再通过KCP出口函数KCP-Out调用UDP发送函数F2,将D3发送出去。

1033.Android推流端对KCP-Update的调用方法:Android推流端使用KCP- Update中数据发送逻辑发送Queue1中的视频数据包,使用KCP-Update中数据接收逻辑接收Android播放端发送过来的确认收包回复ACK并且根据ACK判断是否需要进行重传。

104.Android播放端通过KCP对数据进行接收,具体如下:Android播放端对KCP-Update的调用方法:Android播放端使用KCP-Update中数据发送逻辑发送视频数据包的确认收包回复ACK,使用KCP-Update中数据接收逻辑接收 Android推流端发送过来的视频数据包,再根据包的编号判断是否需要进行丢包。Android播放端会将需要播放的数据包保存到阻塞队列Queue2中。1041.相似图的结点的定义:将偏标记数据集中的每一个样本视为相似度图中的结点。

105.Android播放端对收到的数据进行计算,具体如下:

1051.Android播放端对收到的数据进行解码:从Queue2中取出需要播放的视频数据,该数据为H264数据,需要解码后成NV12数据后才能进行显示。解码后的数据放在阻塞队列Queue3中。

1052.Android播放端对收到的视频数据进行追帧运算:假设一个时间单位 t内播放端会收到一个包。当网络不稳定时,播放端可能会从第z个时间单位起收不到数据包,而在第z+n个时间单位收到n个数据包,此时播放器如果依次从Queue2中取包进行解码和播放的话,直播画面就会有延迟,因为原本在第z 个时间单位就应该播放的包,在第z+n个时间单位才收到。这时,为了保证直播视频的实时性,Android播放端会启动追帧以使播放器播放与当前时间对应的数据。具体追帧算法为:丢弃第z+n个时间单位收到n个数据包的前n-1个包,直接解码并播放第n个数据包。

106.Android播放端对收到的数据进行播放,具体如下:

1061.Android播放端对收到的数据进行渲染:从Queue3中取出视频数据并绘制于Android播放端的显示屏幕上。

1062.用户可选择对Android播放端进行暂停播放操作和继续播放操作:当用户选择暂停播放时,播放器将先停止向Queue1放数据,即不再存储任何一个数据包,然后清空Queue1,继而清空Queue2。当用户暂停后又选择继续播放时,播放器重新开始对每一个收到的包进行存储、解码和渲染。

以上这些实施例应理解为仅用于说明本发明而不用于限制本发明的保护范围。在阅读了本发明的记载的内容之后,技术人员可以对本发明作各种改动或修改,这些等效变化和修饰同样落入本发明权利要求所限定的范围。

9页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:基于视频流的直播交互方法及其相应的装置

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类