ios - AudioQueue 以 8 KHz 录制,不每 20 毫秒调用一次回调
问题描述
iOS 10+ iPhone:5s & 6 Xcode:9+
我正在使用aLaw编解码器以8 KHz采样率录制音频,样本大小为8 bits。我像这样创建一个 AudioQueue:
// create the queue
XThrowIfError(AudioQueueNewInput(
&mRecordFormat,
MyInputBufferHandler,
this /* userData */,
NULL /* run loop */,
kCFRunLoopCommonModes /* run loop mode */,
0 /* flags */,
&mQueue), "AudioQueueNewInput failed");
MyInputBufferHandler 是每次填充缓冲区(每 20 毫秒 160 个字节)时调用的回调。所以我希望每 20 ms调用一次回调。但是在测试它时,每 128 毫秒,MyInputBufferHandler 回调会被调用 6 次。虽然我希望每 20 毫秒调用一次回调。我的录音配置是:
mRecordFormat.mSampleRate = 8000.0; // 8 KHz
mRecordFormat.mChannelsPerFrame = 1;
mRecordFormat.mBytesPerFrame = 1;
mRecordFormat.mBitsPerChannel = 8;
mRecordFormat.mBytesPerPacket = 1;
mRecordFormat.mFramesPerPacket = 1;
有人可以帮我吗?为什么每 128 毫秒而不是 20 毫秒调用一次 MyInputBufferHandler?8 KHz 的采样率和 160 字节的记录缓冲区,意味着每 20 毫秒调用一次 MyInputBufferHandler 而不是每 128 毫秒!
解决方案
似乎 AudioQueue 位于 AudioUnit 之上,无论您在 AudioQueue 级别设置什么缓冲区大小,都无法控制内部缓冲区大小。所以默认情况下,内部缓冲区至少设置为 1024 字节。因此,如果您想要在 160 字节的记录数据后进行回调,则不会。
所以对于那些遇到同样问题的人,你需要使用 AudioUnit。
类似情况的链接: https ://stackoverflow.com/a/4597409/1012775 https://stackoverflow.com/a/6687050/1012775
推荐阅读
- session - 松树脚本 - 自定义会话突破问题
- sql - groupby 在 oracle sql 中检查每个日期
- flutter - 如何将英雄小部件动画到另一个页面中轮播的第一个元素?
- ios - 如何处理:App Store Connect Operation Error (ERROR ITMS-90744: "Unsupported Xcode or SDK Version.)
- r - 在完全按照说明进行操作时创建自己的包时出错
- python - 为什么我在 Python 中调用 C 函数时性能会下降?
- amazon-web-services - 我应该在 lambda 前面构建 API 网关还是直接调用它?
- r - 在 R 中加载 csv 文件
- javascript - 我将如何制作一个允许我在 Javascript 中切换对象可见性的变量
- flutter - 我可以在 Flutter 的应用中拥有两个 MaterialApp 小部件吗