Как получить монофонический файл для воспроизведения в стереофоническом режиме в приложении iPhone с помощью служб аудио-очереди - PullRequest
1 голос
/ 12 ноября 2010

Я пишу приложение для iPhone, в котором я играю некоторые монофонические mp3-файлы, используя Audio Queue Services. При воспроизведении я слышу только звук на одном канале. Я безуспешно искал пример того, как заставить файлы воспроизводиться на обоих каналах. То, что я делаю, сейчас довольно просто. Я настраиваю свою аудио-очередь следующим образом:

AudioStreamBasicDescription queueASBD;  
AudioQueueRef audioQueue;  
queueASBD.mSampleRate = 44100.0;  
queueASBD.mFormatID = kAudioFormatLinearPCM;  
queueASBD.mFormatFlags = kAudioFormatFlagsNativeEndian | AudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;  
queueASBD.mBytesPerPacket = 4;  
queueASBD.mFramesPerPacket = 1;  
queueASBD.mBytesPerFrame = 4;  
queueASBD.mChannelsPerFrame = 2;  
queueASBD.mBitsPerChannel = 16;  
queueASBD.mReserved = 0;  
AudioQueueNewOutput(&queueASBD, AudioQueueCallback, NULL, CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &audioQueue);  

Я открываю mp3-файл вот так (проверка ошибок и такие удаленные для краткости):

ExtAudioFileRef audioFile;  
ExtAudioFileOpenURL(url, &audioFile);  
ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(queueASBD), &queueASBD);  

И чтобы поставить в очередь буфер, я делаю что-то вроде этого:

AudioQueueBufferRef buffers; // previously allocated  
AudioBufferList abl;  
UInt32 length = (UInt32)queueASBD.mSampleRate / BUFFERS_PER_SECOND;  
abl.mNumberBuffers = 1;  
abl.mBuffers[0].mDataByteSize = (UInt32)(queueASBD.mSampleRate * queueASBD.mBytesPerPacket / BUFFERS_PER_SECOND);  
abl.mBuffers[0].mNumberChannels = queueASBD.mChannelsPerFrame;  
abl.mBuffers[0].mData = buffer->mAudioData;  
ExtAudioFileRead(audioFile, &length, &abl);  
UInt32 byte_length = length * (UInt32)queueASBD.mBytesPerPacket;  
buffer->mAudioDataByteSize = byte_length;  
AudioQueueEnqueueBuffer(audioQueue, buffer, 0, NULL);  

Есть ли способ заставить файл воспроизводиться в стереофоническом режиме без полного перекодирования (например, с помощью API Audio Unit)? Может ли здесь помочь конвертер аудио? Есть ли другой способ? Спасибо за любую помощь.

1 Ответ

1 голос
/ 12 ноября 2010

Попробуйте открыть аудио-очередь только с одним каналом на кадр (например, моно) и соответствующим количеством байтов на пакет и на кадр (вероятно, 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...