A2DP音频流在Android系统中的实现
通过前文《蓝牙音乐之A2DP音频流》的共享,明确了A2DP音频流的打开、暂停、数据传输等一系列协议规定。 今天我们来介绍安卓系统的这一部分是如何实现的。
本文主要共享了A2DP协议中SNK端音频流的功能。 那离不开音频跟踪。 音频跟踪的工作原理不在此赘述。 相信对安卓系统音频感兴趣的合作伙伴一定能找到学习途径。 SNK端的音频轨迹是如何创建的,如《A2DP连接在安卓系统中的实现》中所述,A2DP音频流的传输主要通过音频轨迹从蓝牙系统传输到安卓音频系统
AVDTP协议规定,可以在A2DP连接的两端启动音频流AVDTP_START,但在Android系统中,SRC一般作为INT角色启动该过程,SNK方面则是蓝牙SNK首先通过AVRCP协议通知SRC音乐的播放(控制协议AVRCP等稍后共享),然后SRC启动该过程。
A2DP音频流的传输主要有两个步骤。
SRC侧开启音频流SRC并发送音频数据
SRC通过AVDTP的信令信道开启音频流的目的在于,连接双方将各自的AVDTP状态从OPEN切换为STREAMING,并为SRC通过AVDTP数据信道传输音频数据做准备整个A2DP音频流的简单时序图如下所示。
开启A2DP音频流后,SRC端每20ms向SNK发送一个音频数据分组,但SNK端不会在接收到音频分组后立即对数据进行解码,而是将其暂时存储在音频数据接收队列中并排队
/* In case of A2DP Sink,wewilldelaystartby5avdtppackets */# definemax _ a2dp _ delayed _ start _ frame _ count 5
将最终解码的数据写入AudioTrack进行播放。 SRC端继续发送音频数据,同时SNK也对数据进行解码并写入AudioTrack,蓝牙音乐从SNK端的音频系统陆续播放。
由于蓝牙音乐也是使用AudioTrack播放的,开发音乐跟随氛围灯的同学也可以在蓝牙音乐播放过程中,氛围灯配合蓝牙音乐的节奏工作。 该功能主要是获取音频跟踪会话ID,即音频跟踪会话ID,感兴趣的学生可以参考我的另一篇文章《蓝牙音乐AudioTrack Session ID的获取》来实现该功能。
由于蓝牙音乐的数据分析、解码处理全部通过蓝牙协议栈进行,因此可以将解码后的音频流的数据以文件形式保存,有助于以后确定蓝牙音乐的纸箱等音频问题另外,蓝牙的HCI中也保存着音乐数据,可以用相关软件( Ellisys推荐)打开,直观方便。
本篇的共享到此结束。 感兴趣的同学欢迎私信一起讨论哦。 一起学习,一起进步。