我必须在不使用非标准编解码器的iPhone Media Player上播放音频。也就是说,不使用尚未附带WMP的编解码器。 (公司要求。)音频必须以64位为基础到服务器,因此我需要尽可能小的音频大小。即使在8Kb的录制频率下,AIFF文件占用了大量的空间。我似乎无法找到WMP吞下的压缩AIFF格式。
答案 0 :(得分:2)
最好的办法是用ulaw或alaw压缩来编写WAV文件(mFormatId
的{{1}}为AudioStreamBasicDescription
或kAudioFormatULaw
。测试看哪一个给你适合您应用的最小文件大小。
这里有一些代码来设置一个ExtAudioFile实例来编写ulaw:
kAudioFormatALaw
希望有所帮助。
--- ADDED ---
以下是对SpeakHere示例代码的修改以获得ulaw压缩:
SpeakHereController.mm:116
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);
SpeakHereController.mm:158
recordFilePath = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"recordedFile.wav"];
AQRecorder.mm:192
recorder->startRecord(CFSTR("recordedFile.wav"));
AQRecorder.mm:215
SetupAudioFormat(kAudioFormatULaw);
答案 1 :(得分:0)
虽然自上一篇文章以来很长一段时间,我发现问题的答案是user196004无法保存到临时文件夹以外的文件夹。
AudioFileCreateWithURL将CFURLRef作为输入。如果使用CFURLCreateWithString创建url,并且目标文件夹中包含任何空格,则url的创建将失败(null)。
解决方案是逃避字符串。
CFStringRef fileNameEscaped = CFURLCreateStringByAddingPercentEscapes(NULL,fileName,NULL,NULL,kCFStringEncodingUTF8);