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

时间:2016-03-18 17:04:03

标签: ios swift audio avaudioplayer avaudiosession

我的应用播放视频,偶尔会有语言排队。当应用程序没有任何说法时,我希望音频(在背景中说来自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. 我从视频中删除了音轨,并尝试在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()
    
  2. 每次电影播放循环时,即使我没有设置AVAudioSession.sharedInstance().setActive(true)

    ,它也会强制背景音频变暗
    1. 制作我自己的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!
      
    2. 同样,一旦视频循环,它总是使背景音频变暗。我在点击播放按钮后尝试黑客攻击并进行restoreBackgroundAudio()通话,但我得到了一个不好的淡入淡出和进出效果,就像它试图恢复背景音频但活跃的视频播放器正在强制昏暗作为覆盖。

      如果您有任何建议我可以做些什么来实际静音播放的视频或播放不会使背景变暗的视频我会很感激。

2 个答案:

答案 0 :(得分:0)

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

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

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

您可以阅读有关AVAudioSession管理的here

答案 1 :(得分: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
}