zoukankan      html  css  js  c++  java
  • 安卓音频简析

    Android音频分析

    1        安卓音频系统框架

     


    Ø  Multimedia framework:

    多媒体框架负责封装了播放/录音类、连接安卓音频解码库进行音频软件解码以及连接高通OpenMaxIL接口。上层APP直接调用Multimedia framework的接口来进行音频的播放和录音。

    Ø  AudioService

    注冊安卓广播事件,获取广播事件,如蓝牙耳机插拔、USB音频设备插拔等。并调用Audio System接口来实现音频控制。

    Ø  AudioSystem

    该类中包括了音频的基础定义,包括音频流(stream)类型,路由(Routing)类型、音频输入输出设备(device)的定义、音频设备声明(device states)以及一些音频接口函数。

    Ø  Audio Flinger(AF):

    AudioFlinger是安卓音频的两大服务之中的一个,还有一个是AudioPolicyService,这两个服务均由mediaserver实例化(main_mediaserver.cpp。AudioFlinger直接与HAL层通讯,全部的音频操作都须要经过AudioFlinger来控制。

    主要有下面功能:

    1.      通过libaudio库的接口来管理全部的音频输入/输出设备;

    2.      实现PCM数据的混音/输入/输出;

    3.      播放时音量控制

    Ø  Audio Policy Manager(APM):

    APM主要用于音频流的路由策略。以及用户场景的切换。终于也是和AF通讯。有AF与HAL通讯控制。

    AudioPolicyService.java 也会通过AudioSystem中的接口(如AudioSystem::get_audio_flinger())来获取AF实例。音量的控制也是调用AudioSystem中的接口(如AudioSystem::setVoiceVolume(data->mVolume))来控制,终于AS也是调用AF的接口来实现。

    Ø  AudioTrack(AT):

    用于播放音频的类,通过audio_track_cblk_t AF共享内存,传递音频数据。

    Ø  AudioRecord:

    用于录音的类。

    2        详细分析

    2.1  AudioTrack(AT)分析

    java层:frameworksasemediajavaandroidmedia AudioTrack.java

    JNI层: frameworksasecorejniandroid_media_AudioTrack.cpp

    库:frameworksavmedialibmediaAudioTrack.cpp

    三个文件的关系:java层AudioTrack.java调用JNI层android_media_AudioTrack.cppnative函数。JNI层详细功能再调用库AudioTrack.cpp中函数来实现。

    s

    总的来说,audiotrack.java提供给APP用于播放音频的类。通过JNI与c++文件通信完毕详细的播放功能。

    audiotrack.java主要提供下面几个方法:

    getMinBufferSize():依据採样率。声道数,採样位数(採样精度)(分别相应三个形參)来计算须要的最小buffer缓冲区。

    AudioTrack():构造函数,构造一个播放类;

    paly():開始播放音频;

    write():往AudioTrack中写入音频数据;

    stop():停止播放;

    pause():暂停播放。

    release():释放底层的资源。

    AudioTrack播放音频数据时有两种方式,一种是静态模式(MODE_STATIC),还有一种是流模式(MODE_STREAM)。

    Ø static

    静态模式就是数据一次性交付给接收方。优点是简单高效,仅仅须要进行一次操作就完毕了数据的传递;缺点当然也非常明显,无法胜任数据量较大的音频回放。因而通常仅仅用于播放铃声、系统提醒等对内存小的操作。

    Ø streaming

    流模式和网络上播放视频是类似的,即数据是依照一定规律不断地传递给接收方的。

    理论上它可用于不论什么音频播放的场景,只是我们一般在下面情况下採用:

    Ø 音频文件过大

    Ø 音频属性要求高。比方採样率高、深度大的数据

    Ø 音频数据是实时产生的。这样的情况就仅仅能用流模式了

    AudioTrack的构造函数中有一个变量用来指定buffer的大小bufferSizeInBytes。

    AudioTrack在Native层会对这个变量的值进行有效性推断。首先。它至少要等于或者大于getMinBufferSize返回的值,然后它必须是frame大小的整数倍。(frame=声道数*採样位数/8

    举例说明,MODE_STREAM模式下,在JAVA层构造AudioTrack时,bufferSizeInBytes的大小设定为9600,在Native层调用Write方法拷贝数据至Hardware进行回放,每次拷贝的大小为320.则须要复制到30次,声卡才发出声音。

    即须要将数据填满缓冲区才进行播放。(320*30=9600)

    See also:

    Android深入浅出之Audio 第一部分 AudioTrack分析

    http://blog.csdn.net/onetwothreef/article/details/46311985

    深入剖析Android音频之AudioTrack

    http://www.2cto.com/kf/201410/342659.html

    Android Audio System 之中的一个:AudioTrack怎样与AudioFlinger交换音频数据

    http://blog.csdn.net/droidphone/article/details/5941344

    2.2  AudioFlinger(AF)

    负责向下訪问AudioHardwareInterface,实现音频PCM数据的混音/输入/输出以及音量调节;是底层和安卓层的桥梁。

    文件位置: frameworksavservicesaudioflinger AudioFlinger.cpp

    See also:

    Android Audio System 之二:AudioFlinger

    http://blog.csdn.net/onetwothreef/article/details/46311803

    Android Audio System 之中的一个:AudioTrack怎样与AudioFlinger交换音频数据

    http://blog.csdn.net/onetwothreef/article/details/46311645

    Android深入浅出之Audio 第二部分 AudioFlinger分析

    http://blog.csdn.net/onetwothreef/article/details/46311851

    受用的评论:參见http://blog.csdn.net/droidphone/article/details/5951999

    依照评论的理解,当手机里打开两个播放器的同一时候播放音乐,它们(不同的音乐)是同一个MixThread中的两个不同的AudioTrack(音轨),并混音输出。

    2.3  AudioPolicyService(APS)

     AudioPolicyService主要完毕下面任务:

    • JAVA应用层通过JNI,经由IAudioPolicyService接口,訪问AudioPolicyService提供的服务
    • 输入输出设备的连接状态
    • 系统的音频策略(strategy)的切换
    • 音量/音频參数的设置

    AudioPolicyManager

     

       AudioPolicyService的非常大一部分管理工作都是在AudioPolicyManager中完毕的。包含音量管理,音频策略(strategy)管理,输入输出设备管理。

    See also:

    Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager

    http://blog.csdn.net/onetwothreef/article/details/46311725

    Android音频系统之AudioPolicyService

    http://blog.csdn.net/onetwothreef/article/details/46311457

    Android源代码分析:AudioPolicy

    http://www.360doc.com/content/13/0815/14/11338643_307326622.shtml

  • 相关阅读:
    JS中的事件
    页面中图标的使用
    关于git,你需要知道一点命令
    H5一二事
    对js中Function的浅见
    浅谈JS中的继承
    关于JS变量提升的一些坑
    java自旋锁
    vue数据绑定原理
    JavaScript中的设计模式:状态模式
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7327455.html
Copyright © 2011-2022 走看看