0

我必须在不使用非标准编解码器的 iPhone 上录制将在 Windows Media Player 上播放的音频;也就是说,不使用尚未随 WMP 提供的编解码器。(公司要求。)音频必须以 base-64 格式传输到服务器,因此我需要将音频尺寸尽可能小。即使在 8Kb 的录制频率下,AIFF 文件也会占用大量空间。我似乎找不到 WMP 会吞下的压缩 AIFF 格式。

4

2 回答 2

2

最好的办法是编写具有 ulaw 或 alaw 压缩的 WAV 文件(mFormatId您的AudioStreamBasicDescription将是kAudioFormatULawkAudioFormatALaw. 测试以查看哪个为您的应用程序提供最小的文件大小。

下面是一些设置 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"));

AQRrecorder.mm:192

SetupAudioFormat(kAudioFormatULaw);

AQRrecorder.mm:215

XThrowIfError(AudioFileCreateWithURL(url, kAudioFileWAVEType, &mRecordFormat, kAudioFileFlags_EraseFile,
                                      &mRecordFile), "AudioFileCreateWithURL failed");
于 2009-11-06T16:48:27.810 回答
0

尽管自上次发布以来已经有很长时间了,但我找到了 user196004 无法保存到临时文件夹以外的文件夹的问题的答案。

AudioFileCreateWithURL 将 CFURLRef 作为输入。如果 url 是使用 CFURLCreateWithString 创建的,并且目标文件夹中有空格,则 url 的创建将失败(null)。

解决方案是转义字符串。

CFStringRef fileNameEscaped = CFURLCreateStringByAddingPercentEscapes(NULL, fileName, NULL, NULL, kCFStringEncodingUTF8);

于 2011-02-11T18:13:48.963 回答