2013-10-22 3 views
0

오디오 큐를 채우기 위해 3 개의 audioQueueBufferRef가 있으며 데이터가 충분히 빠를 때 모든 것이 훌륭하게 작동합니다. 그러나 때로는 outputCallback이 더 이상 데이터가 없을 때 버퍼를 채우라고 요청합니다. 이 경우 나는 뭔가를 대기열에 넣지 않으며 콜백은 더 이상 호출되지 않습니다. (정상?)스트림 지연으로 인해 AudioQueueBufferRef가 비어 있습니다.

이 후 2 버퍼와 나중에 (다른 지연 후) 1 버퍼를 실행하고 마지막으로 아무런 결과도없는 콜백이 버퍼에 없습니다.

빈 audioQueueBufferRef를 배열에 저장하고 데이터를 채울 때 호출하려고합니다. 그러나 데이터가 충분히 빠르지 않기 때문에 버퍼는 남아있는 데이터의 양을 "먹고"소리는 느려집니다.

채우기 위해 데이터가 부족할 때 가장 좋은 방법은 무엇입니까?

내가 가진 가장 좋은 점은 콜백없이 버퍼가 죽어 버려서 모든 버퍼가 비어있을 때까지 나머지 버퍼가 작업을하도록하는 것입니다. 이 후 audioQueue 중지 일부 데이터를 저장하고 다시 재생하십시오. AudioqueueStop()을 호출해야합니다. 왜냐하면 모든 버퍼가 비어서 다시 채울 때 소리가 들리지 않기 때문입니다. 이게 정상인가?

일반적으로 좋은 방법인가요? 더 좋은 방법이 있습니까? 그리고 내 모든 audioqueueBufferRef가 콜백 실행없이 죽었다는 것을 감지하는 콜백이 있습니까? 2.

답변

0

나는 당신을 위해 솔루션을 테스트 playroutine이 시도 :

cnt++; 
if (cnt > 5) { 
    inBuffer->mAudioDataByteSize = 4; 

    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL); 
    cnt = 0; 
    return; 
} 

그것은 데이터가 너무 늦게 AudioQueue은 버퍼 요청마다 5 시간을 도착하는 것을 시뮬레이션합니다. mAudioDataByteSize는 크기가 4인데, 이는 2 채널 16 비트 웨이브 파일의 샘플 크기가 가장 작은 것입니다. 크기를 0으로 설정하면 대기열이 사라지고 오류 메시지 'kAudioQueueErr_BufferEmpty'가 반환되므로 피드를 제공 할 필요는 없지만 데이터를 피드해야합니다. 그것에 대해 생각하면 이해가됩니다.

데이터를 얻기 위해 얼마나 오래 기다릴 필요가 있는지 추정하기 위해 코드를 조정할 수도 있습니다. 약 2ms 이내에 더 많은 정보를 얻을 수 있습니다. 그런 다음 버퍼 크기를 그 시간보다 약간 작은 샘플 수로 설정할 수 있습니다. 2 채널 16 비트 44100 Hz 웨이브 송을 재생할 경우 2ms는 44100 Hz * 0.002 초 = 88, 88 * 2 채널 * (16 비트/8) = 353 바이트의 버퍼 크기에 해당합니다.

0

주파수를 설정하면 콜백이 호출된다고 생각합니다. 시간 내에 데이터를 채울 수 없으면 소리가 비정상입니다. 귀하의 데이터가 네트워크에서 왔습니까? 나는 당신과 같은 조건을 만났습니다. 제 해결책은 침묵하는 하나의 패킷 데이터를 기록하는 것이며, 채울 오디오 데이터가 없을 때 대신 무음 데이터를 사용합니다.

관련 문제