我正在开发在线广播应用程序我设法使用AudioQueueServices播放来自Icecast服务器的流式mp3数据包,我正在努力实现录制功能。
由于流媒体采用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文件如果是这样我错过了什么?
如果我的方法有误,请告诉我你认为正确的任何其他方式。正确方向的推动对我来说绰绰有余
我很感激任何帮助,我已经阅读了每一个问题,我可以得到这个主题,我也仔细看了苹果转换文件的例子,但我无法弄清楚我的错误 在此先感谢您的任何帮助
答案 0 :(得分:0)
为什么不直接将原始mp3数据包写入文件?完全没有使用ExtAudioFile
。
它们将形成一个有效的mp3文件,并且比同等的wav文件小得多。