音频流基本描述的示例,用于 16hz,16 位单声道格式作为 WAV 文件



我在为上述格式创建描述时遇到问题,并且尝试了很多事情,但在尝试录制时不断得到无效的参数。

没有人有关于如何创建这种格式的示例?

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;

最新更新