AVPlayer 和 MPMoviePlayerController 无法静音---强制背景音频调光



我的应用播放视频,偶尔会出现口头队列。当应用程序没有说任何内容时,我希望音频(在后台说来自Spotify或iTunes)恢复到最大音量。当有音频时,我希望音频变暗。

我已将音频会话设置为 DuckOthers .

问题是,每当我恢复背景音频时:

class func restoreBackgroundAudio()
{
    do {
        try AVAudioSession.sharedInstance().setActive(false)
    } catch _ {
        print("ERROR restoring background audio")
    }
}

我收到此错误:

[0x1a03a9000] AVAudioSession.mm:697: -[AVAudioSession setActive:withOptions:error:]:停用具有 运行 I/O。在停用之前,应停止或暂停所有 I/O 音频会话。

问题是正在播放的视频文件似乎具有我无法静音的音频。

我尝试了以下方法:

  1. 我从视频中删除了音轨,并尝试在MPMoviePlayer控制器中播放它

    _movie                                = MPMoviePlayerController()
    _movie.controlStyle                   = MPMovieControlStyle.None
    _movie.view.frame                     = _movieView.frame
    _movie.repeatMode                     = MPMovieRepeatMode.One
    _movie.backgroundView.backgroundColor = UIColor.whiteColor()
    _movie.contentURL = NSURL(fileURLWithPath: documentsDirectory.stringByAppendingString("/(videoName)"))
     _movie.play()
    

每次电影循环播放时,即使我没有设置AVAudioSession.sharedInstance().setActive(true),它也会强制背景音频变暗

  1. 制作我自己的AVPlayerItem和AVPlayer,并手动静音AVPlayer中的音轨以及将AVPlayer设置为静音:

        var asset = AVURLAsset(URL: _movieURL)
        var audioTracks = asset.tracksWithMediaType(AVMediaTypeAudio)
        // Set the volume of ANY potential audio track to 0
        var allAudioParams:[AVMutableAudioMixInputParameters] = []
        for track:AVAssetTrack in audioTracks
        {
            var audioInputParams = AVMutableAudioMixInputParameters()
            audioInputParams.setVolume(0.0, atTime: kCMTimeZero)
            audioInputParams.trackID = track.trackID
            allAudioParams.append(audioInputParams)
        }
        var muteTrack = AVMutableAudioMix()
        muteTrack.inputParameters = allAudioParams
        var item:AVPlayerItem = AVPlayerItem(URL: _movieURL)
        // Assign the muted audio track
        item.audioMix = muteTrack
        _avPlayer = AVPlayer(playerItem: item)
        // Also set the AVPlayer to be muted
        _avPlayer.muted = true
        let playerLayer = AVPlayerLayer(player: _avPlayer)
        playerLayer.frame = _movie.view.frame
        layer.addSublayer(playerLayer)
        _avPlayer.play() // ALWAYS DIMS BACKGROUND AUDIO!
    

同样,一旦视频循环播放,它总是会使背景音频变暗。我尝试破解它并在按下播放按钮后立即进行restoreBackgroundAudio()调用,但我得到了一个糟糕的淡入淡出效果,就像它试图恢复背景音频一样,但活动视频播放器正在强制变暗作为覆盖。

如果您对我还能做些什么来实际静音正在播放的视频或播放不会使背景变暗的视频有任何建议,我将不胜感激。

我知道

主要问题是,当AVPlayer播放视频时,即使它被静音,它也会停止来自其他应用程序的背景音乐。

这是 AVAudioSession 管理器的默认行为。我不明白的是,为什么AVAudioSession管理器即使没有声音输出(AVPlayer被静音),也会"杀死"背景音乐。这种行为对我来说也是个问题。

这是我在这种情况下的建议。

在这里,您可以阅读有关AVAudio会话管理的信息。

您需要使用它来允许将您的应用程序音频与其他应用程序音频混合:

NSError *silentSwitcherror = nil;
BOOL silentSwitchSuccess = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&silentSwitcherror];
if (silentSwitchSuccess) {
//insert video player code here to play video
}
else
{
//insert video player code here to play video
}

最新更新