내 응용 프로그램에서 오디오 데이터를 LinearPCM 형식으로 수신하고 있는데, 재생해야합니다. iOS SpeakHere 예제를 따르고 있습니다. 그러나 나는 어떻게 그리고 어디서 버퍼를 AudioQueue
에 제공해야하는지 알 수 없다.오디오를 재생하기 위해 AudioQueue에 오디오 버퍼를 제공하는 방법은 무엇입니까?
누구나 AudioQueue
을 통해 iOS에서 오디오 버퍼를 재생하는 작업 예제를 제공 할 수 있습니까?
내 응용 프로그램에서 오디오 데이터를 LinearPCM 형식으로 수신하고 있는데, 재생해야합니다. iOS SpeakHere 예제를 따르고 있습니다. 그러나 나는 어떻게 그리고 어디서 버퍼를 AudioQueue
에 제공해야하는지 알 수 없다.오디오를 재생하기 위해 AudioQueue에 오디오 버퍼를 제공하는 방법은 무엇입니까?
누구나 AudioQueue
을 통해 iOS에서 오디오 버퍼를 재생하는 작업 예제를 제공 할 수 있습니까?
SpeakHere 예제에서 재생은 AudioQueue
을 사용하여 이루어집니다.
AudioQueue
의 설정에서 큐가 더 많은 데이터를 원할 때 호출 될 함수가 지정됩니다. 당신은이 방법이 볼 수
: 당신이 AQPlayer::AQBufferCallback
을 살펴 경우가 얻는 곳
XThrowIfError(AudioQueueNewOutput(&mDataFormat, AQPlayer::AQBufferCallback, this,
CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue), "AudioQueueNew failed");
, 당신은 볼 수 있습니다 : 여기
void AQPlayer::SetupNewQueue()
콜백 함수를 지정하는 라인이다 에서 데이터. 이 예에서 데이터는 디스크의 파일에 기록됩니다. 메모리를 절약하고 싶거나 오디오 파일이 상당히 클 경우에는 좋은 해결책입니다.
어쨌든 AQPlayer::AQBufferCallback
을 보면 AudioFileReadPackets
함수가 호출됩니다. 디스크의 파일에서 오디오 패킷을 읽습니다. 버퍼가 inCompleteAQBuffer->mAudioData
입니다
OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets,
inCompleteAQBuffer->mAudioData);
난 것이 바로 AudioQueue
가 사용할 버퍼로 읽습니다. 다음
마지막 콜백 함수는 버퍼 대기열해야
if (nPackets > 0) {
inCompleteAQBuffer->mAudioDataByteSize = numBytes;
inCompleteAQBuffer->mPacketDescriptionCount = nPackets;
AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);
THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
}
참고 먼저 우리 재생할 일부 패킷이 있는지 확인하는 것이다. 또한 버퍼에있는 바이트 수를 지정해야합니다.
그런 다음, 여기이 선 : 우리는 우리의 오디오 버퍼에 전체를 현 위치를 추적
THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
. 즉, 더 많은 데이터가 파일에서 복사 될 때 mCurrentPacket
을 다음 사본이 올바른 위치에 놓 이도록 배치해야합니다.