我正在使用在線廣播應用程序我設法使用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問題的任何幫助,非常感謝可以得到我的手在這個話題上,我也密切關注蘋果轉換文件的例子,但我不知道我是什麼想法 預先感謝您的任何幫助
我想寫給mp3,但由於版權問題蘋果不支持mp3 .AudiofileCreateWithurl返回狀態'fmt?'(kAudioConverterErr_FormatNotSupported),這就是爲什麼我想將它轉換爲wav。 –
我的意思是使用'fwrite','write'或'NSFileHandle'方法將原始數據包寫入文件。 Apple不支持編碼mp3數據,原因是他們沒有指定,但是由於您已經有mp3數據,因此您不需要編碼器。他們支持對它進行解碼。 –