我有一个功能,我想过渡到使用安卓AudioTrack
而不是MediaPlayer
,由于MediaPlayer
的一些众所周知的bug,例如在循环轨迹之间出现的小间隙。
有人推荐我使用AudioTrack
,但在使用中并没有找到很多这样的例子。我确实发现了一个关于AudioTrack
的问题,并使用了其中的一些代码来破解一些东西:
public class TestActivity extends Activity implements Runnable {
Button playButton;
byte[] byteData = null;
int bufSize;
AudioTrack myAT = null;
Thread playThread = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
playButton = (Button) findViewById(R.id.testButton);
InputStream inputStream = getResources().openRawResource(R.raw.whitenoise_wav);
try {
byteData = new byte[ inputStream.available()];
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.read(byteData);
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
initialize();
playButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
playThread.start();
}
});
}
void initialize() {
bufSize = android.media.AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
myAT = new AudioTrack(AudioManager.STREAM_MUSIC,
44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufSize,
AudioTrack.MODE_STREAM);
myAT.setVolume(.2f);
playThread = new Thread(this);
}
public void run() {
if (myAT != null) {
myAT.play();
myAT.setLoopPoints(0, byteData.length, 6);
myAT.write(byteData, 0, byteData.length);
}
}
}
因此,这似乎是播放整个音轨(约1:00分钟),然后停止。现在这里的最终目标是两个有两个独立的音轨同时播放和循环。我目前在/res/raw/
目录中有音轨,但如果这样更好的话,我可以将它们移到一个简单的assets
文件夹中。我当前的AudioTrack
实现是否正确?如果是这样,我如何让它循环?
总结:如何使用AudioTrack
播放没有间隙的循环音频
欢迎使用其他方法获取循环音频,例如第三方库。
https://stackoverflow.com/questions/36191636
复制相似问题