2013-02-25 139 views

回答

0

是,其可能的,你需要设置配置AudioQueue因此,

基本上AudioQueue缓冲区大小,具有40ms的进行设置,因此这将是左右,

int AQRecorder::ComputeRecordBufferSize(const AudioStreamBasicDescription *format, float seconds) 
{ 
    int packets, frames, bytes = 0; 
    try { 
     frames = (int)ceil(seconds * format->mSampleRate); 

     if (format->mBytesPerFrame > 0) 
      bytes = frames * format->mBytesPerFrame; 
     else { 
      UInt32 maxPacketSize; 
      if (format->mBytesPerPacket > 0) 
       maxPacketSize = format->mBytesPerPacket; // constant packet size 
      else { 
       UInt32 propertySize = sizeof(maxPacketSize); 
       XThrowIfError(AudioQueueGetProperty(mQueue, kAudioQueueProperty_MaximumOutputPacketSize, &maxPacketSize, 
                &propertySize), "couldn't get queue's maximum output packet size"); 
      } 
      if (format->mFramesPerPacket > 0) 
       packets = frames/format->mFramesPerPacket; 
      else 
       packets = frames; // worst-case scenario: 1 frame in a packet 
      if (packets == 0)  // sanity check 
       packets = 1; 
      bytes = packets * maxPacketSize; 
     } 
    } catch (CAXException e) { 
     char buf[256]; 
     return 0; 
    } 
    return bytes; 
} 

,并设置格式,

void AQRecorder::SetupAudioFormat(UInt32 inFormatID) 
{ 
    AudioStreamBasicDescription sRecordFormat; 
    FillOutASBDForLPCM (sRecordFormat, 
         SAMPLING_RATE, 
         1, 
         8*BYTES_PER_PACKET, 
         8*BYTES_PER_PACKET, 
         false, 
         false 
         ); 
    memset(&mRecordFormat, 0, sizeof(mRecordFormat)); 

    mRecordFormat.SetFrom(sRecordFormat); 
} 

我的情况,这些宏的值,

#define SAMPLING_RATE 16000 
#define kNumberRecordBuffers 3 
#define BYTES_PER_PACKET 2 
+0

嗨罗汉, 感谢您的答复, 我已经相应改变的项目,它的工作在我结束。由于我是这个领域的新手,我如何确保它在每个数据包40毫秒音频帧的工作? 感谢,Pravin – Pravin 2013-02-28 10:01:03

+0

AudioQueue框架,当入列的缓冲区被填满时抛出一个回调,所以最小的间隔时间肯定是40ms ... – Amitg2k12 2013-03-01 16:03:54

+0

感谢Rohan,你能给我一个想法(公式)每个数据包40ms音频帧计算关于宏/定义即SAMPLING_RATE,kNumberRecordBuffers,BYTES_PER_PACKET – Pravin 2013-03-13 11:30:12