Android平台下RTMP音视频推流中启停音频容错方法及系统【掌桥专利】 您所在的位置:网站首页 audiorecord函数用法 Android平台下RTMP音视频推流中启停音频容错方法及系统【掌桥专利】

Android平台下RTMP音视频推流中启停音频容错方法及系统【掌桥专利】

2023-03-15 19:05| 来源: 网络整理| 查看: 265

技术领域

本发明涉及移动应用开发和流媒体技术领域,是一种Android平台下RTMP音视频推流中启停音频容错方法及系统。

背景技术

随着移动互联网技术的快速发展、4G网络的全面普及和5G网络的快速部署,诞生出了众多新兴产业,其中最火热的当属直播、监控等流媒体产业。视频直播的流程大体可以分成采集、处理、编码封装、推流到服务器、服务器流分发和播放器流播放6个步骤。

采集是整个视频推流过程中的第一个环节,它从系统的采集设备中获取原始视频数据,将其输出到下一个环节。视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全不同的输入源和数据格式。

音频的采集过程主要通过设备将环境中的模拟信号采集成PCM编码的原始数据,然后编码压缩成MP3等格式的数据分发出去。AudioRecord是Android系统提供的用于实现录音功能的API。在Android系统中,多个进程不能同时调用AudioRecord,否则会返回错误。

图像的采集过程主要由摄像头等设备拍摄成YUV编码的原始数据,然后经过编码压缩成H.264等格式的数据分发出去。

推流是直播过程中相当重要的一步,推送协议主要有三种:RTMP,RTSP和HLS。RTMP是目前主流的流媒体传输协议,广泛用于直播领域,市面上绝大多数的直播产品都采用了这个协议。

在Android设备上进行RTMP音视频推流时,若录制端关闭音频,在播放端多数RTMP播放器会出现画面卡死,播放失败等情况。这是由于RTMP协议内部使用时间戳来进行音视频同步。同时推送音视频数据流时,时间戳会同步到音频的时间戳,当推流过程中停止推送音频时,时间戳的处理就会出错,播放器无法解析视频帧数据,导致画面会出现卡死、播放失败等情况。当需要暂停音频或者释放掉AudioRecord资源以供其他进程使用时,就不得不先停止推流,再单独推送视频数据。重启推流的过程需要一定的时间,因此连续的数据流就会出现中断,导致视频画面出现停顿或黑屏的情况,致使录制端用户体验不佳。更进一步来说,对于实时性要求较高的应用场景,这种策略会导致部分数据的丢失,可能会带来令人难以接受的损失。目前还没有一种能够在不停止视频推流的情况下启停音频的解决方案,该问题亟待解决。

发明内容

本发明旨在实现一种基于Android平台的能够在RTMP音视频推流过程中启停音频的容错方法及系统,能够解决RTMP音视频推流过程中录制端启停音频会造成播放画面卡死、播放失败的问题,扩展了流媒体技术的应用场景,提升了录制端用户体验。

为实现上述目的,本发明采用以下技术方案:

一种Android平台下RTMP音视频推流中启停音频容错方法,包括以下步骤:

Android设备在进行RTMP音视频流的录制编码时,设置一个私有的静态成员变量和一个公开的成员方法,该成员变量用于指示音频推送状态,该成员方法用于切换音频推送状态;

当在音频推送过程中暂停音频时,调用该成员方法,读取该成员变量并将该成员变量更改为暂停状态,停止音频的采集和编码,释放AudioStudio资源,推送预先准备好的静默音频帧,无缝衔接音频流进行推送;

当重新推送音频时,调用该成员方法,读取该成员变量并将该成员变量更改为推送状态,停止推送静默音频帧,重新启动AudioStduio构造函数和编码器,采集声音数据,并编码合成为音频流进行推送。

进一步地,通过将RTMP音视频流抽象成AudioStream类,在AudioStream类中设置所述成员变量和所述成员方法。

进一步地,在重新启动AudioStduio构造函数时重新配置参数,进行初始化。

进一步地,推送静默音频帧与推送音频流是在两个不同的线程中进行。

进一步地,静默音频帧采用AAC帧格式,该AAC采用ADTS的音频文件格式。

