`

AudioTrack学习

 
阅读更多
AudioTrack主要是用来播放声音的,AudioTrack贯穿了JAVA层,JNI层和Native层.

AudioTrack JAVA层:

framework\base\media\java\android\media\AudioTrack.java

以AudioTrack的使用方法举例:

// 得到一个满足最小要求的缓冲区的大小
int bufsize = AudioTrack.getMinBufferSize(8000,//采样率 = 每秒8K个点

  AudioFormat.CHANNEL_CONFIGURATION_STEREO,//双声道

AudioFormat.ENCODING_PCM_16BIT);//采样精度 = 一个采样点16比特 = 2个字节

//创建AudioTrack
AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,

  AudioFormat.CHANNEL_CONFIGURATION_ STEREO,

  AudioFormat.ENCODING_PCM_16BIT,

  bufsize,

AudioTrack.MODE_STREAM);//

 trackplayer.play() ;//开始

trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中写数据

//...

trackplayer.stop();//停止播放

trackplayer.release();//释放底层资源


AudioTrack Native层:

// 得到一个满足最小要求的缓冲区的大小
int bufsize = AudioTrack.getMinBufferSize(8000,//采样率 = 每秒8K个点

  AudioFormat.CHANNEL_CONFIGURATION_STEREO,//双声道

AudioFormat.ENCODING_PCM_16BIT);//采样精度 = 一个采样点16比特 = 2个字节


getMinBufferSize实际调用了JNI通过Native代码来实现.

MODE_STREAM和MODE_STATIC

STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中。这个和我们在socket中发送数据一样,应用层从某个地方获取数据,例如通过编解码得到PCM数据,然后write到audiotrack。这种方式的坏处就是总是在JAVA层和Native层交互,效率损失较大。

In Streaming mode, the application writes a continuous stream of data to the AudioTrack, using one of the write() methods. These are blocking and return when the data has been transferred from the Java layer to the native layer and queued for playback.

MODE_STREAM模式终使用Write方法,该方法是阻塞的,当数据从Java层到Native层执行播放完毕后才返回。


而STATIC的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,后续就不用一次次得write了。AudioTrack会自己播放这个buffer中的数据。这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。

AudioTrack的构造函数
public AudioTrack (int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode)
AudioTrack的构造函数中有一个变量用来指定buffer的大小bufferSizeInBytes。

AudioTrack在Native层会对这个变量的值进行有效性判断。首先,它至少要等于或者大于getMinBufferSize返回的值,然后它必须是frame大小的整数倍。

举例说明,MODE_STREAM模式下,在JAVA层构造AudioTrack时,bufferSizeInBytes的大小设定为9600,在Native层调用Write方法拷贝数据至Hardware进行回放,每次拷贝的大小为320.则需要拷贝到30次,声卡才发出声音。即需要将数据填满缓冲区才进行播放。(320*30=9600)
分享到:
评论

相关推荐

    AudioTrack_socket.zip

    在Android开发中,AudioTrack是用于播放音频数据的重要类,特别是在处理实时音频流时非常有用。本示例针对Android 9.0(Pie)系统,展示了如何使用...对于想要实现类似功能的开发者,这是一个很好的学习参考。

    android 使用 audiotrack和audiorecord c++代码

    通过研究这个开源项目,开发者可以学习到如何在C++环境中高效地处理Android音频,理解音频数据的流程,以及如何在VoIP应用中实现高质量的语音通信。这将有助于提升Android音频应用的性能和用户体验。同时,对于深入...

    audioRecord和audiotrack实例

    在Android平台上,音频处理是移动应用开发中的一个重要组成部分,尤其是涉及到音乐播放、语音记录和实时通信功能时。本文将深入探讨如何使用...通过实践和学习,你可以深入了解这些API的潜力,并创造出更多创新的应用。

    AudioRecord和AudioTrack

    通过分析这些代码,我们可以学习如何在实际开发中运用AudioRecord和AudioTrack,了解如何配置音频参数、如何处理数据流,以及如何控制录制和播放的流程。 总的来说,AudioRecord和AudioTrack是Android平台音频处理...

    AudioRecord和AudioTrack实现语音录取和即时播放

    在Android平台上,开发声音相关的应用时,我们经常会用到`Audio...通过对这些文件的分析和学习,可以更深入地理解`AudioRecord`和`AudioTrack`的使用方法,以及在实际项目中如何结合它们实现语音录取和即时播放功能。

    AudioTrack播放MP3 左右声道控制 之移植Libmad到android平台

    此外,Android平台提供了多种音频框架,如OpenSL ES,它们可能提供更高级的功能和更好的性能,但移植和学习成本相对较高。 总的来说,将Libmad移植到Android并结合AudioTrack实现左右声道控制,是一项涉及跨平台...

    AudioRecord和AudioTrack实现录音和播放

    通过学习和分析这个项目,开发者可以更好地理解和掌握Android音频处理的核心技术,从而在自己的应用中实现更复杂的音频功能,如实时语音通话、音乐播放器等。 总的来说,AudioRecord和AudioTrack是Android音频编程...

    AudioTrack播放pcm文件,波形显示

    在Android平台上,AudioTrack类是系统提供的一种API,允许...这对于理解音频处理和Android多媒体编程具有一定的学习价值。为了进一步完善这个应用,你可以考虑添加音量控制、暂停/恢复功能,以及优化波形显示效果。

    android音频发射器,audiotrack方波,音频通信

    在Android平台上,音频处理是一个非常重要的领域,尤其对于开发者...在实践中,不断探索和学习,将使你在音频开发领域更加熟练。如果你想要了解更多细节,可以参考指定的博客链接,那里应该有更详细的讲解和示例代码。

    AudioJNITest:AudioTrack的使用方法,JNI调用音频算法(算法为C++,暂不上传)

    总的来说,AudioJNITest项目提供了一个很好的学习示例,展示了如何结合AudioTrack和JNI在Android中实现高效、灵活的音频处理。开发者可以通过研究这个项目,深入理解Android音频播放机制,以及如何有效地利用JNI调用...

    音乐播放器Demo

    2. **MediaPlayer类**:虽然AudioTrack可以实现基本的播放功能,但更复杂的媒体控制,如暂停、恢复和 seekTo(跳转到特定位置)等,通常通过MediaPlayer类来实现。MediaPlayer封装了更高级的音频播放逻辑,包括对...

    音频录制和播放示例

    通过分析和学习这个示例,开发者能够了解Android音频处理的基本原理,并以此为基础构建更复杂的功能,如混音、音频特效等。 总的来说,“音频录制和播放示例”是一个基础的音频处理模型,展示了如何在Android中实现...

    AudioTrackAdjustVol.zip

    在Android平台上,AudioTrack是系统提供的一个核心API,用于实现应用程序级别的音频播放功能。...这个示例对于开发者来说是一个很好的学习资源,可以帮助他们深入理解Android音频播放机制和音量控制。

    AudioTrackDemo

    【AudioTrackDemo】是一个基于Java开发的音频播放示例项目,它主要展示了如何利用Android平台中的`AudioTrack`类来播放PCM(脉冲...通过学习和理解这些代码,你可以掌握在Android上实现自定义音频播放器的基本技巧。

    AudioPlayer

    在Android平台上,开发音频播放功能是一项常见的任务。`AudioPlayer`通常指的是一个自定义的音频播放组件...`AudioPlayerDemo`项目为理解这些底层音频处理机制提供了实践示例,对于学习和调试音频播放功能非常有帮助。

    Android代码-[安卓开源]录音播放功能最佳学习项目.zip

    本项目以"Android代码-[安卓开源]录音播放功能最佳学习项目.zip"为主题,提供了丰富的实践示例,帮助开发者深入理解Android音频处理。 1. **Android录音API:AudioRecord** - `AudioRecord`类是Android系统提供的...

    AudioRecordSample_apk.tar.gz

    本篇将深入探讨Android中的AudioRecord和AudioTrack两个关键类,通过分析“AudioRecordSample_apk.tar.gz”提供的源码,来学习如何实现语音录制和播放功能。 首先,AudioRecord是Android系统中用于从硬件输入设备...

    TestAudioTrack

    总的来说,`TestAudioTrack`项目是学习Android自定义音频播放的一个良好起点,它涉及到`AudioTrack`类的使用和PCM音频格式的理解。通过这个项目,开发者可以深入掌握Android音频编程,实现更加复杂和高效的音频功能...

    android多媒体学习代码

    `MediaPlayer`也可用于播放音频,但更复杂的音频操作可能需要`AudioTrack`和`AudioRecord`类。`AudioManager`管理系统的音频焦点和音量控制。`SoundPool`则用于加载和播放小型音频剪辑。 7. **权限管理**: 自...

Global site tag (gtag.js) - Google Analytics