如何在iOS中调整音频平衡

时间:2017-11-06 02:14:23

标签: ios audio

在iOS系统设置中,要调整音量平衡,请转到设置>一般>可访问性。在这里,您可以调节左/右音量平衡或将音频设置为单声道。

但我们可以在我们的应用程序中使用我们的代码吗? objective-c或swift。

我的应用程序需要通过'Audio Unit'播放音频,视频和虚拟midi音频,并且我尝试了以下内容:

  1. 当我播放音频时,我可以在AVAudioPlayer中使用pan属性。这是工作。
  2. 当我用AVPlayer播放视频时,抱歉。这里没有AVPlayer的pan属性。我被拒绝如何实现这一点。
  3. 当我通过音频单元播放midi虚拟音频时。我在How to set pan in IOS Audio Unit Framework

    中找到了相关问题

    AudioUnitParameterValue panValue = -1; //几乎死了。可能的值介于-1和1之间 int result = AudioUnitSetParameter(mixerUnit,kMultiChannelMixerParam_Pan,kAudioUnitScope_Input,0,panValue,0); if(结果== 0) {    的NSLog( “成功”); }

  4. 我获得了成功结果,但右声道窃取有音频输出。

    所以我陷入了视频和midi虚拟音频部分。如何设置音频输出平移?对我的任何建议我很欣赏。

2 个答案:

答案 0 :(得分:0)

这个问题我也一样。 然后我使用了AudioToolbox库。 我找到了以下代码" AudioBalanceFade"但是我找不到如何将它描述为" UnsafePointer"参数在这里。 这段代码有效,但我找不到一个例子。也许你可以解决这个问题。 然后我很高兴你告诉我你是怎么做到的。 here Apple developer code Structure

抱歉我的英文!

答案 1 :(得分:0)

最后,我解决了这个问题。但这只是我的错。

首先,this answer是正确的。这对我来说不起作用,因为我错过了调音台音频单元。我只是将kMultiChannelMixerParam_Pan参数设置为kAudioUnitSubType_MIDISynth音乐设备。

因此,我需要创建一个混音器单元,并连接到我的Midi合成器单元。像这样的东西:

    // create output unit
    AudioComponentDescription cd;
    cd.componentType = kAudioUnitType_Output;
    cd.componentSubType =  kAudioUnitSubType_RemoteIO;
    cd.componentManufacturer = kAudioUnitManufacturer_Apple;
    cd.componentFlags = cd.componentFlagsMask = 0;
    
    err = AUGraphAddNode(_AUGraph, &cd, &_remoteIONode);
    [self checkError:err];
    
    // create midi synth music device unit
    cd.componentType = kAudioUnitType_MusicDevice;
    cd.componentSubType = kAudioUnitSubType_MIDISynth;//kAudioUnitSubType_Sampler;
    err = AUGraphAddNode(_AUGraph, &cd, &_midisynthNode);
    [self checkError:err];
    
    // create multi channel mixer unit
    cd.componentType = kAudioUnitType_Mixer;
    cd.componentSubType = kAudioUnitSubType_MultiChannelMixer;
    err = AUGraphAddNode(_AUGraph, &cd, &_stereoMixerNode);
    [self checkError:err];
    
    err = AUGraphOpen(_AUGraph);
    [self checkError:err];
    
    err = AUGraphNodeInfo(_AUGraph,
                          _midisynthNode,
                          NULL,
                          &_midiSynthUnit);
    [self checkError:err];
    
    err = AUGraphNodeInfo(_AUGraph, _stereoMixerNode, NULL, &_stereoMixerUnit);
    [self checkError:err];
    
    err = AUGraphNodeInfo(_AUGraph,
                          _remoteIONode,
                          NULL,
                          &_remoteIOUnit);
    [self checkError:err];
    
    // connect midi systh node to mixer node
    err = AUGraphConnectNodeInput(_AUGraph, _midisynthNode, 0, _stereoMixerNode, 0);
    [self checkError:err];
    
    // connect mixer node to output node
    err = AUGraphConnectNodeInput(_AUGraph, _stereoMixerNode, 0, _remoteIONode, 0);
    [self checkError:err];

最后,我们可以像这样设置平移:

- (void)setPanvalue:(float)value {
    AudioUnitParameterValue panValue = value;
    OSStatus result = AudioUnitSetParameter(self.stereoMixerUnit, kMultiChannelMixerParam_Pan, kAudioUnitScope_Output, 0, panValue, 0);
    [self checkError:result]; }