首页 > 解决方案 > iOS WAV 到 AAC ExtAudio 失败 OSStatus -50

问题描述

在一个函数中,我试图将用户提供的 WAV 文件转换为 AAC,但是在输出文件上设置客户端格式时,它以 -50 的 OSStatus 失败:

OSStatus status1, status2;

// Input file
NSURL *srcUrl = [NSURL URLWithString:srcPathParam];

ExtAudioFileRef srcFile;
status1 = ExtAudioFileOpenURL((__bridge CFURLRef)srcUrl, &srcFile);

if (status1 != 0) {
    NSLog(@"OSStatus: %d", (int)status1);
    NSLog(@"Failed while opening src file");
    ExtAudioFileDispose(srcFile);
    return false;
}

// Get the source format from the file
AudioStreamBasicDescription srcFormat;
UInt32 propertySize = sizeof(AudioStreamBasicDescription);
memset(&srcFormat, 0, propertySize);
status1 = ExtAudioFileGetProperty(srcFile, kExtAudioFileProperty_FileDataFormat, &propertySize, &srcFormat);

if (status1 != 0) {
    NSLog(@"OSStatus: %d", (int)status1);
    NSLog(@"Failed while getting file format property from src file");
    ExtAudioFileDispose(srcFile);
    return false;
}

// Output format
AudioStreamBasicDescription dstFormat;
dstFormat.mFormatID = kAudioFormatMPEG4AAC;
dstFormat.mBitsPerChannel = 0;
dstFormat.mChannelsPerFrame = 2;
dstFormat.mFramesPerPacket = 1024;
dstFormat.mBytesPerPacket = 0;
dstFormat.mSampleRate = 44100;

// Output file
NSURL *dstUrl = [NSURL URLWithString:dstPathParam];

ExtAudioFileRef dstFile;
status1 = ExtAudioFileCreateWithURL((__bridge CFURLRef)dstUrl, kAudioFileAAC_ADTSType, &dstFormat, NULL, kAudioFileFlags_EraseFile, &dstFile);

if (status1 != 0) {
    NSLog(@"OSStatus: %d", (int)status1);
    NSLog(@"Failed while creating dst file");
    ExtAudioFileDispose(srcFile);
    ExtAudioFileDispose(dstFile);
    return false;
}

// Create the canonical PCM client format
AudioStreamBasicDescription clientFormat;
clientFormat.mFormatID = kAudioFormatLinearPCM;
clientFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger;
clientFormat.mBitsPerChannel = 16;
clientFormat.mChannelsPerFrame = 2;
clientFormat.mFramesPerPacket = 1;
clientFormat.mBytesPerFrame = 4;
clientFormat.mBytesPerPacket = 4;
clientFormat.mSampleRate = srcFormat.mSampleRate;

// Set client data
status1 = ExtAudioFileSetProperty(srcFile, kExtAudioFileProperty_ClientDataFormat, propertySize, &clientFormat);
status2 = ExtAudioFileSetProperty(dstFile, kExtAudioFileProperty_ClientDataFormat, propertySize, &clientFormat);

它上面的最后一行以 -50 失败,但正上方的行并没有失败。

ExtAudioFile.cpp:700:SetClientFormat: about to throw -50: create audio converter

这是一个有点模糊的错误,我不确定这表明什么是错误的,AudioStreamBasicDescription输入、客户端或输出的某些属性?

标签: iosobjective-ccore-audio

解决方案


如果您填写了 和 中的所有字段,则设置客户端数据格式dstFormat成功clientFormat

dstFormat.mFormatFlags = 0;
dstFormat.mBytesPerFrame = 0;
dstFormat.mReserved = 0;

clientFormat.mReserved = 0;

推荐阅读