我在创建上述格式的描述时遇到了问题,并尝试了很多方法,但在尝试录制时仍然无法获得无效的参数。
有没有人有一个如何创建这种格式的例子?
var audioFileOutputDescription : AudioStreamBasicDescription = AEAudioStreamBasicDescriptionNonInterleaved16BitStereo
audioFileOutputDescription.mFormatID = kAudioFormatLinearPCM
audioFileOutputDescription.mSampleRate = 16000.0
audioFileOutputDescription.mBitsPerChannel = 16
audioFileOutputDescription.mChannelsPerFrame = 1
audioFileOutputDescription.mFramesPerPacket = 1
audioFileOutputDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian
感谢。
答案 0 :(得分:1)
您声明AEAudioStreamBasicDescriptionNonInterleaved16BitStereo用于2个通道,然后设置mChannelsPerFrame = 1,这适用于1个通道。渠道数量的冲突可能是问题所在。
如果这不是问题,那么调试它的一种方法是从一个工作asbd(从Apple的一个示例应用程序或指南)开始,然后一次更改一件事以找到不支持的参数或参数组合。
此外,WAV文件是小端。
答案 1 :(得分:0)
我没有在任何地方看到mBytesPerPacket或mBytesPerFrame设置。
audioFileOutputDescription.mBytesPerFrame = 2; // 1 mono channel * 2 bytes per channel
答案 2 :(得分:0)
您可能需要添加转换音频设备,因为我发现音频设备不支持ASBD内所有可能的变化。
输入 - >转换器AU - >做你的魔术AU - > convertback AU - >输出
我认为音频单元最大的困难之一是ASBD,每种音频单元类型只支持多种格式,正如@ hotpaw2所示,更改一个参数和测试有时是唯一的方法问题的根源。我还发现将音频单元分成小型单独的音频单元,以完成单个任务,因为它们变得轻量级并且可以在将来重复使用。
答案 3 :(得分:0)
对我来说很好:
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;