簡體   English   中英

如何使用音頻隊列服務使單聲道文件在iPhone應用程序中以立體聲播放

[英]How to get mono file to play in stereo in iPhone app using audio queue services

我正在編寫一個iPhone應用程序,在其中使用音頻隊列服務播放一些單聲道mp3文件。 播放時,我只在一個頻道上聽到聲音。 我一直在尋找一個示例,該示例如何使文件在兩個通道上播放而沒有運氣。 我現在正在做的非常簡單。 我正在這樣設置音頻隊列:

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)? 音頻轉換器可以幫助您嗎? 還有其他方法嗎? 謝謝你的幫助。

嘗試打開音頻隊列,每幀只有一個通道(例如,單聲道),以及每個數據包和每個幀的匹配字節數(可能為2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM