最近发现公司自研的智能车载设备上存在一个问题:手机通过蓝牙连接车机,在手机上播放音乐车机上发声然后跟车机上的导航语音播报一起混音播出的时候会出现卡顿的现象;但是在车机上播放音乐和导航混音就正常。另外需要说明的是播放音乐使用的是Music流,导航使用的是Alarm流

通过 adb shell dumpsys media.audio_flinger 工具对比查看两种场景下实时的音频流信息(截取其中一个回放线程中的音频流信息如下):

Output thread 0xe6c833c0 type 0 (MIXER):Thread name: AudioOut_1DI/O handle: 29TID: 935Standby: yesSample rate: 48000 HzHAL frame count: 1920HAL format: 0x1 (pcm16)HAL buffer size: 7680 bytesChannel count: 2Channel mask: 0x00000003 (front-left, front-right)Processing format: 0x1 (pcm16)Processing frame size: 4 bytesPending config events: noneOutput device: 0x20000 (LINE)Input device: 0 (NONE)Audio source: 0 (default)Normal frame count: 1920Last write occurred (msecs): 1087537Total writes: 4905Delayed writes: 0Blocked in write: noSuspend count: 0Sink buffer : 0xe73da000Mixer buffer: 0xe83d8000Effect buffer: 0xe73dc000Fast track availMask=0xfeStandby delay ns=3000000000AudioStreamOut: 0xe83c82a0 flags 0x8 (DEEP_BUFFER)Frames written: 9417600Suspended frames: 0Hal stream dump:Thread throttle time (msecs): 106AudioMixer tracks: 0x00000003Master mono: offFastMixer not initializedStream volumes in dB: 0:-11, 1:-10, 2:-10, 3:0, 4:-10, 5:-10, 6:0, 7:-10, 8:-10, 9:-96, 10:0, 11:0, 12:0Normal mixer raw underrun counters: partial=0 empty=02 Tracks of which 0 are activeName Active Client Type      Fmt Chn mask Session fCount S F SRate  L dB  R dB    Server Main buf  Aux Buf Flags UndFrmCnt1     no   3190    3 00000001 00000003      97   7088 I 0 22050     0     0  00000000 0xe73da000 0x0 0x000         0 0     no   3190    3 00000001 00000003      89   7072 P 3 44100     0     0  004FF80C 0xe73da000 0x0 0x600      1768 0 Effect Chains

进一步简化对比可以看到:

车机上播音乐和导航    不卡顿    
    导航语音是     AudioStreamOut: 0xea0c8150 flags 0x6 (PRIMARY|FAST)
    后台音乐是     AudioStreamOut: 0xea0c82a0 flags 0x8 (DEEP_BUFFER)
手机上播音乐和车机上播导航     卡顿
    导航语音和后台音乐都是   AudioStreamOut: 0xea0c8150 flags 0x6 (PRIMARY|FAST)

蓝牙连接上手机后Music流走的输出流通道和导航的Alarm流走的输出流通道是同一个;车机上的Music流和导航的Alarm流走的是不同的输出流通道,也即是虽然两种场景下音乐的流都是Music流但是属性是不一样的,导致了最终系统选择的输出流通道不一致。

分析蓝牙底层的服务,看看蓝牙播放音乐时构建的AudioTrack对象跟平时播放音乐的有什么不同之处

void *BtifAvrcpAudioTrackCreate(int trackFreq, int channelType)
{LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btCreateTrack freq %d  channel %d ",__func__, trackFreq, channelType);sp<android::AudioTrack> track =new android::AudioTrack(AUDIO_STREAM_MUSIC, trackFreq, AUDIO_FORMAT_PCM_16_BIT,channelType, (size_t) 0 /*frameCount*/,(audio_output_flags_t)AUDIO_OUTPUT_FLAG_FAST,NULL /*callback_t*/, NULL /*void* user*/, 0 /*notificationFrames*/,AUDIO_SESSION_ALLOCATE, android::AudioTrack::TRANSFER_SYNC);//!!!注意AUDIO_OUTPUT_FLAG_FAST属性assert(track != NULL);BtifAvrcpAudioTrack *trackHolder = new BtifAvrcpAudioTrack;assert(trackHolder != NULL);trackHolder->track = track;if (trackHolder->track->initCheck() != 0){return nullptr;}#if (defined(DUMP_PCM_DATA) && (DUMP_PCM_DATA == TRUE))outputPcmSampleFile = fopen(outputFilename, "ab");
#endiftrackHolder->track->setVolume(1, 1);return (void *)trackHolder;
}

调试的经验表明车机端音乐类应用在底层给出的属性一般是 AUDIO_OUTPUT_FLAG_DEEP_BUFFER ,这里给定的是 AUDIO_OUTPUT_FLAG_FAST,所以导致了这里的Music流走了跟Alarm流同一个输出流通道,当导航的Alarm音频流过来以后,音频路由发生了改变,先关闭了当前的输出流通道然后再开启才导致的卡顿问题,最后解决方案也很简单,将蓝牙这里的AUDIO_OUTPUT_FLAG_FAST属性修改为AUDIO_OUTPUT_FLAG_DEEP_BUFFER 属性即可,卡顿现象也随即消失。

