Android10以上系统Audio音频遇到播放无声时的分析方法

本文主要是介绍Android10以上系统Audio音频遇到播放无声时的分析方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

​商务合作

2023年招聘

2023年逆向分析资料汇总

推荐阅读

Android Audio音频系统

Android Audio音频系统之深入浅出

Android Framework/驱动/内核中高级工程师

​Android10以上系统Audio音频遇到播放视频无声时的分析方法

干货|Android APP应用工程师转Framework工程师(仅此一篇够了)

http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/
http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/
http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/
http://aospxref.com/android-13.0.0_r3/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/

一、Android Audio Play Out Channel

扬声器、耳机、听筒,通过这两个来设置,不过有的好像不支持的

/frameworks/base/media/java/android/media/AudioManager.javaaudiomanager.setmode(AudioManager.MODE_IN_COMMUNICATION)audiomanager.setSpeakerhponeOn(boolean value)

Android AudioTrack音频播放分析  

音频资源在播放时,会经常出现冲突的情况,如在进行音乐播放时有电话呼入、有新消息的提示音需要播放等,此类的并发处理就需要有一个统一的处理策略。

在Android系统开发中,通过为不同的场景配置不同的播放接口,在底层执行统一的并发策略,使得开发者可以将精力更集中在应用本身。  

AudioTrack、MediaPlayer、SoundPool、Ringtone、JetPlayer等都是Android音频处理中常用接口

针对AudioTrack接口进行详细说明  

(1).AudioTrack、AudioTrack用于管理单个的音频资源。在构造AudioTrack实例时,会涉及到流类型、采样率、通道配置、音频格式、缓冲大小、播放模式等因素。

(2).AudioTrack支持STREAM_VOICE_CALL、STREAM_SYSTEM、STREAM_RING、STREAM_MUSIC和STREAM_ALARM等流类型。  

(3).AudioTrack支持44100Hz、22050Hz、11025Hz等采样率。

(4).AudioTrack支持单声道(CHANNEL_OUT_MONO)、

立体声(CHANNEL_OUT_STEREO)等两种通道。

(5).AudioTrack支持ENCODING_PCM_16BIT、ENCODING_PCM_8BIT等两种编码格式。

(6).AudioTrack支持两种播放模式

静态模式(static mode)

流模式(Streaming mode)

其中静态模式由于没有从Java层向原生层传递数据造成的延迟,时延很小,当然受限于音频缓冲的大小,通常在游戏场景中用于播放时长很短的音频资源。

当音频流较大不足以在音频缓冲中一次写入时,可采用流模式。  

AudioTrack的播放状态包括

PLAYSTATE_STOPPED

PLAYSTATE_PAUSED

PLAYSTATE_PLAYING等

AudioTrack实例的状态包括

STATE_INITIALIZED

STATE_NO_STATIC_DATA

STATE_UNINITIALIZED等

向音频缓冲中添加数据的方法为write()

在设置音频缓冲时,其大小与采样率、通道和音频格式有关,其计算公式为:

缓冲大小 = 最小帧数 × (通道==CHANNEL_OUT_STEREO?2:1) × (音频格式== PCM16?2:1)

而最小帧数则受制于采样率和音频设备的延迟等因素

另外,在Android2.3中,还引入了会话的概念,便于对单曲的音效进行处理。相应的方法包括:

attachAuxEffect()

getAudioSessionId()

setAuxEffectSendLevel()等

通过AudioTrack.OnPlaybackPositionUpdateListener监听器可以监听播放进度

当在听歌的时候,突然来了一条短信,如果不加处理,短信的声音很可能被音乐的声音湮没,就会察觉不到。

获取和释放audio focus的过程

(1).申请audio focus

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 

(2).处理focus change事件

