我必须在不使用非标准编解码器的 iPhone 上录制将在 Windows Media Player 上播放的音频;也就是说,不使用尚未随 WMP 提供的编解码器。(公司要求。)音频必须以 base-64 格式传输到服务器,因此我需要将音频尺寸尽可能小。即使在 8Kb 的录制频率下,AIFF 文件也会占用大量空间。我似乎找不到 WMP 会吞下的压缩 AIFF 格式。
2 回答
最好的办法是编写具有 ulaw 或 alaw 压缩的 WAV 文件(mFormatId
您的AudioStreamBasicDescription
将是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"));
AQRrecorder.mm:192
SetupAudioFormat(kAudioFormatULaw);
AQRrecorder.mm:215
XThrowIfError(AudioFileCreateWithURL(url, kAudioFileWAVEType, &mRecordFormat, kAudioFileFlags_EraseFile,
&mRecordFile), "AudioFileCreateWithURL failed");
尽管自上次发布以来已经有很长时间了,但我找到了 user196004 无法保存到临时文件夹以外的文件夹的问题的答案。
AudioFileCreateWithURL 将 CFURLRef 作为输入。如果 url 是使用 CFURLCreateWithString 创建的,并且目标文件夹中有空格,则 url 的创建将失败(null)。
解决方案是转义字符串。
CFStringRef fileNameEscaped = CFURLCreateStringByAddingPercentEscapes(NULL, fileName, NULL, NULL, kCFStringEncodingUTF8);