Ios AVPlayer&;MPMoviePlayerController可以';t静音---强制背景音频变暗

Ios AVPlayer&;MPMoviePlayerController可以';t静音---强制背景音频变暗,ios,swift,audio,avaudioplayer,avaudiosession,Ios,Swift,Audio,Avaudioplayer,Avaudiosession,我的应用程序播放视频,偶尔会有口头队列。当应用程序什么也没说时,我希望音频(在后台,比如Spotify或iTunes)恢复到最大音量。当有音频时,我希望音频变暗 我已将音频会话设置为DuckOthers 问题是,每当我恢复背景音频时: class func restoreBackgroundAudio() { do { try AVAudioSession.sharedInstance().setActive(false) } catch _ {

我的应用程序播放视频,偶尔会有口头队列。当应用程序什么也没说时,我希望音频(在后台,比如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 音频会话

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

我尝试了以下方法:

  • 我从视频中删除了音频曲目,并尝试在MPMoviePlayerController中播放

    _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)

  • 制作我自己的AVPlayerItem和AVPlayer,手动静音AVPlayerItem内的音频曲目,并将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 manager的默认行为。我不明白的是,为什么AVaudioSessionManager在没有声音输出的情况下“杀死”背景音乐(AVPlayer是静音的)。这种行为对我来说也是个问题

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


    您还可以阅读有关AVAudioSession management的内容。

    您需要使用此功能将您的应用程序音频与其他应用程序音频混合:

    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
    }
    

    你不能简单地将_avPlayer.volume设置为0;行得通,没效果。即使是在第0卷背景音频DIMSY你知道,要解决这个问题,我会回到基础。分别执行这些操作,并设置音量控制;然后再尝试合并它们。我已经尝试了所有这些,我发布这个问题是希望有人能有一个更技术性的解决方案。MPVolumeView可能是答案:我经常发现自己实际上没有记录一个SO问题,因为当我输入它时;我总是在发帖前检查它的建议;不管怎样,我现在知道了。看看这个;我知道它很老了,但是的,我试过了。但你并不打算改变音频会话类型,它是一种“设置并忘记”的设计。当你尝试这样做的时候(我也这么做了),你会得到这个随机的长昏暗,然后是undim效果。该框架突然出现问题,不喜欢动态更改其会话。