蓝牙音乐和导航语音播放混音卡顿问题相关推荐

  1. Android 7.1 高德导航和蓝牙音乐卡顿问题 蓝牙电话和高德语音播报混音问题

    此文章主要解决三个问题 1.高德导航的时候打电话会出现混音问题. 2.蓝牙音乐在播放的时候导航界面语音播报蓝牙音乐会暂停,播报结束会恢复播放不能同时输出问题. 3.蓝牙音乐在播放的时候和导航界面的语音 ...

  2. android 播放音乐卡顿,Android MediaPlayer+SeekBar播放音频出现卡顿边长可能问题

    开发过程中总是会碰到一些"什么鬼,原来这么简单"等等的问题,比如今天碰到 Android MediaPlayer+SeekBar播放音频出现卡顿可能问题? 代码段一: seekBa ...

  3. kodi android 卡顿,给Kodi设置缓存来解决播放大文件卡顿

    给Kodi设置缓存来解决播放大文件卡顿 2021-03-02 16:21:20 28点赞 355收藏 31评论 Kodi可以算是电视盒子上最棒的播放器了,它具有强大的功能,优美的界面,相信很多人也都是 ...

  4. 地图导航开启蓝牙后无导航语音

    手机锁屏gps不工作.打开蓝牙后,开车时有电话打进来,可以通过车载接听,但是开启手机导航无导航语音.关闭蓝牙后,开车时只能用手机免提接电话,手机导航有语音. 使用上很不方便,所以今天研究了一下,发现原 ...

  5. 混音服务器系统盘,混录天王怎么合成音乐 简单几步轻松混音

    平时我们会遇到这样的情况,安装在E盘的软件无法正常使用(或移动硬盘H显示目录或文件损坏,无法打开访问),有时一旦访问该分区系统就提示需要格式化. 混录天王是一款多功效的录音,混音软件,它也是大部分用户 ...

  6. android vlc rtsp卡顿,VLC播放器 RTSP 卡顿解决

    之前写过一篇关于在Linux平台上编译android平台上VLC播放器源代码的文章,vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg.而且这款播放器还支持RTSP协议,这个 ...

  7. 索尼推出全能音乐AI工具:作曲混音编曲都OK!留给人类发挥的空间不多了

    博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在AI们还在某个特定领域学画画.学写歌的时候,索尼已经喊了一群AI来给音乐人做全能助手了! 包含从鼓点.贝斯.钢琴伴奏的生成,到多音轨的混合 ...

  8. 导航软件后台播放语音有杂音,卡顿

    由于activity一到后台就会把进程优先级调低到Background process,导致语音播报卡顿. 目前的解决方法好像只有把我们的initnavi,startnavi这2个接口放到一个serv ...

  9. 72轨 | 国产外星电子核最全分轨混音教程:呼叫克苏鲁 新单曲 - MZD Studios

    大家好,我是Jerome.欢迎再次回来MZD Studios 混音之道. 其实没什么事我也不冒泡,不过这次是因为制作了呼叫克苏鲁乐队 新单曲(外星夜店羊肉串) 想顺便给大家讲讲混音制作的分析. 错了. ...

最新文章

  1. inventor应用程序错误---解决方法
  2. “有一个产品经理的女朋友是什么体验?”
  3. 【开源】高颜值 功能强大的开源Markdown编辑器
  4. VC Ws2_32.lib
  5. Fact Table and Dimension Table In My Opinion
  6. 利用RecyclerView实现无限轮播广告条
  7. NET框架下使用双缓冲技术绘图
  8. 【数据结构笔记06】队列及其顺序存储、链式存储
  9. 使用后缀自动机求后缀数组
  10. Java从入门到精通 第10章 方法
  11. 什么是大数据挖掘技术
  12. 设置华为路由器的端口映射
  13. Python计算等额本息贷款和等额本金贷款
  14. K8SPod详解之pod配置
  15. jmeter监听器---聚合数据样本展示
  16. 海伦公式的计算机表达,海伦公式之算法与程序框图
  17. 【java8 stream操作List集合】
  18. APP安全环节缺失,手游运营商如何应对APP破解困境
  19. 第一次建站——保姆篇
  20. 漫画 | 程序员,你得一条道走到黑!

热门文章

  1. C/C++每日一问--判断素数
  2. 天才黑客 Flanker 疑因拒绝做黑客攻击业务,被拼多多强行辞退,错失上亿股票...
  3. 苹果官方mfi认证名单_【大型推销配件现场】苹果回应iPhone12消磁,这波操作太6了 - 社会...
  4. 网络原理——基础知识
  5. 构建初级前端页面重构开发环境
  6. 办理icp许可证对经营范围还有要求吗
  7. 【蓝桥杯备赛笔记 02】费解的开关
  8. 95 费解的开关(递推)
  9. Hive的学习心得-个人理解什么是hive
  10. a4纸尺寸是多少厘米 a4纸是多少k2022