ios - 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
输入、客户端或输出的某些属性?
解决方案
如果您填写了 和 中的所有字段,则设置客户端数据格式dstFormat
成功clientFormat
:
dstFormat.mFormatFlags = 0;
dstFormat.mBytesPerFrame = 0;
dstFormat.mReserved = 0;
和
clientFormat.mReserved = 0;
推荐阅读
- r - 你如何比较 R 中的两个字符串?
- python - 使用 Python Openpyxl 和 For 循环连接 Excel 中的两个单元格
- python-3.x - 如何在 python 中将数据编码为 der?
- angular6 - 错误:没有名称的表单控件的值访问器:“答案”
- java - Java 不再适用于 Visual Studio Code
- python - 警告:带约束的 tensorflow 已弃用,将在未来版本中删除
- qbasic - 在 Qbasic 中,如何让我的厘米数显示到小数点后一位。73.53 而不是 73.53315
- python - 在 Python 中将 USB 视频捕获设备友好名称与 OpenCV 端口号相关联
- d3.js - 如何在箱线图 dc.js 中仅显示有限数量的记录
- r - 添加“哔”列