c - 如何使用核心音频正确录制 16 位 LittleEndian 签名整数 PCM 格式的音频

标签 c audio core-audio pcm 16-bit

我知道有很多可能类似的问题,但我的问题非常特殊。 我对 CoreAudio 的使用相对较新。我在 Linux/C 中有一个功能齐全的应用程序,并使用 Alsa 库。我正在将其调整为 MacOS/C,但在获取必要的音频格式时遇到问题。 我按如下方式配置 AudioQueue:

AudioStreamBasicDescription recordFormat;
memset(&recordFormat, 0, sizeof(recordFormat));
recordFormat.mFormatID |= kAudioFormatLinearPCM;

recordFormat.mFormatFlags &= ~kLinearPCMFormatFlagsAreAllClear;
recordFormat.mFormatFlags &= ~kLinearPCMFormatFlagIsFloat;
recordFormat.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
recordFormat.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian;
recordFormat.mFormatFlags &= ~kLinearPCMFormatFlagIsNonInterleaved;
recordFormat.mFormatFlags |= kLinearPCMFormatFlagIsNonMixable;
recordFormat.mFormatFlags &= ~kLinearPCMFormatFlagIsPacked;

recordFormat.mChannelsPerFrame = 1;
recordFormat.mBitsPerChannel = 16;

recordFormat.mSampleRate = 44100;

但是我录制的音频有问题:

  • 频率似乎不太正确,因为当我打开 .pcm 文件大胆地加速了声音。

在阅读了《Mac 和 iOS 音频编程实践指南》并搜索了网络和所有我能找到的推荐读物之后,我没有找到任何原因说明所提供的代码不好。

这是我的第一篇文章,如果我没有遵守所有规则,我深表歉意。提前致谢。

最佳答案

如果声音编辑器以两倍的音高两倍的速度播放原始音频,那么它可能会尝试像立体声一样播放单声道文件。

关于c - 如何使用核心音频正确录制 16 位 LittleEndian 签名整数 PCM 格式的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49697922/

相关文章:

c - 如何将字符串的空格分隔子字符串作为c中函数的参数传递

python - 循环多个变量以应用 sound.Sound() Psychopy 函数

ios - 哪种方式更容易通过麦克风捕获音频,同时播放音频?像音频放大器

ios - 如何触发媒体服务重置

c - 在 C 中通过引用传递参数的替代解决方案

c - 插入到c中的动态二维数组

c - C 中的 JSON 响应格式

C++ - 将 DirectSound 或 XAudio2 与 EAX 一起使用

java - Java 中的控制剪辑音量 -> FloatControl Volume 不执行任何操作

ios - 是否可以使用 AVAssetReader 恢复立体声 channel 布局?