2017-05-07 86 views
1

我正在使用在線廣播應用程序我設法使用AudioQueueServices播放來自Icecast服務器的流式數據包,我正在努力實現錄製功能。使用ExtAudioFileWrite將Streamed mp3數據包的緩衝區寫入wav文件ios

由於流式傳輸採用mp3格式,因此無法使用AudioFileWritePackets將音頻數據包直接寫入文件。

利用擴展音頻的自動轉換我正在使用ExtAudioWriteFile寫入wav文件。我使用FileStreamOpen回調函數AudioFileStream_PropertyListenerProc和我手動填充的目標格式設置了傳入數據包的AudioStreamBasicDescription。代碼成功創建文件並將數據包寫入它,但回放時我聽到的是白噪聲; 這裏是我的代碼

// when the recording button is pressed this function creates the file and setup the asbd 
    -(void)startRecording{ 
     recording = true; 
     OSStatus status; 
     NSURL *baseUrl=[self applicationDocumentsDirectory];//returns the document direcotry of the app 
     NSURL *audioUrl = [NSURL URLWithString:@"Recorded.wav" relativeToURL:baseUrl]; 
     //asbd setup for the destination file/wav file 
     AudioStreamBasicDescription dstFormat; 
     dstFormat.mSampleRate=44100.0; 
     dstFormat.mFormatID=kAudioFormatLinearPCM; dstFormat.mFormatFlags=kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked; 
     dstFormat.mBytesPerPacket=4; 
     dstFormat.mBytesPerFrame=4; 
     dstFormat.mFramesPerPacket=1; 
     dstFormat.mChannelsPerFrame=2; 
     dstFormat.mBitsPerChannel=16; 
     dstFormat.mReserved=0; 
     //creating the file  
     status = ExtAudioFileCreateWithURL(CFBridgingRetain(audioUrl), kAudioFileWAVEType, &(dstFormat), NULL, kAudioFileFlags_EraseFile, &recordingFilRef); 

     // tell the EXtAudio File ApI what format we will be sending samples 
     //recordasbd is the asbd of incoming packets populated in AudioFileStream_PropertyListenerProc 
     status = ExtAudioFileSetProperty(recordingFilRef, kExtAudioFileProperty_ClientDataFormat, sizeof(recordasbd), &recordasbd); 
    } 
    // a handler called by packetproc call back function in AudiofileStreamOpen 
    - (void)handlePacketsProc:(const void *)inInputData numberBytes:(UInt32)inNumberBytes numberPackets:(UInt32)inNumberPackets packetDescriptions:(AudioStreamPacketDescription *)inPacketDescriptions { 
    if(recording){ 
     // wrap the destination buffer in an audiobuffer list 
     convertedData.mNumberBuffers= 1; 
     convertedData.mBuffers[0].mNumberChannels = recordasbd.mChannelsPerFrame; 
     convertedData.mBuffers[0].mDataByteSize = inNumberBytes; 
     convertedData.mBuffers[0].mData = inInputData; 


     ExtAudioFileWrite(recordingFilRef,recordasbd.mFramesPerPacket * inNumberPackets, &convertedData); 
     } 

    } 

我的問題是:

是我的方法,我的權利可以寫MP3數據包這樣的WAV文件,如果是這樣我失去了什麼?

如果我的做法是錯了,請告訴我,你認爲任何其他方式是在正確的方向輕移right.A是綽綽有餘我

我爲我讀我每次SO問題的任何幫助,非常感謝可以得到我的手在這個話題上,我也密切關注蘋果轉換文件的例子,但我不知道我是什麼想法 預先感謝您的任何幫助

回答

0

爲什麼不直接寫入原始mp3數據包到文件?根本沒有使用ExtAudioFile

他們將形成一個有效的mp3文件,並將比等效的wav文件小得多。

+0

我想寫給mp3,但由於版權問題蘋果不支持mp3 .AudiofileCreateWithurl返回狀態'fmt?'(kAudioConverterErr_FormatNotSupported),這就是爲什麼我想將它轉換爲wav。 –

+0

我的意思是使用'fwrite','write'或'NSFileHandle'方法將原始數據包寫入文件。 Apple不支持編碼mp3數據,原因是他們沒有指定,但是由於您已經有mp3數據,因此您不需要編碼器。他們支持對它進行解碼。 –