多媒体音频焦点浅析

这篇具有很好参考价值的文章主要介绍了多媒体音频焦点浅析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多媒体音频焦点

意义

多个音源可以同时向同一个输出流进行播放音频,如果没有音频焦点管控,就会出现多个音源同时播放的现象,给用户带来不便;而Android为了避免多个音源同时播放,就引入了音频焦点的概念,所有音频应用都统一按照音频焦点的规定执行,就可以避免该现象发生。

当应用需要播放音频时,需要主动申请音频焦点,获取音频焦点后,再进行播放操作;同时在播放过程中,也可能存在其他音源请求焦点,此时当前应用就会收到音频焦点的丢失,当前应用应暂停播放或者降低音量,方便用户听其他音源。

规范

准则

  • 在播放之前通过调用requestAudioFocus,确认返回的结果是否为AUDIOFOCUS_REQUEST_GRANTED
  • 在其他应用获取到焦点时,停止或暂停播放,或降低音量
  • 播放停止后,主动释放焦点

版本处理

  • Android 2.2开始,应用通过调用 requestAudioFocus()abandonAudioFocus() 来管理音频焦点。应用还必须为这两个调用注册 AudioManager.OnAudioFocusChangeListener,以便接收回调并管理自己的音量。
  • 对于以 Android 5.0及更高版本为目标平台的应用,音频应用应使用 AudioAttributes 来描述应用正在播放的音频类型。例如,播放语音的应用应指定 CONTENT_TYPE_SPEECH
  • 面向 Android 8.0或更高版本的应用应使用 requestAudioFocus() 方法,该方法会接受 AudioFocusRequest 参数。AudioFocusRequest 包含有关应用的音频上下文和功能的信息。系统使用这些信息来自动管理音频焦点的得到和失去。

使用

请求焦点

申请焦点时,需要明确焦点类型:

  1. AudioManager.AUDIOFOCUS_GAIN:表示应用程序需要长时间获得音频焦点,通常用于播放音乐或其他持续性的音频播放。应用程序在获得焦点后可以持续播放音频,直到明确放弃焦点或其他应用程序请求焦点。
  2. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:表示应用程序需要短暂地获得音频焦点,通常用于播放短暂的音效或提示音。应用程序在获得焦点后可以播放音频,但在完成后应立即释放焦点,以便其他应用程序可以继续使用焦点。
  3. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:表示应用程序需要短暂地获得音频焦点,并且希望其他应用程序不要同时播放音频。这种焦点类型用于应用程序需要短时间内独占音频焦点的情况,例如语音识别应用。
  4. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:表示应用程序需要短暂地获得音频焦点,但愿意降低音频的音量以便与其他应用程序共享焦点。通常用于类似通知声音或导航提示的情况

获取音频焦点结果,有以下类型:

  1. AudioManager.AUDIOFOCUS_REQUEST_GRANTED:表示应用程序成功获取了音频焦点。这意味着应用程序现在可以在其他应用程序不需要音频焦点时播放音频。
  2. AudioManager.AUDIOFOCUS_REQUEST_FAILED:表示应用程序请求音频焦点失败。这可能是因为其他应用程序已经拥有了音频焦点,或者系统无法满足应用程序的请求。
  3. AudioManager.AUDIOFOCUS_REQUEST_DELAYED:表示应用程序的音频焦点请求被暂时延迟。当其他应用程序释放音频焦点时,系统会尝试重新分配焦点给应用程序。

版本处理

Android8.0之前,需要通过AudioFocusRequest,以及实现AudioManager.OnAudioFocusChangeListener 接口进行监听音频焦点变化

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioManager.OnAudioFocusChangeListener onAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int state) {
                switchFocus(state);
            }
        };
int requestAudioFocusResult = audioManager.requestAudioFocus(onAudioFocusChangeListener,
            AudioManager.STREAM_MUSIC,
            AudioManager.AUDIOFOCUS_GAIN);
        if (requestAudioFocusResult == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
            //请求焦点失败
        } else if (requestAudioFocusResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            //请求焦点成功
        }
public void switchFocus(int focus) {
        switch (focus) {
            case AudioManager.AUDIOFOCUS_GAIN:
                break;
            case AudioManager.AUDIOFOCUS_LOSS:
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                break;
        }
}

Android8.0之后,需要通过AudioFocusRequestAudioAttributes,以及实现AudioManager.OnAudioFocusChangeListener 接口进行监听音频焦点变化

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioManager.OnAudioFocusChangeListener onAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int state) {
                switchFocus(state);
            }
        };
