我在为上述格式创建描述时遇到问题,并且尝试了很多事情,但在尝试录制时不断得到无效的参数。
有没有人有关于如何创建这种格式的示例?
var audioFileOutputDescription : AudioStreamBasicDescription = AEAudioStreamBasicDescriptionNonInterleaved16BitStereo
audioFileOutputDescription.mFormatID = kAudioFormatLinearPCM
audioFileOutputDescription.mSampleRate = 16000.0
audioFileOutputDescription.mBitsPerChannel = 16
audioFileOutputDescription.mChannelsPerFrame = 1
audioFileOutputDescription.mFramesPerPacket = 1
audioFileOutputDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian
谢谢。
你声明AEAudioStreamBasicDescriptionNonInterleaved16BitStereo,这是2个通道,然后设置mChannelsPerFrame = 1,这是1个通道。 频道数量的冲突可能是问题所在。
如果这不是问题所在,调试此问题的一种方法是从工作的asbd(来自Apple的示例应用程序或指南之一)开始,然后一次更改一件事以查找不受支持的参数或参数组合。
此外,WAV 文件是小端序。
我没有看到mBytesPerPacket或mBytesPerFrame在任何地方设置。
audioFileOutputDescription.mBytesPerFrame = 2; // 1 mono channel * 2 bytes per channel
添加一个转换音频单元,因为我发现音频单元不支持 ASBD 中的所有变体。
输入 ->转换器 AU -> 做你的魔术 AU -> 转换回 AU -> 输出
我认为音频单元的最大困难之一是ASBD,每种音频单元类型仅支持多种格式,正如@hotpaw2所建议的那样,更改一个参数和测试有时是解决问题的唯一方法。我还发现将音频单元拆分为小的单个音频单元以完成单个任务效果很好,因为它们变得轻巧并且可以在未来重复使用。
效果很好:
fmt.mFormatID = kAudioFormatLinearPCM; // 2
fmt.mSampleRate = 8000.0; // 3
fmt.mChannelsPerFrame = 1; // 4
fmt.mBitsPerChannel = 16; // 5
fmt.mChannelsPerFrame = 1;
fmt.mFramesPerPacket = 1;
fmt.mBytesPerFrame = 2;
fmt.mBytesPerPacket = 2;
// 7
fmt.mFormatFlags = // 9
kLinearPCMFormatFlagIsBigEndian
| kLinearPCMFormatFlagIsSignedInteger
| kLinearPCMFormatFlagIsPacked;