iPhone压缩音频格式将在Windows Media Player上播放

时间:2009-11-06 15:22:15

标签: iphone audio windows-media-player wmp

我必须在不使用非标准编解码器的iPhone Media Player上播放音频。也就是说,不使用尚未附带WMP的编解码器。 (公司要求。)音频必须以64位为基础到服务器,因此我需要尽可能小的音频大小。即使在8Kb的录制频率下,AIFF文件占用了大量的空间。我似乎无法找到WMP吞下的压缩AIFF格式。

2 个答案:

答案 0 :(得分:2)

最好的办法是用ulaw或alaw压缩来编写WAV文件(mFormatId的{​​{1}}为AudioStreamBasicDescriptionkAudioFormatULaw。测试看哪一个给你适合您应用的最小文件大小。

这里有一些代码来设置一个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);