进一步地,静默音频帧的制作方法为:创建一个帧长度的字节数组,先写入ADTS头文件,剩余部分保持为空,再将数组写出到.aac后缀的文件中,组装成AAC音频文件即为静默音频帧文件。

进一步地,静默音频帧文件保存在Android工程的资源文件夹下。

本发明还提出一种Android平台下RTMP音视频推流中启停音频容错系统,包括存储器和处理器,在该存储器上存储有计算机程序,该处理器执行该程序时实现上述方法的步骤。

本发明还提出一种计算机可读存储介质,存储有计算机程序,该程序被处理器执行时实现上述方法的步骤。

本发明公开的方法通过在录制时设置一个私有的静态成员变量和一个公开的成员方法,在推送时针对暂停音频的情况,通过静态成员变量指示和更改状态,通过成员方法调用预先录制的静默音频帧来无缝衔接音频流进行推送,克服了RTMP音视频推流过程中录制端启停音频会造成播放画面卡死、播放失败的问题。

附图说明

图1是Android系统下音视频流推流过程图。

图2是暂停音频填充静默音频示意图。

图3是AAC的ADTS的一般格式示意图。

具体实施方式

为了进一步说明实施案例,本发明提供附图进行配合说明。这些附图为本发明展示内容的一部分,可配合说明书的相关描述对运行原理进行解释。配合这些内容,领域内的相关技术人员可以了解本发明的具体实施部署方式以及其优点。

对于Android系统下一个RTMP音视频或纯音频流,音频数据的推流过程如图1所示,说明如下:

1.配置参数,初始化AudioRecord构造函数;

2.初始化并启动编码器;

3.开始采集声音数据;

4.不断地读取采集到的声音数据,放进编码器的输入缓存中进行编码;

5.不断地从编码器输出缓存中取出编码后的数据,合成音频,添加ADTS头后推送出去;

6.停止采集,释放AudioRecord资源,停止编码。

在上述流程的基础上,对于推送RTMP音视频流,将音频流抽象为AudioStream类,在类中设置一个私有的静态成员变量,用于指示音频推送状态;再添加一个公开的成员方法,用于切换音频流推送状态(类、成员变量、成员方法等是Java语言的专业术语)。当录制端用户点击屏幕中的暂停/开启音频按钮时,会触发该成员方法,该成员方法的逻辑如下:

当录制端用户点击屏幕中的暂停音频按钮时,执行如下步骤:

1.读取成员变量的值,若成员变量显示当前音频正在推送中,则将成员变量更改为暂停状态;

2.停止采集,释放AudioRecord资源,停止编码。

3.读取本地的静默音频帧;

4.不停推送静默音频帧。

当录制端用户点击屏幕中的开启音频按钮时,执行如下步骤:

1.读取成员变量的值,若成员变量显示当前音频推送已暂停,将成员变量更改为推送状态;

2.停止推送静默音频帧;

3.配置参数,初始化AudioRecord构造函数;

4.初始化并启动编码器;

5.开始采集声音数据;

6.不断地读取采集到的声音数据,放进编码器的输入缓存中进行编码;

7.不断地从编码器输出缓存中取出编码后的数据,合成音频,添加ADTS头后推送出去;

推送静默音频功能与推送录音音频功能在两个不同的线程中实现,因此切换两种不同音频源的过程极为迅速,不会对视频推送造成影响。此外,静默音频帧填补了音频数据的缺失,如图2所示,播放器可以正确处理时间戳,视频的画面不会出现卡死、崩溃等情况。

静默音频采用AAC(高级音频编码)帧格式,AAC的音频文件格式使用ADTS,如图3所示,其中空白矩形表示一帧前后的数据。ADTS的解码可以在这个流中任何位置开始,即ADTS可以在任意帧解码,它每一帧都有头信息。使用ADTS音频文件格式,保证了可以在插入静默音频帧后还能够正常解码。

静默音频帧的制作方法为:创建一个帧长度的字节数组,先写入ADTS头文件,剩余部分保持为空,最后将数组写出到.aac后缀的文件中,这样组装出来的AAC音频文件就是静默音频文件。将该文件保存到Android工程的资源文件夹下,以供后续使用。

以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,本发明的保护范围以权利要求所述为准。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有