Android_音视频开发进阶AudioTrack播放pcm!音视频转换器怎么用

抖店动销抖店体验分提升抖店任何业务可添加微信:ad07668

1.AudioTrack官方说明AudioTrack允许PCM音频缓冲器流到音频接收器进行回放。这是通过“推”的数据对象的信号使用write(byte[],int,int)andwrite(short[],in

1.AudioTrack官方说明

AudioTrack允许PCM音频缓冲器流到音频接收器进行回放。这是通过“推”的数据对象的信号使用 write(byte[], int, int) and write(short[], int, int) 方法。

一个信号可以在两种模式下运行:静态或流。

在流模式中,应用程序写一个连续的数据流的信号,采用write()方法。这些都是封闭和返回时,数据已经从java层转移到本地层排队等候播放。在播放音频数据块时,流模式最为有用:

由于播放声音的持续时间太大而不适合于记忆,因为音频数据的特性(采样率高)

在处理适合于内存的短声音时,应该选择静态模式,并且需要以最小的延迟进行播放。因此,静态模式更适合于经常播放的UI和游戏声音,并且可能开销最小。

在创作中,一个声道对象初始化其相关音频缓冲区。这个缓冲区的大小,规定在施工过程中,确定多长时间的信号可以跑出来的数据之前玩。

使用静态模式的信号,这是声音的大小,可以发挥它的最大尺寸。

对于流模式,数据将被写入音频接收器,其大小小于或等于总缓冲区大小。信号不是终点,从而允许子类,但不推荐使用。

2.AudioTrack何如创建和配置

static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)

public AudioTrack(int STREAMType, int sampleRateInHz, int channelConfig, int audioFormat,

int bufferSizeInbytes, int mode)

sampleRateInHz:采集率,有8000、20100等,一般来说越高音质越好,但文件体积就越大

streamType:音频流的类型,STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC, STREAM_ALARM, and STREAM_NOTIFICATION,这个参数和Android中的AudioManager有关系,涉及到手机上的音频管理策略。

channelConfig:声道,单声道CHANNEL_OUT_MONO 和双声道 CHANNEL_OUT_STEREO

audioFormat:采样点大小,只有ENCODING_PCM_16BIT 和 ENCODING_PCM_8BIT两种选择,意思是一个采集点16bit或8bit

bufferSizeInBytes:AudioTrack一次所能接收最小的声音资源大小,通过getMinBufferSize函数获取,

mode:有MODE_STATIC和MODE_STREAM两种分类。

STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中,效率低。

而STATIC的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,只有读取一次,这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。

【相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂

C++音视频配套学习资料点击莬费领取「链接」

3.AudioTrack使用

其实这个和AudioRecord一样的道理,因为是播放,所以播放文件存在,直接读取文件,通过流的形式一次一次的读取数据,同时播放

首先创建AudioTrack

bufferSize = AudioTrack.getMinBufferSize(8000,

AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);

// 实例AudioTrack

track = new AudioTrack(AudioManager.STREAM_MUSIC,

8000,

AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize,

AudioTrack.MODE_STREAM);

接着

track.play()

然后循环读取数据,读完了就stop(),自己中断的话就停止循环

track.play();

//writeToFileHead();

while (isStart) {

if (null != track&&dis.available() > 0) {

int i = 0;

while (dis.available() > 0 && i < buffer.length){

buffer[i] = dis.readShort();

i++;

}

track.write(buffer,0,buffer.length);

}

}

track.stop();

需要注意的是资源的及时释放

if (track != null) {

if (track.getState() == AudioRecord.STATE_INITIALIZED) {

track.stop();

}

if (track != null) {

track.release();

}

}

if (dis != null) {

dis.close();

}

4.AudioRecord和AudioTrack的对比

两者的功能刚好相反,一个产生pcm一个读取pcm,而运作的过程非常相似,都对流情有独钟,都是一次吃不了这么多,慢慢的吃,

mRecorder.startRecording();

//writeToFileHead();

while (isStart) {

if (null != mRecorder) {

bytesRecord = mRecorder.read(tempBuffer, 0, bufferSize);

if (bytesRecord == AudioRecord.ERROR_INVALID_OPERATION || bytesRecord == AudioRecord.ERROR_BAD_VALUE) {

continue;

}

if (bytesRecord != 0 && bytesRecord != -1) {

//在此可以对录制音频的数据进行二次处理 比如变声,压缩,降噪,增益等操作

//我们这里直接将pcm音频原数据写入文件 这里可以直接发送至服务器 对方采用AudioTrack进行播放原数据

dos.write(tempBuffer, 0, bytesRecord);

} else {

break;

}

}

}

就连资源释放都相似

if (mRecorder != null) {

if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {

mRecorder.stop();

}

if (mRecorder != null) {

mRecorder.release();

}

}

if (dos != null) {

dos.flush();

dos.close();

}

如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框,一起探讨。

抖店动销抖店体验分提升抖店任何业务可添加微信:ad07668

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.zg8899.cn/25059.html