首页 文章

AVPlayer和MPMoviePlayerController无法静音 - 强制背景音频昏暗

提问于
浏览
2

我的应用播放视频,偶尔会有语言排队 . 当应用程序没有任何说法时,我希望音频(在背景中说来自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() 通话,但是我得到了一个不好的淡入淡出和进出效果,就像它试图恢复背景音频但活跃的视频播放器正在强迫昏暗作为一个覆盖 .

如果你有什么建议我可以做什么来实际静音播放的视频或播放不会使背景暗淡的视频我会很感激 .

2 回答

  • 0

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

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

    Here是我建议在这种情况下做的 .

    并且here您可以阅读有关AVAudioSession管理的信息 .

  • 0

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

    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
    }
    

相关问题