AudioStreamBasicDescription为wav设置的值

AudioStreamBasicDescription为wav设置的值

问题描述:

我想在iOS上播放一个简单的PCM文件,但无法将我的头包裹在AudioStreamBasicDescription,而此link未提供足够的信息。AudioStreamBasicDescription为wav设置的值

我从终端

afinfo BlameItOnTheNight.wav 
File:   BlameItOnTheNight.wav 
File type ID: WAVE 
Num Tracks:  1 
---- 
Data format:  2 ch, 44100 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed integer 
       no channel layout. 
estimated duration: 9.938141 sec 
audio bytes: 1753088 
audio packets: 438272 
bit rate: 1411200 bits per second 
packet size upper bound: 4 
maximum packet size: 4 
audio data file offset: 44 
optimized 
source bit depth: I16 
---- 

得到这个值,那么,我选择在代码

- (void)setupAudioFormat:(AudioStreamBasicDescription*)format 
{ 
    format->mSampleRate = 44100.0; 
    format->mFormatID = kAudioFormatLinearPCM; 
    format->mFramesPerPacket = 1; 
    format->mChannelsPerFrame = 2; 
    format->mBytesPerFrame = format->mChannelsPerFrame * sizeof(Float32); 
    format->mBytesPerPacket = format->mFramesPerPacket * format->mBytesPerFrame; 
    format->mBitsPerChannel = sizeof(Float32) * 8; 
    format->mReserved = 0; 
    format->mFormatFlags = kAudioFormatFlagIsSignedInteger | 
    kAudioFormatFlagsNativeEndian | 
    kAudioFormatFlagIsPacked; 
} 

值音频播放的真快。

什么是基于实际音频文件计算此值的正确方法?

当我改变了我的错误值。

error for object 0x7fba72c50db8: incorrect checksum for freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug 

然后最后我想通了,我AudioStreamBasicDescriptionbitsperchannel值是不正确也缓冲区大小是不够的。

所以首先我已经改变了值

- (void)setupAudioFormat:(AudioStreamBasicDescription*)format 
{ 
    format->mSampleRate = 44100.0; 
    format->mFormatID = kAudioFormatLinearPCM; 
    format->mFramesPerPacket = 1; //For uncompressed audio, the value is 1. For variable bit-rate formats, the value is a larger fixed number, such as 1024 for AAC 
    format->mChannelsPerFrame = 2; 
    format->mBytesPerFrame = format->mChannelsPerFrame * 2; 
    format->mBytesPerPacket = format->mFramesPerPacket * format->mBytesPerFrame; 
    format->mBitsPerChannel = 16; 
    format->mReserved = 0; 
    format->mFormatFlags = kAudioFormatFlagIsSignedInteger | 
    kAudioFormatFlagsNativeEndian | 
    kLinearPCMFormatFlagIsPacked; 
} 

然后当我分配缓冲区我增加了大小

// Allocate and prime playback buffers 
      playState.playing = true; 
      for (int i = 0; i < NUM_BUFFERS && playState.playing; i++) 
      { 
       AudioQueueAllocateBuffer(playState.queue, 32000, &playState.buffers[i]); 
       AudioOutputCallback(&playState, playState.queue, playState.buffers[i]); 
      } 

在它被设置为8000我的原代码,现在将其改为32000解决了这个问题。