【发布时间】:2016-03-24 01:17:42
【问题描述】:
由于MediaPlayer 的一些众所周知的错误,例如循环轨道之间出现的小间隙,我想过渡到使用 Android 的功能 AudioTrack 而不是 MediaPlayer。
有人建议我使用AudioTrack,但还没有找到很多使用它的例子。我确实在 SO 上找到了一个关于 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 分钟)然后停止。现在这里的最终目标是两个有 2 个单独的音轨同时播放和循环。我目前在/res/raw/ 目录中有音轨,但如果这样会更好,我可以将它们移动到一个简单的assets 文件夹中。我当前对AudioTrack 的实现是否正确?如果是这样,我将如何让它循环?
总之:如何使用AudioTrack 无间隙地播放循环音频?
欢迎提出有关获取循环音频的替代方法的建议,例如第三方库。
【问题讨论】:
-
您是否要同时播放两个曲目,并在播放完毕后循环播放该音频?
-
SoundPool主要用于短片,仅持续几秒钟,如游戏音效。
标签: android audiotrack