2011.08.12(3)——— android AudioTrack 播放音频

本文详细介绍了使用Android AudioTrack API播放MP3文件时遇到的噪音问题,并提供了排查和解决该问题的方法。通过设置音量控制、调整播放模式以及优化音频缓冲区大小等步骤,最终成功解决了播放噪音的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2011.08.12(3)——— android AudioTrack 播放音频

参考:
[url]http://blog.sina.com.cn/s/blog_74b752870100qxrv.html[/url]
[url]http://crazier9527.iteye.com/blog/467061[/url]
[url]http://www.cnblogs.com/mcodec/articles/1933741.html[/url]

播放mp3的总是噪音,不知道原因,后来播放wav的倒是可以,
wav是没有压缩的pcm

package com.lp;


import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.media.AudioTrack.OnPlaybackPositionUpdateListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
private Button play;
private Button stop;

private AudioTrack at;
private AudioManager am;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
play = (Button)findViewById(R.id.main_play);
stop = (Button)findViewById(R.id.main_stop);
play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {

if(am.isSpeakerphoneOn()){
am.setSpeakerphoneOn(false);
}
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
am.setMode(AudioManager.MODE_IN_CALL);
System.out.println(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));
System.out.println("&&&&&&&&&&&&&");
System.out.println(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL));

int bufferSizeInBytes = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

if(at==null){
at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
System.out.println("22222");
new AudioTrackThread().start();
}else{
if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
System.out.println("111111111");
}else{
System.out.println("33333");
at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
new AudioTrackThread().start();
}
}

}
});

stop.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
at.stop();
at.release();
am.setMode(AudioManager.MODE_NORMAL);
}
});
}

class AudioTrackThread extends Thread{

@Override
public void run() {
byte[] out_bytes = new byte[44100];

InputStream is = getResources().openRawResource(R.raw.start);
int length ;
at.play();
try {
while((length = is.read(out_bytes))!=-1){
System.out.println(length);
at.write(out_bytes, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
at.stop();
at.release();
am.setMode(AudioManager.MODE_NORMAL);
}
}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值