2016-03-18 2 views
2

Мое приложение воспроизводит видео и иногда имеет словесные очереди. Когда в приложении ничего не говорится, я хочу, чтобы звук (в фоновом режиме сказал Spotify или iTunes) вернулся к полной громкости. Когда есть звук, я хочу, чтобы звук был тусклым.AVPlayer & MPMoviePlayerController не может быть отключен --- Forcing Background Audio Dim

Я установил аудиосоединение на DuckOthers.

Проблема, когда восстановить фоновый звук:

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

Я получаю эту ошибку:

[0x1a03a9000] AVAudioSession.mm:697: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

Проблема заключается в том, что видео файл, который играет, кажется, есть звук, Я не могу отключить звук.

Я попытался следующие:

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

Каждый раз, когда фильм играет свою кольцую заставляет фоновый звук уменьшаться, даже если я не устанавливаю 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! 
    

Опять же, как только видео петли это всегда приглушает фоновый звук , Я попытался взломать его и сделать вызов restoreBackgroundAudio() сразу после того, как я нажал кнопку воспроизведения, но у меня получилось плохое угасание и выключение и эффект, как при попытке восстановить фоновый звук, но активный видеопроигрыватель затушевывает как переопределения.

Если у вас есть предложения по поводу того, что еще я могу сделать, чтобы на самом деле отключить видео, которое воспроизводит или воспроизводить видео, которое не смущает фон, я был бы признателен.

+0

Вы можете не просто установить _avPlayer.volume = 0; это работает. – user3069232

+0

Это не действует.Даже при громкости 0 фонового звука dims – Aggressor

+0

Вы знаете, чтобы решить эту проблему, я хотел бы вернуться к основам. Внедряйте каждую из этих штук отдельно и установите регуляторы громкости; и затем попытайтесь объединить их снова. – user3069232

ответ

0

Я понимаю, что основная проблема заключается в том, что когда AVPlayer воспроизводит видео, даже если он отключен, он останавливает фоновую музыку из других приложений.

Это поведение менеджера AVAudioSession по умолчанию. Я не понимаю, почему менеджер AVAudioSession «убивает» фоновую музыку, даже если в действии нет выхода звука (AVPlayer отключен). Такое поведение также является проблемой для меня.

Here - это то, что я предлагаю сделать в этом случае.

И here вы можете прочитать об управлении AVAudioSession.

+0

Да, я пробовал это. Но вы не должны изменять тип аудиосеанса, его дизайн «установить и забыть». Когда вы пытаетесь это сделать (и я это сделал), вы получаете этот случайный длинный тусклый след, а затем неумеренный эффект. Структура распадается и не нравится, когда ее сеанс изменился «на лету». – Aggressor

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^