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?')的主要内容,如果未能解决你的问题,请参考以下文章