iOS播放无音频会话视频

z9zf31ra  于 2023-03-20  发布在  iOS
关注(0)|答案(4)|浏览(186)

我尝试使用MPMoviePlayerControllerAVPlayer在我的应用中播放短视频。问题是(因为我的视频没有任何声音),我不想干扰其他应用在后台播放的声音。我尝试使用AVAudioSession播放:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryAmbient  withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
[audioSession setActive:YES error:nil];

但我没有运气。视频一开始播放,背景音乐就停止了。我甚至试图将音频会话设置为非活动:

[[AVAudioSession sharedInstance] setActive:NO withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];

但在这种情况下,声音停止半秒钟,然后恢复,视频播放器停止播放。有没有什么方法可以实现我正在努力做的事情?谢谢。

rsaldnfx

rsaldnfx1#

我想这对你来说已经无关紧要了,但对其他人来说可能是相关的。
没什么可做的,但这里有一些变通方法。关键是,当你初始化视频播放器时,将音频会话类别设置为环境,在这种情况下,它不会中断其他应用程序中的音频会话。然后,如果你需要“取消静音”视频,您可以将音频会话类别设置为默认(独奏环境)。它将中断其他应用程序中的音频会话,并将恢复播放带有声音的视频。
示例:

- (void)initPlayer {

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:0 error:nil];

    // some init logic
    // e.g:
    //
    // _playerItem = [AVPlayerItem playerItemWithAsset:[AVAsset assetWithURL:_URL]];
    // _player = [AVPlayer playerWithPlayerItem:_playerItem];
    // _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
    //
    // etc.

}

- (void)setMuted:(BOOL)muted {
    if (!muted) {
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient withOptions:0 error:nil];
    }

    self.player.muted = muted;
}

另外,我想FB应用程序也在做类似的事情:当视频开始播放静音,它不会中断其他应用程序的音频,但当用户按下视频,它会全屏与声音,在这一点上将有该视频的活动音频会话,所有其他应用程序将停止播放音频。

eoxn13cs

eoxn13cs2#

你在测试你的音乐bkg应用吗?如果没有,那么答案可能是大多数音乐应用都包含:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleAudioSessionInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:aSession];

和实施方式,例如:

- (void) handleAudioSessionInterruption:(NSNotification*)notification
{
    NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey];
   .....code....

    switch (interruptionType.unsignedIntegerValue) {
        case AVAudioSessionInterruptionTypeBegan:{
            // stop playing
        } break;
        case AVAudioSessionInterruptionTypeEnded:{
            // continue playing
        } break;
        default:
            break;
    }
}

因此,他们停止播放,并开始它时,中断结束。(来电等)

dwbf0jvd

dwbf0jvd3#

设置共享AVAudioSession的类别时,有一个“与其他人混合”选项:

try? AVAudioSession.sharedInstance().setCategory(.ambient,
                                                 mode: .moviePlayback,
                                                 options: [.mixWithOthers])

默认值为AVAudioSession.Category.soloAmbient,这说明了如何关闭其他应用的音频。

5vf7fwbs

5vf7fwbs4#

伟大的答案!这是一个斯威夫特5转换为那些感兴趣的。

try? AVAudioSession.sharedInstance().setCategory(.ambient)

相关问题