AudioAttributes attributes = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build();
AudioFocusRequest audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
            .setAudioAttributes(attributes)
            .setAcceptsDelayedFocusGain(true)
            .setOnAudioFocusChangeListener(onAudioFocusChangeListener)
            .setWillPauseWhenDucked(false)
            .build();
        int requestAudioFocusResult = audioManager.requestAudioFocus(audioFocusRequest);
        if (requestAudioFocusResult == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
            //请求焦点失败
        } else if (requestAudioFocusResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            //请求焦点成功
        } else if (requestAudioFocusResult == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
            //延时焦点
        }
延迟获取焦点

如上面所述,我们发现在Android 8.0之前,请求音频焦点的时候,只会返回两种结果,要么请求成功(AUDIOFOCUS_REQUEST_GRANTED),要么请求失败(AUDIOFOCUS_REQUEST_FAILED)。

而从Android 8.0开始,还有一种结果,延迟成功请求(AUDIOFOCUS_REQUEST_DELAYED),这个也是成功的请求,但是这个请求具有延迟性;

方法 setAcceptsDelayedFocusGain(true) 可让您的应用异步处理焦点请求。设置此标记后,在焦点锁定时发出的请求会返回 AUDIOFOCUS_REQUEST_DELAYED。当锁定音频焦点的情况不再存在时(例如当通话结束时),系统会批准待处理的焦点请求,通过注册AudioFocusChangeListener监听的 onAudioFocusChange() 来通知您的应用。

自动降低音量

在 Android 8.0(API 级别 26)中,当其他应用使用 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 请求焦点时,系统可以在不调用应用的 onAudioFocusChange() 回调的情况下降低和恢复音量。

在某些情境下,可能不需要降低音量而是直接暂停,这是可以通过setWillPauseWhenDucked(true)方法取消系统的默认行为,然后通过OnAudioFocusChangeListeneronAudioFocusChange回调中监听音频焦点变化

AudioAttributes

用来描述该应用使用情况,通过Builder模式进行构建

  • Usage(用途):(必须)用于描述音频的使用场景,持续时间,例如 AudioAttributes.USAGE_MEDIA 用于媒体播放,AudioAttributes.USAGE_VOICE_COMMUNICATION 用于语音通信等。
  • ContentType(内容类型):用于描述音频的内容类型,例如 AudioAttributes.CONTENT_TYPE_MUSIC 用于音乐,AudioAttributes.CONTENT_TYPE_SPEECH 用于语音等。
  • Flags(标志):用于指定一些特定的标志,例如 AudioAttributes.FLAG_AUDIBILITY_ENFORCED 表示强制性可听性,AudioAttributes.FLAG_HW_AV_SYNC 表示硬件音视频同步等。
  • Legacy Stream Type(传统流类型):用于与旧版 API 兼容,将 AudioAttributes 映射到旧版的音频流类型,例如 AudioAttributes.STREAM_MUSIC
AudioFocusRequest

用来请求获取焦点的详细信息和参数

  • Builder():参数代表请求焦点级别持续时间。
  • setAudioAttributes:用于描述音频焦点请求的属性
  • setAcceptsDelayedFocusGain:延迟音频焦点获取是指应用程序在请求音频焦点时,如果焦点当前不可用,是否愿意等待一段时间,直到焦点可用为止;参数默认为true,表示应用程序愿意等待焦点可用。如果将参数设置为 false,则表示应用程序不接受延迟焦点获取,如果焦点当前不可用,则请求会立即返回失败。
  • setWillPauseWhenDucked:用于设置当应用程序的音频焦点被降低时是否暂停音频播放。当应用程序的音频焦点被其他应用程序请求并且获得时,系统可能会降低应用程序的音量以便让焦点持有者能够播放音频。参数默认值为 true,表示应用程序在焦点被降低时会暂停音频播放。如果将参数设置为 false,则表示应用程序在焦点降低时不会暂停音频播放,而是继续以降低的音量播放。
  • setOnAudioFocusChangeListener:用于设置监听音频焦点变化的回调接口;当应用程序请求音频焦点并且焦点状态发生变化时,系统会调用注册的 AudioFocusChangeListener 接口的回调方法,通知应用程序焦点状态的变化
onAudioFocusChangeListener
AudioManager.OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int state) {
            	switch (focus) {
            	// 重新获取音频焦点
            	// 恢复播放
            	case AudioManager.AUDIOFOCUS_GAIN:
                break;
                // 永久丢失焦点
                // 此时应该停止播放,释放资源
            	case AudioManager.AUDIOFOCUS_LOSS:
                break;
                // 短暂丢失焦点
                // 但是很快就会重新获得,在此状态应该暂停所有音频播放
            	case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                break;
                // 瞬间丢失焦点
                // 暂时失去焦点,但是允许持续播放音频(以很小的声音),不需要完全停止播放
            	case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                break;
        		}
            }
        };

释放焦点