class MyService extends Service implements AudioManager.OnAudioFocusChangeListener {
// ....
public void onAudioFocusChange(int focusChange) {
// Do something based on focus change...}
}

申请audio focus和处理focus change一定是互相配合实现的

android听筒播放音乐

AudioManager.setMode(AudioManager.MODE_IN_CALL) //设定为通话中即可添加权限android.permission.MODIFY_AUDIO_SETTINGS播放完毕后需要AudioManager.setMode(AudioManager.MODE_NORMAL);

不然其他软件播放都听筒发声,实际操作中,仅仅上述代码并不能是实现需求

Android 5.0.1audiomanager.setMode(AudioManager.MODE_IN_CALL); //不能生效,即便添加该行仍然从扬声器播出

应用场景

Audio输出通道有很多,Speaker、headset、bluetooth A2DP等

Android中的Audio播放(控制Audio输出通道切换)

通话或播放音乐等使用Audio输出过程中,可能发生Audio输出通道的切换

例如:

插入有线耳机播放音乐时,声音是从耳机发出的;而此时拔出耳机,Audio输出通道会发生切换。如果音乐播放器不做处理,Audio输出是被切换到扬声器的,声音直接从Speaker发出。

Android中可以通过android.media.AudioManager查询当前Audio输出的情况,并且在Audio输出发生变化时,捕获并处理这种变化。

(1).Audio输出状态查询与控制

android.media.AudioManager提供的下列方法可以用来查询当前Audio输出的状态

isBluetoothA2dpOn() //检查A2DPAudio是否通过蓝牙耳机

isSpeakerphoneOn() //检查扬声器是否打开

isWiredHeadsetOn() //检查线控耳机是否连着,注意这个方法只是用来判断耳机是否是插入状态,并不能用它的结果来判定当前的Audio是通过耳机输出的,这还依赖于其他条件。

另外还有一些设置这些Audio输出的setXYZ()方法,这些方法在一般使用Audio输出的应用程序不要直接调用,他们由系统来管理,实现Audio输出通道的自动切换。除非,界面提供给用户切换的菜单或按钮,而用户选择了却换

例如:

要直接选择扬声器发声,可直接调用setSpeakerphoneOn()

(2).Audio输出通道切换的事件的捕获与处理

因为耳机插拔、蓝牙耳机的断开,Audio输出通路会自动切换。此时正在播放Audio的程序要获得通知,知道这一事件的发生。

Android中是通过广播ACTION_AUDIO_BECOMING_NOISY这个Intent通知的。

处理广播的较好的方式,是动态注册/注销自己所关心的广播。

开始播放时注册广播的Receiver,停止播放时注销广播的Receiver。对Audio输出通道切换的处理是暂停当前的播放,不直接从新的通道里发出声来

private class NoisyAudioStreamReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
// Pause the playback}}
}
private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private void startPlayback() {registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);
}
private void stopPlayback() {unregisterReceiver(myNoisyAudioStreamReceiver);
}

(3).Audio输出通道切换的典型场景——用耳机听音乐时,拔出耳机

AudioNoisy Client注册了侦听广播

AudioManager.ACTION_AUDIO_BECOMING_NOISY

用耳机一直在听音乐

HeadsetObserver一直在监视耳机状态的变化。检测到耳机被拔出之后,发出广播AudioManager.ACTION_AUDIO_BECOMING_NOISY

frameworks/base/services/java/com/android/server/HeadsetObserver.java

AudioNoisy Client收到了广播,发送暂停命令给MediaPaybackService去暂停当前的播放

Managing Audio Playback

提供便捷的音频状态控制

可以构建响应物理音频按键,获取音频播放焦点,以及适时的响应由于系统或其他应用引起的音频焦点变化

三个AudioCommandThread线程分别是ApmTone、ApmAudio、ApmOutput

ApmTone用于播放tone音

ApmAudio用于执行audio命令

ApmOutput用于执行输出命令

在AudioPolicyManager创建过程中会通过加载audio_policy.conf配置文件来加载音频设备,Android为每种音频接口定义了对应的硬件抽象层。硬件抽象层代码

