ios - 如何从流中获取音频以通过 iPhone 的普通(非扬声器)扬声器播放?

标签 ios objective-c opentok tokbox

我正在使用 OpenTok 为 iOS 开发语音和视频聊天应用程序。当我插入耳机时,视频流和纯音频流的音频可以正常工作。如果没有,它会通过扬声器播放。我该如何更改?

最佳答案

设置音频设备和音频总线

[OTAudioDeviceManager setAudioDevice:[[OTKBasicAudioDevice 分配] 初始化]];

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

- (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 协议(protocol)定义)设置音频设备要使用的音频总线(由 OTAudioBus 协议(protocol)定义)。音频设备使用此对象向 session 发送音频样本以及从 session 接收音频样本。该对象的实例在实现对象的生命周期内保留。发布者将访问 OTAudioBus 对象以获取音频样本。订阅者会将音频样本(来自订阅的流)发送到 OTAudioBus 对象。这是 [OTAudioDevice setAudioBus:] 方法的 OTKBasicAudioDevice 实现:

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

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

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

更多引用使用this .

关于ios - 如何从流中获取音频以通过 iPhone 的普通(非扬声器)扬声器播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48030678/

相关文章:

ios - AWSS3GetObjectRequest.ifModifiedSince 似乎不起作用

ios - 需要帮助以更好地了解Objective C中的MVC

objective-c - 整体亮度/ Gamma ?

objective-c - Xcode 的隐藏功能

javascript - Opentok视频捕捉

android - 错误 :(126, 13) 无法解析 : com. opentok.android :opentok-android-sdk:2. 9.+

ios - 如何将 YUV 帧(从 OTVideoFrame)转换为 CVPixelBuffer

ios - 使用具有网关保护的 JSON Webservice 时 IOS 无响应

ios - SpriteKit,如何将实时摄像机放置在后台

objective-c - 由于模拟器错误,回退到从 NSUserDefaults 加载访问 token