iOS音頻佇列服務

來源:互聯網
上載者:User

音頻佇列服務提供一個可能,那就是把音頻資料區塊填充到音頻佇列服務緩衝區中,從而達到播放聲音的目的,這種方式很類似
Windows 中的 waveOutWrite 方法。這樣,我們就可以通過這個方法實現播放從網路上傳輸過來的音頻資料。
我們需要通過佇列服務提供的 AQOutputCallback 回調中填充緩衝區,在這裡,我們就可以填充從網路傳輸過來的資料。
 
參看代碼:
AudioStreamBasicDescription format; // 聲音格式設定,這些設定要和採集時的配置一致
memset(&format, 0, sizeof(format));
 
format.mSampleRate = 44100; // 採樣率 (立體聲 = 8000)
format.mFormatID = kAudioFormatLinearPCM; // PCM 格式
format.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
format.mChannelsPerFrame = 1;  // 1:單聲道;2:立體聲
format.mBitsPerChannel = 16; // 語音每採樣點佔用位元
format.mBytesPerFrame = (format.mBitsPerChannel /  * format.mChannelsPerFrame;
format.mFramesPerPacket = 1;
format.mBytesPerPacket = format.mBytesPerFrame * format.mFramesPerPacket;
 
AudioQueueRef queue;
AudioQueueNewOutput(&format,
                AQPlayer::AQOutputCallback,
                this,  // opaque reference to whatever you like
                CFRunLoopGetCurrent(),
                kCFRunLoopCommonModes,
                0,
                &queue);
 
const int bufferSize = 0xA000;  // 48K - around 1/2 sec of 44kHz 16 bit mono PCM
for (int i = 0; i < kNumberBuffers; ++i)
    AudioQueueAllocateBufferWithPacketDescriptions(queue, bufferSize, 0, &mBuffers[i]);
 
AudioQueueSetParameter(queue, kAudioQueueParam_Volume, 1.0);
 
UInt32 category = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
 
AudioSessionSetActive(true);
 
// prime the queue with some data before starting
for (int i = 0; i < kNumberBuffers; ++i)
    OutputCallback(queue, mBuffers[i]);
 
AudioQueueStart(queue, NULL);
 
在CallBack中填出資料:
 
void OutputCallback(void* inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inCompleteAQBuffer) {
    // Fill
    //AQPlayer* that = (AQPlayer*) inUserData;
    inCompleteAQBuffer->mAudioDataByteSize = next->mAudioDataBytesCapacity;
    for (int i = 0; i < inCompleteAQBuffer->mAudioDataByteSize; ++i)
        next->mAudioData[i] = rand();
    AudioQueueEnqueueBuffer(queue, inCompleteAQBuffer, 0, NULL);
 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.