我使用ExtAudioFileRead函数将音频文件加载到内存.但我发现代码-50总是出错.这意味着我将错误的参数传递给函数.但我不知道哪一个是错误的参数.
音频文件的数据格式为alac,sampleRate 44100k,有2个通道.
我的代码如下所示:
ExtAudioFileRef recordFile;
OSStatus error = noErr;
error = ExtAudioFileOpenURL((CFURLRef)file, &recordFile);
checkError(error, "open file");
SInt64 frameCount;
UInt32 size = sizeof(frameCount);
error = ExtAudioFileGetProperty(recordFile, kExtAudioFileProperty_FileLengthFrames, &size, &frameCount);
checkError(error, "get frameTotlal");
soundStruct *sound = &_sound;
sound->frameCount = frameCount;
sound->isStereo = true;
sound->audioDataLeft = (SInt16 *)calloc(frameCount, sizeof(SInt16));
sound->audioDataRight = (SInt16 *)calloc(frameCount, sizeof(SInt16));
AudioStreamBasicDescription desc;
UInt32 descSize = sizeof(desc);
error = ExtAudioFileGetProperty(recordFile, kExtAudioFileProperty_FileDataFormat, &descSize, &desc);
[self printASBD:desc];
UInt32 channels = desc.mChannelsPerFrame;
error = ExtAudioFileSetProperty(recordFile, kExtAudioFileProperty_ClientDataFormat, sizeof(inFormat), &inFormat);
AudioBufferList *bufferList;
bufferList = …Run Code Online (Sandbox Code Playgroud) 我正在使用音频单元录制我们的声音.在我的回调函数中,我在AudioBufferList中获取数据.我必须将此缓冲区存储在一个文件中.
问题是; 当我尝试将缓冲区存储在.caf文件中时,应用程序崩溃了.下面是代码.
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagsCanonical;
audioFormat.mBytesPerPacket = 2;
audioFormat.mFramesPerPacket = 1;
audioFormat.mBytesPerFrame = 2;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mReserved = 0;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
if(![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory])
[[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:nil];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"audio.caf"];
if(![[NSFileManager defaultManager] fileExistsAtPath:path])
NSLog(@"file not exist.");
NSLog(@"Path : %@", path);
THIS->url = [NSURL fileURLWithPath:[path retain]];
err = ExtAudioFileCreateWithURL((CFURLRef)THIS->url, kAudioFileCAFType, …Run Code Online (Sandbox Code Playgroud) 我一直在使用ExtAudioFile服务,我想使用需要AudioFileID参数的AudioFile服务.此参数对应于ExtAudioFile Services中使用的ExtAudioFileRef.如何从ExtAudioFileRef类型转换为AudioFileID类型?
更新:我已经想出来并发布我的解决方案作为我自己的问题的答案(下面)
我正在尝试使用AAC格式的ExtAudioFileWrite将一个简单的音频样本缓冲区写入文件.
我已经使用下面的代码实现了这一点,将单声道缓冲区写入.wav文件 - 但是,我无法为立体声或AAC文件执行此操作,这是我想要做的.
这是我到目前为止所拥有的......
CFStringRef fPath;
fPath = CFStringCreateWithCString(kCFAllocatorDefault,
"/path/to/my/audiofile/audiofile.wav",
kCFStringEncodingMacRoman);
OSStatus err;
int mChannels = 1;
UInt32 totalFramesInFile = 100000;
Float32 *outputBuffer = (Float32 *)malloc(sizeof(Float32) * (totalFramesInFile*mChannels));
////////////// Set up Audio Buffer List ////////////
AudioBufferList outputData;
outputData.mNumberBuffers = 1;
outputData.mBuffers[0].mNumberChannels = mChannels;
outputData.mBuffers[0].mDataByteSize = 4 * totalFramesInFile * mChannels;
outputData.mBuffers[0].mData = outputBuffer;
Float32 audioFile[totalFramesInFile*mChannels];
for (int i = 0;i < totalFramesInFile*mChannels;i++)
{
audioFile[i] = ((Float32)(rand() % 100))/100.0;
audioFile[i] = audioFile[i]*0.2;
}
outputData.mBuffers[0].mData = &audioFile;
CFURLRef fileURL = …Run Code Online (Sandbox Code Playgroud) 我正在使用aubio来分析音频文件,但是当我尝试像这样使用 new_aubio_source 函数时:
let source = new_aubio_source(StringToUnsafeMutablePointerChar_t(url.absoluteString), 0, 512)
Run Code Online (Sandbox Code Playgroud)
我总是收到这些错误。
AUBIO ERROR: source_apple_audio: Failed opening file:///var/mobile/Containers/Data/Application/C11B42E5-02B5-4373-8302-0728B2CB2296/Documents/music.m4a, error in ExtAudioFileOpenURL ('wht?')
AUBIO ERROR: source_wavread: Failed opening file:///var/mobile/Containers/Data/Application/C11B42E5-02B5-4373-8302-0728B2CB2296/Documents/music.m4a (System error: No such file or directory)
AUBIO ERROR: source: failed creating aubio source with file:///var/mobile/Containers/Data/Application/C11B42E5-02B5-4373-8302-0728B2CB2296/Documents/music.m4a at samplerate 0 with hop_size 512
Run Code Online (Sandbox Code Playgroud)
我 100% 确定路径是正确的,但我无法找出这些错误发生的原因。我认为问题出在第一条错误消息(source_apple_audio)中。
source_apple_audio 在这里定义:
其中使用了这个函数:ExtAudioFileOpenURL,并得到了错误代码('wht?')
非常感谢您的帮助!
我写了自己的音频库.(傻,我知道,但我喜欢它.)现在,我正在用它来播放iOS上iPod库的立体声文件.它运行良好,但有时调用ExtAudioFileRead()的时间超过23毫秒.由于我的AudioUnits输出设置正在以44.1KHz播放音频,并且它要求每回调1024帧.我的代码+ ExtAudioFileRead()的响应时间不得超过23毫秒.
我很惊讶ExtAudioFileRead()太慢了.我正在做的事似乎很正常.我在想,必须有一些我没有做过的无证配置魔法.这是我的相关配置代码:
ExtAudioFileRef _extAudioFileRef;
OSStatus result;
result = ::ExtAudioFileOpenURL((__bridge CFURLRef)_url, &_extAudioFileRef);
AudioStreamBasicDescription format;
format.mBitsPerChannel = 8 * sizeof(float);
format.mBytesPerFrame = sizeof(float);
format.mBytesPerPacket = sizeof(float);
format.mChannelsPerFrame = channelCount;
format.mFormatFlags = kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;
format.mFormatID = kAudioFormatLinearPCM;
format.mFramesPerPacket = 1;
format.mSampleRate = framesPerSecond;
result = ::ExtAudioFileSetProperty(_extAudioFileRef,
kExtAudioFileProperty_ClientDataFormat,
sizeof(format),
&format);
Run Code Online (Sandbox Code Playgroud)
我没有设置_extAudioFileRef的任何其他属性.
我已经跟踪了这个问题.我只是调用ExtAudioFileRead()来调整时间,所以我知道这不是我的代码减慢了这个过程.它必须是配置问题,对吧?
非常感谢任何帮助甚至猜测!
干杯,克里斯托弗
extaudiofile ×6
ios ×6
core-audio ×2
iphone ×2
aubio ×1
audio ×1
audiounit ×1
c++ ×1
objective-c ×1
swift ×1
types ×1