在Android8.0之前通过以下方法释放焦点,参数为之前申请焦点创建的监听OnAudioFocusChangeListener

audioManager.abandonAudioFocus(onAudioFocusChangeListener);

在Android8.0之后则通过如下方法释放,参数为之前申请焦点时创建的AudioFocusRequest

audioManager.abandonAudioFocusRequest(audioFocusRequest);

注意主动abandon焦点的时候是不会回调监听的文章来源地址https://www.toymoban.com/news/detail-643622.html

到了这里,关于多媒体音频焦点浅析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

    提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1)自己的科研经历, 科研内容 ,学习的相关领域知识,要熟悉熟透了 (2)自己的实习经历,做了 什

    2024年02月09日
    浏览(36)
  • 鸿蒙实战多媒体运用:【音频组件】

    音频组件用于实现音频相关的功能,包括音频播放,录制,音量管理和设备管理。 图 1  音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。 采样率 采样率为每秒从连续信号中提取并组成离散信号

    2024年03月10日
    浏览(39)
  • 零基础入门多媒体音频(6)-alsa(2)

    PCM接口 ALSA的PCM中间层非常有用,每个驱动只需要实现底层的功能来访问硬件。要使用PCM层,你需要先引用 sound/pcm.h头文件。此外,如果你要使用和hw_param相关的函数,sound/pcm_params.h也是必须的。 每个声卡设备最多拥有4个PCM实例。一个PCM实例对应一个PCM设备文件。实例数量的

    2024年04月14日
    浏览(34)
  • 鸿蒙HarmonyOS开发实战—多媒体开发(音频开发 一)

    HarmonyOS音频模块支持音频业务的开发,提供音频相关的功能,主要包括音频播放、音频采集、音量管理和短音播放等。 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。 采样率 采样率为每秒从连续信号中提取并

    2024年01月24日
    浏览(36)
  • 【python】《多媒体技术与应用》实验报告「数字音频处理」

     《多媒体技术与应用》 实验报告 实验名称 数字视频处理 实验时间 2022/4/25 姓名 班级 计非201 学号 成绩 一.  实验目的 1. 掌握数字音频的读取与打开; 2. 掌握数字音频信号的频谱分析; 3. 验证 PCM 编码算法。 二.实验原理 声音是由物体振动而产生的,声波的三要素是频率

    2023年04月16日
    浏览(35)
  • Android多媒体功能开发(11)——使用AudioRecord类录制音频

    AudioRecord类优点是能录制到缓冲区,能够实现边录边播(AudioRecord + AudioTrack)以及对音频的实时处理(如QQ电话)。缺点是输出是PCM格式的原始采集数据,如果直接保存成音频文件,不能够被播放器播放,所以必须用代码实现数据编码以及压缩。 使用AudioRecord录音的基本步骤是

    2023年04月09日
    浏览(28)
  • (八)穿越多媒体奇境:探索Streamlit的图像、音频与视频魔法

    欢迎各位读者来到“最全Streamlit教程”专栏系列!如果您正在寻找一种简单而强大的方式来创建交互式数据应用程序,那么Streamlit无疑是您的最佳选择。作为该领域的热门框架,Streamlit让数据科学家、开发者和爱好者能够以前所未有的速度构建出引人入胜的数据可视化工具。

    2024年02月13日
    浏览(31)
  • [前端笔记——多媒体与嵌入] 6.HTML 中的图片+视频+音频内容

    可以用 img 元素来把图片放到网页上。它是一个空元素(它不需要包含文本内容或闭合标签),最少只需要一个 src (一般读作其全称 * *source) * *来使其生效。src 属性包含了指向我们想要引入的图片的路径,可以是相对路径或绝对 URL,就像 a 元素的 href 属性一样。 属性是

    2023年04月25日
    浏览(41)
  • HarmonyOS学习路之开发篇—多媒体开发(音频开发 二(1)

    接口说明 接口名 描述 AudioCapturer(AudioCapturerInfo audioCapturerInfo) throws IllegalArgumentException 构造函数,设置录音相关音频参数,使用默认录音设备。 AudioCapturer(AudioCapturerInfo audioCapturerInfo, AudioDeviceDescriptor devInfo) throws IllegalArgumentException 构造函数,设置录音相关音频参数并指定录音

    2024年04月23日
    浏览(28)
  • LuatOS-SOC接口文档(air780E)--audio - 多媒体音频

    常量 类型 解释 audio.PCM number PCM格式,即原始ADC数据 audio.MORE_DATA number audio.on回调函数传入参数的值,表示底层播放完一段数据,可以传入更多数据 audio.DONE number audio.on回调函数传入参数的值,表示底层播放完全部数据了 audio.BUS_DAC number 硬件输出总线,DAC类型 audio.BUS_I2S numb

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包