【问题标题】:Example of AudioStreamBasicDescription for 16hz, 16bit mono format as WAV file16hz、16bit 单声道格式为 WAV 文件的 AudioStreamBasicDescription 示例
【发布时间】:2016-02-04 01:44:36
【问题描述】:

我在为上述格式创建描述时遇到了问题,我尝试了很多方法,但在尝试记录时总是收到无效的参数。

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

var audioFileOutputDescription : AudioStreamBasicDescription = AEAudioStreamBasicDescriptionNonInterleaved16BitStereo

    audioFileOutputDescription.mFormatID = kAudioFormatLinearPCM
    audioFileOutputDescription.mSampleRate = 16000.0
    audioFileOutputDescription.mBitsPerChannel = 16
    audioFileOutputDescription.mChannelsPerFrame = 1
    audioFileOutputDescription.mFramesPerPacket = 1
    audioFileOutputDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger |
        kAudioFormatFlagsNativeEndian

谢谢。

【问题讨论】:

  • 你能给出你得到的具体错误和行吗?您的错误可能出在除 asbd 之外的其他地方。
  • 确定错误是:OSStatus 错误 -50 转换为:AVAudioSessionErrorCodeBadParam

标签: ios core-audio audio-recording


【解决方案1】:

您声明 AEAudioStreamBasicDescriptionNonInterleaved16BitStereo 用于 2 个通道,然后设置 mChannelsPerFrame = 1 用于 1 个通道。频道数量的冲突可能是问题所在。

如果这不是问题,一种调试方法是从工作的 asbd(来自 Apple 的示例应用程序或指南之一)开始,然后一次更改一件事以查找不受支持的参数或参数组合。

另外,WAV 文件是小端的。

【讨论】:

  • 这似乎也不起作用。而 IIRC ARM 设备默认为小端,因此 kAudioFormatFlagsNativeEndian 标志应该对 wav 文件有效。
  • 查看我的答案的补充。从更常见的 44.1 立体声 asbd 开始查找不支持的参数。
【解决方案2】:

我没有在任何地方看到 mBytesPerPacket 或 mBytesPerFrame 设置。

audioFileOutputDescription.mBytesPerFrame = 2;  // 1 mono channel * 2 bytes per channel

【讨论】:

  • 即使添加格式仍然无法正常工作。而且 Apple 的文档对参数应该是什么也不是很清楚。
【解决方案3】:

您可能需要添加转换音频单元,因为我发现音频单元不支持 ASBD 中所有可能的变体。

输入 -> 转换器 AU -> 做你的魔法 AU -> 转换回 AU -> 输出

我认为音频单元的最大困难之一是 ASBD,每种音频单元类型仅支持多种格式,正如@hotpaw2 所建议的那样,更改一个参数并进行测试有时是深入了解的唯一方法问题。我还发现将音频单元拆分成小的单个音频单元来完成一项任务效果很好,因为它们变得轻巧且可在未来重复使用。

【讨论】:

    【解决方案4】:

    对我来说很好用:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2015-04-05
      • 2011-06-07
      相关资源
      最近更新 更多