iOs ExtAudioFileCreateWithURL - 创建文件时出错('fmt?')

Posted

技术标签:

【中文标题】iOs ExtAudioFileCreateWithURL - 创建文件时出错(\'fmt?\')【英文标题】:iOs ExtAudioFileCreateWithURL - Getting error Creating file ('fmt?')iOs ExtAudioFileCreateWithURL - 创建文件时出错('fmt?') 【发布时间】:2012-11-01 05:39:42 【问题描述】:

您好,我一直在尝试从以下代码创建 wav 音频文件,但不断收到错误 Creating file ('fmt?')。有谁可以帮我离开这里吗 ?谢谢。

我的日志: *2012-11-01 13:33:14.183 Novocaine ios Example[7456:c07] URL: file://localhost/Users/pier/Library/Application%20Support/iPhone%20Simulator/6.0/Applications/01EBF2C0-2C3A-490D -835E-9C39A3E88E0B/Documents/testrecording.wav

错误:创建文件 ('fmt?')*

- (id)initWithAudioFileURL:(NSURL *)urlToAudioFile samplingRate:(float)thisSamplingRate numChannels:(UInt32)thisNumChannels

self = [super init];
if (self)


    // Zero-out our timer, so we know we're not using our callback yet
    self.callbackTimer = nil;


    // Open a reference to the audio file
    self.audioFileURL = urlToAudioFile;
    CFURLRef audioFileRef = (CFURLRef)self.audioFileURL;

    AudioStreamBasicDescription outputFileDesc; 

    // Set a few defaults and presets
    self.samplingRate = thisSamplingRate;
    self.numChannels = thisNumChannels;
    self.currentTime = 0.0;
    self.latency = .011609977; // 512 samples / ( 44100 samples / sec ) default

    outputFileDesc.mSampleRate = self.samplingRate;
    outputFileDesc.mFormatID = kAudioFormatLinearPCM;
    outputFileDesc.mFormatFlags = kAudioFormatFlagIsFloat;
    outputFileDesc.mBytesPerPacket = 4*self.numChannels;
    outputFileDesc.mFramesPerPacket = 1;
    outputFileDesc.mBytesPerFrame = 4*self.numChannels;
    outputFileDesc.mChannelsPerFrame = self.numChannels;
    outputFileDesc.mBitsPerChannel = 32;

    CheckError(ExtAudioFileCreateWithURL(audioFileRef, kAudioFileWAVEType, &outputFileDesc, NULL, kAudioFileFlags_EraseFile, &_outputFile), "Creating file");

。 . .

【问题讨论】:

【参考方案1】:

我不知道为什么,但我进行了以下更改并且它起作用了。 有人会认为 wav 文件的类型是 kAudioFileWAVType,不是吗? 有没有人愿意对此有所启发?

outputFileDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; //changed


CheckError(ExtAudioFileCreateWithURL(audioFileRef, kAudioFileCAFType, &outputFileDesc, NULL, kAudioFileFlags_EraseFile, &_outputFile), "Creating file"); //changed

【讨论】:

那不是wav文件,是caf文件。 wav 编辑器无法打开它。【参考方案2】:

不同寻常的是,ExtAudioFileCreateWithURL 的 WAV 文件实现要求明确设置 kAudioFormatFlagIsPacked 标志。

这是不寻常的,因为 kAudioFormatFlagIsPacked 文档声称该标志隐含在 OP 的情况下:

即使这个标志是明确的,如果 AudioStreamBasicDescription 被填写,则暗示这个标志被设置,使得字段具有以下关系: ((mBitsPerSample / 8) * mChannelsPerFrame) == mBytesPerFrame

这也很不寻常,因为其他格式,如 CAF,根本不在乎。

TL;DR 像这样设置格式标志将修复 kAudioFileUnsupportedDataFormatError = 'fmt?' 错误:

outputFileDesc.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;

【讨论】:

以上是关于iOs ExtAudioFileCreateWithURL - 创建文件时出错('fmt?')的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别