gpt4 book ai didi

ios - 如何在 iPhone 设备上使用 AVAudioSessionCategoryMultiRoute?

转载 作者:可可西里 更新时间:2023-11-01 02:58:52 27 4
gpt4 key购买 nike

我想使用 AVAudioSessionCategoryMultiRoute,但遗憾的是在苹果开发中心和谷歌上都没有示例。如何使用/实现 AVAudioSessionCategoryMultiRoute 以便在 iPhone ios7.0.4 上定义 2 条不同的路由?我的目标是通过扬声器和耳机路由音频。 (我知道这在过去是不可能的,但我想尝试使用 ios7)

谢谢你的帮助,

最佳答案

这对我有帮助:AVAudioEngine and Multiroute ,还有这个:Audio Session and Multiroute Audio in iOS .

就我而言,我使用两种方法来实现:

首先,请求MultiRoute类

[_session setCategory:AVAudioSessionCategoryMultiRoute error:nil];

方法一:设置AVAudioPlayer的channelAssignments:

    // My hardware has 4 output channels
if (_outputPortChannels.count == 4) {
AVAudioSessionChannelDescription *desiredChannel1 = [_outputPortChannels objectAtIndex:2];
AVAudioSessionChannelDescription *desiredChannel2 = [_outputPortChannels objectAtIndex:3];

// Create an array of desired channels
NSArray *channelDescriptions = [NSArray arrayWithObjects:desiredChannel1, desiredChannel2, nil];

// Assign the channels
_avAudioPlayer1.channelAssignments = channelDescriptions;

NSLog(@"_player.channelAssignments: %@", _avAudioPlayer1.channelAssignments);

// Play audio to output channel3, channel4
[_avAudioPlayer1 play];
}

方法二:自定义 channel map

    // Get channel map indices based on user specified channelNames
NSMutableArray *channelMapIndices = [self getOutputChannelMapIndices:_inChannelNames];

NSAssert(channelMapIndices && channelMapIndices.count > 0, @"Error getting indices for user specified channel names!");

// AVAudioEngine setup
_engine = [[AVAudioEngine alloc] init];
_output = _engine.outputNode;
_mixer = _engine.mainMixerNode;
_player = [[AVAudioPlayerNode alloc] init];
[_engine attachNode:_player];

// open the file to play
NSString *path1 = [[NSBundle mainBundle] pathForResource:@"yujian" ofType:@"mp3"];
NSURL *songURL1 = [NSURL fileURLWithPath:path1];
_songFile = [[AVAudioFile alloc] initForReading:songURL1 error:nil];

// create output channel map
SInt32 source1NumChannels = (SInt32)_songFile.processingFormat.channelCount;

// I use constant map
// Play audio to output channel3, channel4
SInt32 outputChannelMap[4] = {-1, -1, 0, 1};

// This will play audio to output channel1, channel2
//SInt32 outputChannelMap[4] = {0, 1, -1, -1};

// set channel map on outputNode AU
UInt32 propSize = (UInt32)sizeof(outputChannelMap);
OSStatus err = AudioUnitSetProperty(_output.audioUnit, kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Global, 1, outputChannelMap, propSize);
NSAssert(noErr == err, @"Error setting channel map! %d", (int)err);

// make connections
AVAudioChannelLayout *channel1Layout = [[AVAudioChannelLayout alloc] initWithLayoutTag:kAudioChannelLayoutTag_DiscreteInOrder | (UInt32)source1NumChannels];
AVAudioFormat *format1 = [[AVAudioFormat alloc] initWithStreamDescription:_songFile.processingFormat.streamDescription channelLayout:channel1Layout];
[_engine connect:_player to:_mixer format:format1];
[_engine connect:_mixer to:_output format:format1];

// schedule the file on player
[_player scheduleFile:_songFile atTime:nil completionHandler:nil];

// start engine and player
if (!_engine.isRunning) {
[_engine startAndReturnError:nil];
}

[_player play];

它对我有用。

关于ios - 如何在 iPhone 设备上使用 AVAudioSessionCategoryMultiRoute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21832733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com