我必须在将在Windows Media Player上回放的iPhone上录制音频,不使用非标准编解码器;也就是说,不使用尚未随WMP一起提供的编解码器。(公司要求。)音频必须是base-64到服务器,所以我需要得到尽可能小的音频大小。即使在8Kb的记录频率下,AIFF文件也会占用极大的空间。我似乎找不到一个压缩的AIFF格式,WMP将吞下。
发布于 2009-11-07 00:48:28
最好的办法是写WAV文件,用ulaw或alaw压缩(你的AudioStreamBasicDescription
的mFormatId
应该是kAudioFormatULaw
或kAudioFormatALaw
。测试一下,看看哪一个为您的应用程序提供了最小的文件大小。
下面是设置ExtAudioFile实例以编写ulaw的一些代码:
NSArray * docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docDir = [docs objectAtIndex:0];
NSURL * outFile = [NSURL fileURLWithPath:[docDir stringByAppendingPathComponent:@"OutFile.wav"]];
AudioStreamBasicDescription asbd;
bzero(&asbd, sizeof(asbd));
asbd.mSampleRate = 11025; // or whatever
asbd.mFramesPerPacket = 1;
asbd.mChannelsPerFrame = 1;
asbd.mFormatID = kAudioFormatULaw; //or kAudioFormatALaw
ExtAudioFileRef theFile;
err = ExtAudioFileCreateWithURL((CFURLRef)outFile,
kAudioFileWAVEType,
&asbd,
0,
kAudioFileFlags_EraseFile,
&theFile);
希望这能有所帮助。
-添加
以下是对SpeakHere示例代码的修改,以获得ulaw压缩:
SpeakHereController.mm:116
recordFilePath = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"recordedFile.wav"];
SpeakHereController.mm:158
recorder->startRecord(CFSTR("recordedFile.wav"));
AQRecorder.mm:192
SetupAudioFormat(kAudioFormatULaw);
AQRecorder.mm:215
XThrowIfError(AudioFileCreateWithURL(url, kAudioFileWAVEType, &mRecordFormat, kAudioFileFlags_EraseFile,
&mRecordFile), "AudioFileCreateWithURL failed");
发布于 2011-02-12 02:13:49
虽然距离上一篇文章已经有很长时间了,但我发现问题的答案是user196004无法保存到临时文件夹以外的文件夹。
AudioFileCreateWithURL接受CFURLRef作为输入。如果url是使用CFURLCreateWithString创建的,并且目标文件夹中有空格,则url的创建将失败(null)。
解决方案是对字符串进行转义。
CFStringRef fileNameEscaped = CFURLCreateStringByAddingPercentEscapes( NULL,fileName,NULL,NULL,kCFStringEncodingUTF8 );
https://stackoverflow.com/questions/1688284
复制相似问题