如何通过iPhone的普通(非免提扬声器)扬声器播放流中的音频?

时间:2017-12-30 03:28:42

标签: ios objective-c opentok tokbox

我正在使用OpenTok为iOS制作语音和视频聊天应用。当我插入耳机时,可以找到视频流和仅音频流的音频。如果我没有,则通过扬声器播放。我该如何改变?

1 个答案:

答案 0 :(得分:2)

设置音频设备和音频总线

[OTAudioDeviceManager setAudioDevice:[[OTKBasicAudioDevice alloc] init]];

使用OpenTok iOS SDK中定义的OTAudioFormat类来定义自定义音频驱动程序使用的音频格式。 [OTKBasicAudioDevice init]方法创建OTAudioFormat类的实例,并设置音频格式的采样率和通道数:

- (id)init
{
    self = [super init];
    if (self) {
        self = [super init];
        if (self) {
            _otAudioFormat = [[OTAudioFormat alloc] init];
            _otAudioFormat.sampleRate = kSampleRate;
            _otAudioFormat.numChannels = 1;
        }

        // ...
    }
    return self;
}

init方法还设置了一些本地属性,用于报告设备是否正在捕获,捕获是否已初始化,是否正在渲染以及渲染是否已初始化:

_isDeviceCapturing = NO;
_isCaptureInitialized = NO;
_isDeviceRendering = NO;
_isRenderingInitialized = NO;

init方法还设置一个文件以将传入的音频保存到文件中。这仅仅是为了说明自定义音频驱动程序的音频渲染器的使用:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask,
                                                     YES);
NSString *path = [paths[0] stringByAppendingPathComponent:kOutputFileSampleName];

[[NSFileManager defaultManager] createFileAtPath:path
                                        contents:nil
                                      attributes:nil];
_outFile = [NSFileHandle fileHandleForReadingAtPath:path];

[OTKBasicAudioDevice setAudioBus:]方法(由OTAudioDevice协议定义)设置音频设备使用的音频总线(由OTAudioBus协议定义)。音频设备使用此对象向会话发送音频样本和从会话接收音频样本。该对象的实例在实现对象的生命周期中保留。发布者将访问OTAudioBus对象以获取音频样本。订阅者将(从订阅的流)发送音频样本到OTAudioBus对象。这是[OTAudioDevice setAudioBus:]方法的OTKBasicAudioDevice实现:

- (BOOL)setAudioBus:(id<OTAudioBus>)audioBus
{
    self.otAudioBus = audioBus;
    return YES;
}

[OTKBasicAudioDevice setAudioBus:]方法(由OTAudioDevice协议定义)方法设置音频呈现格式,即在init方法中创建的OTAudioFormat实例:

- (OTAudioFormat*)renderFormat
{
    return self.otAudioFormat;
}

更多参考使用this