hardware/libhardware/modules/audioexternal/bluetooth/bluedroid/audio_a2dp_hw/audio.a2dp.default.sohardware/libhardware/modules/audio/audio.primary.default.sohardware/libhardware/modules/usbaudio/audio.usb.default.so

原文链接:https://www.shuzhiduo.com/A/1O5EDokGJ7/https://blog.csdn.net/thl789/article/details/7423523https://www.shuzhiduo.com/A/Gkz1Lj3GdR/

二、Android上播放视频时没有声音的问题

(1).如果在android上播放视频时遇到没有声音的问题,要么是android手机上有问题,要么就是视频本身有问题。无论那种情况,都有相对应的解决方案。

(2).在Android Audio相关开发过程中,可能会遇到播放ringtone时无声,但播放Music可以听到声音,关于无声问题的分析。

三、Android设备上播放有声视频的技巧

(1).始终保持扬声器清洁

(2).未经验证的应用程序不应安装在设备上

(3).手机的音频端口。这是因为一旦拔出耳机,某些设备就会卡在耳机模式

(4).还应检查听筒

四、Android Audio遇到播放无声时的分析思路

(1).在音量控制面板中确认该音频流对应的Volume_index大小是否等于0

(2).若Volume_index != 0时,看user space的logcat与kernel log中有无明显的Audio Fail项,比如设备是否选择正确以及对应的路径是否有配通

(3).在hardware层,在audio_hw.cpp文件中的out_write函数中添加log,判断是否有数据写入(QCOM MSM8939)

/hardware/libhardware/modules/audio_remote_submix/audio_hw.cpp
785  static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
786                           size_t bytes)

(4).通过dumpsys media.audio_policy命令来查看对应音频流是否被mute住,若被mute,需要分析AudioPolicyManager.cpp文件

/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp

(5).看当前音源档本身的音量是否为0

其中1与5之间的区别在于:

在播放某音源档时,在AudioTrack::set()函数里,先将音源数据的左右声道的Volume设置为1.0,即为最大声。而通过音量按键或则在VolumePanel中调节音量则是在最大音量基础上做衰减操作

/frameworks/av/media/libaudioclient/AudioTrack.cpp326  status_t AudioTrack::set(327          audio_stream_type_t streamType,328          uint32_t sampleRate,329          audio_format_t format,330          audio_channel_mask_t channelMask,331          size_t frameCount,332          audio_output_flags_t flags,333          callback_t cbf,334          void* user,335          int32_t notificationFrames,336          const sp<IMemory>& sharedBuffer,337          bool threadCanCallJava,338          audio_session_t sessionId,339          transfer_type transferType,340          const audio_offload_info_t *offloadInfo,341          uid_t uid,342          pid_t pid,343          const audio_attributes_t* pAttributes,344          bool doNotReconnect,345          float maxRequiredSpeed,346          audio_port_handle_t selectedDeviceId)

/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
mVolumeControlStream 
VolumePanel
/frameworks/base/media/java/android/media/AudioManager.java
VolumePanel

(6).在Android开发中可以通过AudioManager来判断是否有声音在播放

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
/frameworks/base/media/java/android/media/AudioManager.java
2046      public boolean isMusicActive() {
2047          return AudioSystem.isStreamActive(STREAM_MUSIC, 0);
2048      }

(7).Android中的Audio播放(分析控制Audio输出通道切换设置)

检查Android Audio音频setMode()的默认设置AudioManager.setMode(AudioManager.MODE_NORMAL);

Android各版本系统源码在线阅读地址

http://aospxref.com/http://androidxref.comhttps://aosp.opersys.comhttps://wiki.lineageos.org/devices/https://wiki.pixelexperience.org/devices/

这篇关于Android10以上系统Audio音频遇到播放无声时的分析方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399172

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识