Audio Queue Interface可以处理40ms Audio Frame吗?

Posted

技术标签:

【中文标题】Audio Queue Interface可以处理40ms Audio Frame吗?【英文标题】:Audio Queue Interface can deal with 40ms Audio Frame? 【发布时间】:2013-02-25 11:20:51 【问题描述】:

我正在尝试以 40 毫秒的时间段录制音频。 如果“是”,那么我们如何实现呢?

谢谢。

【问题讨论】:

【参考方案1】:

是的,有可能,你需要相应地设置配置AudioQueue,

基本上AudioQueue Buffer的大小,必须设置为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

【讨论】:

嗨,Rohan,感谢您的回复,我已经相应地更改了项目,并且它正在我的最后工作。由于我是该领域的新手,我如何确保它以每个数据包 40 毫秒的音频帧工作?谢谢,普拉文 AudioQueue 框架,当入队缓冲区被填满时会抛出一个回调,所以最小间隔肯定是 40ms... 谢谢 Rohan,你能告诉我关于宏/定义,即 SAMPLING_RATE、kNumberRecordBuffers、BYTES_PER_PACKET 的每个数据包计算大约 40 毫秒音频帧的想法(公式) 在上述函数中只需传递 float secods = .04 @Naresh 在函数 AQRecorder::ComputeRecordBufferSize(const AudioStreamBasicDescription *format, float seconds) ,第二个参数应该是 .04

以上是关于Audio Queue Interface可以处理40ms Audio Frame吗?的主要内容,如果未能解决你的问题,请参考以下文章

IOS音频1:之采用四种方式播放音频文件AudioToolbox AVFoundation OpenAL AUDIO QUEUE

AVAssetReader 和 Audio Queue 流问题

如何使用插件audio_service颤动处理音频通知的onTap?

go interface衍生的插件化处理

手机端audio部分手机无法自动播放处理

audio标签兼容IE11