Android 深入系统完全讲解(25)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

AudioTrack 基本使用
AudioTrack 是直接播放采集的 PCM 音频流这里简单看下流程。
AudioTrack mAudioTrack;
//音频流类型
private static final int mStreamType = AudioManager.STREAM_MUSIC;
//指定采样率 MediaRecoder 的采样率通常是 8000Hz AAC 的通常是 44100Hz。 设
置采样率为 44100目前为常用的采样率官方文档表示这个值可以兼容所有的设置
private static final int mSampleRateInHz=44100 ;
//指定捕获音频的声道数目。在 AudioFormat 类中指定用于此的常量
private static final int mChannelConfig=
AudioFormat.CHANNEL_CONFIGURATION_MONO; //单声道
//指定音频量化位数 ,在 AudioFormaat 类中指定了以下各种可能的常量。通常我们选
择 ENCODING_PCM_16BIT 和 ENCODING_PCM_8BIT PCM 代表的是脉冲编码调制它实际
上是原始音频样本。
//因此可以设置每个样本的分辨率为 16 位或者 8 位16 位将占用更多的空间和处理能
力,表示的音频也更加接近真实。
private static final int mAudioFormat=AudioFormat.ENCODING_PCM_16BIT;
//指定缓冲区大小。调用 AudioRecord 类的 getMinBufferSize 方法可以获得。
private int mMinBufferSize;
//STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack
中。这个和我们在 socket 中发送数据一样
// 应用层从某个地方获取数据例如通过编解码得到 PCM 数据然后 write 到
audiotrack。
private static int mMode = AudioTrack.MODE_STREAM;
创建 AudioTrack//根据采样率采样精度单双声道来得到 frame 的大小。
mMinBufferSize = AudioTrack.getMinBufferSize(mSampleRateInHz,mChannelConfig, mAudioFormat);//计算最小缓冲区
//注意按照数字音频的知识这个算出来的是一秒钟 buffer 的大小。
//创建 AudioTrack
mAudioTrack = new AudioTrack(mStreamType, mSampleRateInHz,mChannelConfig, mAudioFormat,mMinBufferSize,mMode);
获取音频文件
mDis = new DataInputStream(new FileInputStream(file));
获取音频数据
readCount= mDis.read(tempBuffer);
播放
mAudioTrack.play();
mAudioTrack.write(tempBuffer, 0, readCount);
这里说下系统声音分很多类型
 AudioManager.STREAM_MUSIC用于音乐播放的音频流。
 AudioManager.STREAM_SYSTEM用于系统声音的音频流。
 AudioManager.STREAM_RING用于电话铃声的音频流。
 AudioManager.STREAM_VOICE_CALL用于电话通话的音频流。
 AudioManager.STREAM_ALARM用于警报的音频流。
 AudioManager.STREAM_NOTIFICATION用于通知的音频流。
 AudioManager.STREAM_BLUETOOTH_SCO用于连接到蓝牙电话时的手机音频流。
 AudioManager.STREAM_SYSTEM_ENFORCED在某些国家实施的系统声音的音频流。
 AudioManager.STREAM_DTMFDTMF 音调的音频流。
 AudioManager.STREAM_TTS文本到语音转换TTS的音频流。
区分这个的原因是底层在播放的时候是有优先级的同时也有一个就是音量调节会对应
到不同的配置上需要一个判断参数。
而模式主要有两种
AudioTrack.MODE_STREAM 和 AudioTrack.MODE_STATIC
使用 AudioTrack.MODE_STREAM 将数据不断地写入缓存里面这个就是交互比较频繁一直
要从上层传递下去效率损失太大。这块的解决方案是直接调用 C使用 NDK 开发完
成音频播放。
这块后续我们会讲一些关于 OpenSL ES 的相关知识。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android