我有一个项目的反应-本机,我正在使用反应本地视频库提供视频在我的应用程序。我在应用程序中有很多视频组件,但它们必须有不同的AVAudioSession类别和选项。但当我第一次将类别和选项设置为AVAudioSession时,它适用于我应用程序中的每个视频实体。
配置音频的代码如下:
- (void)configureAudio
{
AVAudioSession *session = [AVAudioSession sharedInstance];
AVAudioSessionCategory category = nil;
AVAudioSessionCategoryOptions options = nil;
if([_ignoreSilentSwitch isEqualToString:@"ignore"]) {
category = AVAudioSessionCategoryPlayback;
} else if([_ignoreSilentSwitch isEqualToString:@"obey"]) {
category = AVAudioSessionCategoryAmbient;
}
if([_mixWithOthers isEqualToString:@"mix"]) {
options = AVAudioSessionCategoryOptionMixWithOthers;
} else if([_mixWithOthers isEqualToString:@"duck"]) {
options = AVAudioSessionCategoryOptionDuckOthers;
}
if (category != nil && options != nil) {
[session setCategory:category withOptions:options error:nil];
} else if (category != nil && options == nil) {
[session setCategory:category error:nil];
} else if (category == nil && options != nil) {
[session setCategory:session.category withOptions:options error:nil];
}
}调用此方法的代码:
- (void)setIgnoreSilentSwitch:(NSString *)ignoreSilentSwitch
{
_ignoreSilentSwitch = ignoreSilentSwitch;
[self configureAudio];
[self applyModifiers];
}
- (void)setPaused:(BOOL)paused
{
if (paused) {
[_player pause];
[_player setRate:0.0];
} else {
[self configureAudio];
if (@available(iOS 10.0, *) && !_automaticallyWaitsToMinimizeStalling) {
[_player playImmediatelyAtRate:_rate];
} else {
[_player play];
[_player setRate:_rate];
}
[_player setRate:_rate];
}
_paused = paused;
}当用户每次调用setIgnoreSilentSwitch('some‘)或setPaused(false)时,都必须更改配置,但它不会发生。
发布于 2022-09-08 02:30:19
在应用程序中使用多个AVAudioSession似乎是不可能的。我通过单元测试证实了这一点。
class ASession: AVAudioSession {
private static let instance = ASession()
override class func sharedInstance() -> AVAudioSession { instance }
override var category: AVAudioSession.Category { .playAndRecord }
override var categoryOptions: AVAudioSession.CategoryOptions { [.duckOthers, .allowBluetooth] }
}
class BSession: AVAudioSession {
private static let instance = BSession()
override class func sharedInstance() -> AVAudioSession { instance }
override var category: AVAudioSession.Category { .playback }
override var categoryOptions: AVAudioSession.CategoryOptions { [.defaultToSpeaker, .duckOthers] }
}
class AVAudioSessionTests: XCTestCase {
func tesIftMultipleAudioSessionsAvailable() {
XCTAssertEqual(ASession.sharedInstance().category, .playAndRecord) // Passed
XCTAssertEqual(ASession.sharedInstance().categoryOptions, [.mixWithOthers, .duckOthers, .allowBluetooth]) // Passed
// XCTAssertEqual failed: ("AVAudioSessionCategory(_rawValue: AVAudioSessionCategoryPlayAndRecord)") is not equal to ("AVAudioSessionCategory(_rawValue: AVAudioSessionCategoryPlayback)")
XCTAssertEqual(BSession.sharedInstance().category, .playback)
// XCTAssertEqual failed: ("AVAudioSessionCategoryOptions(rawValue: 7)") is not equal to ("AVAudioSessionCategoryOptions(rawValue: 11)")
XCTAssertEqual(BSession.sharedInstance().categoryOptions, [.defaultToSpeaker, .mixWithOthers, .duckOthers])
}
}另外,我在另一个问题中提到,“在iOS中运行的每个应用程序都有一个音频会话”。在答案中提到的苹果文档中,我再也找不到相同的句子了,但它可能就在那里,功能本身到今天还没有改变。
https://stackoverflow.com/questions/72908056
复制相似问题