iOS 使用 AudioQueueNewOutput 在左右声道输出声音

Posted

技术标签:

【中文标题】iOS 使用 AudioQueueNewOutput 在左右声道输出声音【英文标题】:iOS using AudioQueueNewOutput to output sound in both left and right channel 【发布时间】:2015-07-16 13:14:55 【问题描述】:

我正在开发一个显示罪波的应用程序。 我正在使用 AudioQueueNewOutput 输出单声道声音是可以的,但是当我来到立体声输出时,我不知道该怎么做。 我知道mChannelsPerFrame = 2 可以在左右声道中产生波形。

我也想知道左右声道发送字节的顺序是什么?第一个字节是左声道,第二个字节是右声道吗?

代码:

_audioFormat = new AudiostreamBasicDescription();

_audioFormat->mSampleRate = SAMPLE_RATE;    // 44100
_audioFormat->mFormatID = kAudioFormatLinearPCM;
_audioFormat->mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
_audioFormat->mFramesPerPacket = 1;
_audioFormat->mChannelsPerFrame = NUM_CHANNELS;     // 1
_audioFormat->mBitsPerChannel = BITS_PER_CHANNEL;   // 16
_audioFormat->mBytesPerPacket = BYTES_PER_FRAME;    // 2 
_audioFormat->mBytesPerFrame = BYTES_PER_FRAME;     // 2

_sineTableLength = _audioFormat.mSampleRate / SAMPLE_LIMIT_FACTOR; // 44100/100 = 441
_sineTable = new SInt16[_sineTableLength];
for(int i = 0; i < _sineTableLength; i++)
    
        // Transfer values between -1.0 and 1.0 to integer values between -sample max and sample max

        _sineTable[i] = (SInt16)(sin(i * 2 * M_PI / _sineTableLength) * 32767);
    

AudioQueueNewOutput (&_audioFormat,
                     playbackCallback,
                     (__bridge void *)(self),
                     nil,
                     nil,
                     0,
                     &_queueObject);

static void playbackCallback (void* inUserData,
                          AudioQueueRef inAudioQueue,
                          AudioQueueBufferRef   bufferReference)
  SInt16* sample = (SInt16*)bufferReference->mAudioData;
  // bufferSize 1024
  for(int i = 0; i < bufferSize; i += _audioFormat.mBytesPerFrame, sample++)
  
  // set value for *sample
  // 9ms sin wave and 4.5ms 0
  ...
  
  ...
  AudioQueueEnqueueBuffer(...)

【问题讨论】:

我只看到***.com/questions/12353033/…,我需要使用AudioUnitSetProperty吗? 【参考方案1】:

几天后,我找到了答案。

首先:AudioStreamBasicDescription 可以像this 一样设置;

然后:bufferSize1024 更改为 2048 ;

并且:SInt16 中的 SInt16* sample = (SInt16*)bufferReference-&gt;mAudioData; 全部更改为 SInt32。因为通道加倍,比特加倍;

最后:sample 中每 16 位包含左声道或右声道所需的数据,随便输入即可。

【讨论】:

以上是关于iOS 使用 AudioQueueNewOutput 在左右声道输出声音的主要内容,如果未能解决你的问题,请参考以下文章

[iOS] 在 ios10 中使用 imessage

使用 SmartFace.io 录制音频(Android - Ios)

iOS - 如何使用 branch.io 在 Appstore 中测试深度链接

IOS AlterView的使用(IOS8.0以前使用)

iOS归档使用

Agora.io - 如何使用 mediaPlayer 共享视频时间戳? - iOS