用于16hz,16位单声道格式的AudioStreamBasicDescription作为WAV文件的示例

时间:2016-02-04 01:44:36

标签: ios core-audio audio-recording

我在创建上述格式的描述时遇到了问题,并尝试了很多方法,但在尝试录制时仍然无法获得无效的参数。

有没有人有一个如何创建这种格式的例子?

var audioFileOutputDescription : AudioStreamBasicDescription = AEAudioStreamBasicDescriptionNonInterleaved16BitStereo

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

感谢。

4 个答案:

答案 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;