나는 안드로이드 2.1 용으로 프로그래밍하고 있습니다. 다음 문제를 도와 줄 수 있습니까?Eclipse에서 버퍼로 AudioTrack 버퍼로 음악 재생 - 소리 없음
나는 세 개의 파일을 가지고 있으며 일반적인 용도는 버퍼에 의해 audiotrack 버퍼로 사운드를 재생하는 것입니다. 모든 것을 시도했기 때문에 필자는 여기서 필사적으로 변했습니다. 내 스피커에서 소리가 나오지 않습니다 (안드로이드의 통합 미디어 플레이어는 에뮬레이터를 통해 소리를 재생하는 데 문제가 없습니다).
소스 코드 : 오디오 트랙을 구현
audioplayer 클래스. 사운드가 포함 된 버퍼를 수신합니다.
public AudioPlayer(int sampleRate, int channelConfiguration, int audioFormat) throws ProjectException {
minBufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfiguration, audioFormat);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfiguration,
audioFormat, minBufferSize, AudioTrack.MODE_STREAM);
if(audioTrack == null)
throw new ProjectException("Erreur lors de l'instantiation de AudioTrack");
audioTrack.setStereoVolume((float)1.0, (float)1.0);
}
@Override
public void addToQueue(short[] buffer) {
audioTrack.write(buffer, 0, buffer.length*Short.SIZE);
if(!isPlaying) {
audioTrack.play();
isPlaying = true;
}
}
내가 버퍼를 채우기 위해 사용하는 모델 클래스. 일반적으로 파일에서 사운드를로드하지만 여기에서는 디버깅을 위해 시뮬레이터 (440Hz) 만 사용합니다.
버퍼 크기는 매우 느슨하게 선택됩니다. 일반적으로 첫 번째 버퍼 크기는 6615이고 4410이어야합니다. 다시 한 번 디버그를위한 것입니다. model.ontimechange() 매 200 밀리 호출
public void onTimeChange() {
if(begin) {
//First fill about 300ms
begin = false;
short[][] buffer = new short[channels][numFramesBegin];
//numFramesBegin is for example 10000
//For debugging only buffer[0] is useful
fillSimulatedBuffer(buffer, framesRead);
framesRead += numFramesBegin;
audioPlayer.addToQueue(buffer[0]);
}
else {
try {
short[][] buffer = new short[channels][numFrames];
//Afterwards fill like 200ms
fillSimulatedBuffer(buffer, framesRead);
framesRead += numFrames;
audioPlayer.addToQueue(buffer[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private short simulator(int time, short amplitude) {
//a pure A (frequency=440)
//this is probably wrong due to sampling rate, but 44 and 4400 won't work either
return (short)(amplitude*((short)(Math.sin((double)(simulatorFrequency*time)))));
}
private void fillSimulatedBuffer(short[][] buffer, int offset) {
for(int i = 0; i < buffer[0].length; i++)
buffer[0][i] = simulator(offset + i, amplitude);
}
timeTask 클래스.
public class ReadMusic extends TimerTask {
private final Model model;
public ReadMusic(Model model) {
this.model = model;
}
@Override
public void run() {
System.out.println("Task run");
model.onTimeChange();
}
}
무엇 디버깅 내게 보여 주었다 :
- timeTask 잘 작동, 그것의 일을을;
- 버퍼 값은 일관된 것으로 보이며 버퍼 크기는 minBufSize보다 큽니다.
- Audiotrack의 재생 상태가 "재생 중"
- 모델 기능에서 예외가 발견되지 않습니다.
모든 아이디어가 크게 감사하겠습니다!