一种面向第三方音频播放器的数据截取方法
【技术领域】
[0001]本发明涉及数字音频处理技术领域,尤其涉及一种面向第三方音频播放器的数据截取方法。
【背景技术】
[0002]在未来泛在通信环境下,协同思想已成为网络融合的主流。通过终端之间的智能协作,实现1+1>2的效果,为用户提供各类新型智慧服务,从而极大地提升用户的业务体验。在音频播放场景中,已有相关通过多个终端协同播放同一首音乐的多个声道实现立体声效果的应用程序,但此类应用只能通过特定软件才能实现协同播放的效果,无法做到对任意第三方音频播放软件透明,从而影响用户的实际体验。为了达到对第三方音频播放器透明的效果,需要应用程序能够实时截取任意第三方音频播放器播放的音频数据。
[0003]由于Android系统上层应用在封闭环境中运行,无法直接在应用层截取第三方音频播放器正在播放的音频数据。而根据Android系统的音频架构,所有上层音乐播放软件都要建立一个在Native层的Aud1Track对象,且播放的音频数据都要通过该Aud1Track对象传递至Andro id系统Native层的音频核心Aud1Flinger进行混音,并写入到硬件抽象层(Hardware Abstract1n Layer,HAL),进而通过驱动程序驱动硬件进行播放。
【发明内容】
[0004]为了克服现有技术的不足,本发明提出了一种面向第三方音频播放器的数据截取方法O该方法基于Andro id系统,在Andro id音频系统框架下通过对标准Andro i d音频系统的底层修改和Native动态链接库开发,实现对任意第三方音频播放器音频数据的实时截取。一方面,该方案能够截取任意第三方音频播放器的音频数据,即对第三方音频播放器透明;另一方面,该方案采用软件方法,简单而易于实现,且具有很好的可移植性和向后兼容性。
[0005 ]为了解决上述技术问题,本发明采用的技术方案是:
[0006]本发明提出的一种面向第三方音频播放器的数据截取方法,所述方法基于Android音频系统,面向第三方音频播放器,进行数据截取,具体过程如下:
[0007]步骤I,创建用于集中控制数据截取过程的主控类对象ProcessMaster;
[0008]步骤2,通过所述主控类对象ProcessMaster,执行Native层的数据截取初始化,具体包括如下步骤:
[0009]步骤2-1,通过所述主控类ProcessMaster对象,在Native层开辟两块跨进程共享内存,分别为共享内存SharedBuff erl和共享内存SharedBuf fer2,其中SharedBuff erl为环形共享内存,SharedBuf fer2为普通共享内存;
[0010]步骤2-2,在所述主控类对象ProcessMaster中开辟一块环形内存MasterBuffer;[0011 ] 步骤2-3,通过所述主控类对象ProcessMas ter创建一对协同工作子线程,分别为子线程ProcessThread I和子线程ProcessThread2,并启动子线程ProcessThread I和子线程ProcessThread2;
[0012]步骤3,在所述Android音频系统中添加音频截取标志位startflag,根据所述标志位startflag的值控制音频数据的流向,具体描述如下:
[0013]当所述标志位startflag的值为true时,将音频数据写入所述共享内存SharedBufferl,进行音频数据截取,并执行步骤4;
[0014]步骤4,所述子线程ProcessThreadl从所述共享内存SharedBuf f erl中读取音频数据,将读取的音频数据写入所述环形内SMasterBuffer ;所述子线程ProcessThread2从所述环形内存Mas terBuf f er中读取音频数据,将所述音频数据写入所述共享内存SharedBuf f er2,并将所述共享内存SharedBuf f er2中的音频数据写回到所述Andro i d音频系统。
[0015]所述一种面向第三方音频播放器的数据截取方法,还包括对第三方音频播放器暂停或停止播放、音频播放进入数据不继、Android音频系统播放线程意外退出以及自身软件退出的处理方法,具体为:
[0016]所述对第三方音频播放器暂停或停止播放以及对音频播放进入数据不继的处理方法,具体过程为:
[0017]步骤al,在所述Android音频系统中添加播放暂停标志位standbyf lag;
[0018]步骤a2,当所述Android音频系统处理第三方音频播放器暂停或停止播放以及数据不继,调用standby函数时,若所述标志位startflag的值为true,则将该所述标志位standbyf lag 的值设置为 true ;
[0019]步骤a3,在所述子线程ProcessThreadl和子线程ProcessThread2的线程循环中查询所述标志位standbyf lag的值,若所述标志位standbyf lag的值为true,贝Ij立即停止数据截取过程并清空所述共享内存SharedBuffer 1、共享内存SharedBuf f er2和环形内存MasterBuff er中的数据,等待下次播放或数据恢复正常;
[0020]所述对Android音频系统播放线程意外退出的处理方法,具体过程为:
[0021 ] 步骤bl,在所述Android音频系统中添加退出标志位exitf lag;
[0022]步骤b2,当Android音频系统处理底层播放线程意外退出,调用set_parameters函数时,检测出现意外退出时的参量,若检测到参量为exiting= I,则将所述标志位exitf lag的值设置为true;
[0023]步骤b3,在所述子线程ProcessThreadl和子线程ProcessThread2的线程循环中查询所述标志位exitf lag的值,若所述标志位exitf lag的值为true,则立即停止数据截取过程,并清空所述共享内存SharedBufferl、共享内存SharedBuffer2和环形内存MasterBuf f er中的数据,并执行软件退出流程;
[0024]所述对自身软件退出的处理方法,具体过程为:
[0025]步骤Cl,当用户通过上层应用主动关闭数据截取功能时,由所述上层应用利用JNI,调用所述主控类对象ProcessMaster的退出接口 ;
[0026]步骤c2,通过所述主控类对象ProcessMaster的退出接口,关闭所述子线程ProcessThread I和子线程ProcessThread2,重置所述标志位startflag、标志位standbyflag和标志位exitflag的值,释放共享内存SharedBufferl、共享内存SharedBuffer2和环形内存MasterBuffer,此后,数据截取过程关闭。
[0027]有益效果:本发明提出的一种面向第三方音频播放器的数据截取方法,从Android系统Native层的音频核心Aud1Fl inger入手,通过新创建的协同工作子线程与标准Android音频系统线程交互合作形成完备的数据截取闭环,在准确截取任意第三方音频播放器音频数据的同时又能保持对第三方音频播放器透明。同时,本发明提出的一种面向第三方音频播放器的数据截取方法,通过软件方法加以实现,具有良好的可移植性与向后兼容性。
【附图说明】
[0028]图1为本发明实施例1提供的一种面向第三方音频播放器的数据截取方法流程图。
[0029]图2为本发明实施例2提供的一种面向第三方音频播放器的数据截取方法流程图。
[0030]图3为协同工作子线程与Android音频系统线程交互示意图。
[0031]图4为本发明提供的一种面向第三方音频播放器的数据截取方法线程交互流程图。
【具体实施方式】
[0032]为了更加详细的描述本发明提出的一种面向第三方音频播放器的数据截取方法,结合附图,举例说明如下:
[0033]图1显示了本发明实施例1提供的一种面向第三方音频播放器的数据截取方法,该方法基于Android音频系统,面向第三方音频播放器,采用从HAL层进行数据截取,主要包括以下步骤:
[0034]步骤SlOl,创建主控类对象ProcessMaster;
[0035]步骤S102,音频数据截取初始化:主控类对象ProcessMaster根据音频播放配置参数获得第三方音频播放器在Native层的播放线程;开辟Native层的共享内存SharedBufferl、共享内存SharedBuf f er 2和主控类对象ProcessMas ter的环形内存MasterBuffer,并将所述共享内存SharedBuff erl、共享内存SharedBuffer 2的控制结构赋值给HAL层添加的变量,用于再次访问;创建并运行子线程ProcessThreadl和子线程ProcessThread2;
[0036]步骤SI 03,音频数据截取:在所述4]1(!!'0丨(1音频系统]^1^层311(1;[0_1^.h的stream_out结构体添加标志位startf lag;当所述Android音频系统播放线程调用write函数向HAL层写入音频数据时,若所述标志位startf lag的值为true,则将音频数据写入所述共享内存SharedBufferl,并执行步骤S104和步骤S105;
[0037]步骤S104,音频数据接收:所述子线程ProcessThreadl从共享内存SharedBuff erl中读取音频数据,并将读取的音频数据写入环形内存Mas terBuf f er ;
[0038]步骤S105,音频数据重放:所述子线程ProcessThread2从环形内存MasterBuffer中读取音频数据,并将读取的音频数据写入共享内存SharedBuf fer2;同时子线程ProcessThread2从共享内存SharedBuf fer2读取音频数据,并将读取的音频数据写回所述Andro id音频系统。
[0039]图2显示了本发明实施例2提供的一种面向第三方音频播放器的数据截取方法,该方法基于Android音频系统,面向第三方音频播放器,采用从Native层进行数据截取,主要包括以下步骤:
[0040] 步骤S201,创建主控类对象ProcessMaster;
[0041 ]步骤S202,音频数据截取初始化:主控类对象ProcessMaster根据音频播放配置参数获得第三方音频播放器在Native层的播放线程,进一步根据参数找到第三方音频播放器对应的Track对象;开辟Native层的共享内存SharedBuff erl、共享内存SharedBuf fer2和主控类对象ProcessMas ter的环形内存Mas terBuf fer,并将所述共享内存SharedBuff erl、共享内存SharedBuffer2的控制结构赋值给Track对象中添加的变量,用于再次访问;创建并运行子线程 ProcessThreadl 和子线程 ProcessThread2 ;
[0042]步骤S203,音频数据获取:在所述Android音频系统的Track类中添加标志位startf lag,若标志位startf lag的值为true则屏蔽所述Android音频系统对该Track对象的混音处理及播放,并通过调用getnextbuffer()/releasebuffe