jjzjj

ios - AVPlayer 和 MPMoviePlayerController 不能被静音 --- 强制背景音频变暗

coder 2024-01-30 原文

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

我已将 Audio Session 设置为 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() 调用,但我得到了一个糟糕的淡入淡出效果,就像它试图恢复背景音频一样,但是活跃的视频播放器强制调暗作为覆盖。

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

最佳答案

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

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

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

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

关于ios - AVPlayer 和 MPMoviePlayerController 不能被静音 --- 强制背景音频变暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36090251/

有关ios - AVPlayer 和 MPMoviePlayerController 不能被静音 --- 强制背景音频变暗的更多相关文章

  1. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  2. ruby-on-rails - 使用 Rmagick 或 ImageMagick 在背景上放置标题 - 2

    我有一张背景图片,我想在其中添加一个文本框。我想弄清楚如何将标题放置在其顶部的正确位置。(我使用标题是因为我需要自动换行功能)。现在,我只能让文本显示在左上角,但我需要能够手动定位它的开始位置。require'RMagick'require'Pry'includeMagicktext="Loremipsumdolorsitamet"img=ImageList.new('template001.jpg')img 最佳答案 这是使用convert的ImageMagick命令行的答案。如果你想在Rmagick中使用这个方法,你必须自己移植

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - Ruby rand() 不能接受变量? - 2

    我对此有点困惑。我在RoR项目中的最终目标是从我的数据库中获取单个随机配置文件。我想它应该是这样的:@profile=Profile.find_by_user_id(rand(User.count))它一直抛出错误,因为user_id0不存在,所以我把它的一部分拿出来检查发生了什么:@r=rand(User.count)每次都返回0。发生什么了?我注册了5个假用户和5个相关配置文件来测试这个。如果我将Profile.find_by_user_id(rand(User.count))重写为Profile.find_by_user_id(3)它工作得很好。User.count也在工作。所以

  8. ruby - 为什么我不能从 ruby​​ 中的选定键创建新的散列? - 2

    这个问题困扰了我一段时间。这不是一件困难的事情,但我不知道为什么没有简单的方法来做到这一点,我敢打赌有但我没有看到。我只想取一个散列,像这样:cars={:bob=>'Pontiac',:fred=>'Chrysler',:lisa=>'Cadillac',:mary=>'Jaguar'}然后做类似的事情cars[:bob,:lisa]得到{:bob=>'Pontiac',:lisa=>'Cadillac'}我这样做了,效果很好:classHashdefpick(*keys)Hash[select{|k,v|keys.include?(k)}]endendruby-1.8.7-p249

  9. ruby-on-rails - 为什么 Rails 可以使用 `if` 作为哈希键但在 Ruby 中不能 - 2

    在纯Rubyirb中,不能输入{if:1}。该语句不会终止,因为irb认为if不是符号,而是if语句的开始。那么为什么Rails可以有before_filter接受if作为参数?该指南的代码如下:classOrderunless也会发生同样的事情。 最佳答案 这是一个irb问题,而不是Ruby。bash=>ruby-e"puts({if:1})"bash=#{:if=>1}您可以改用pry。它将正确读取输入。https://github.com/pry/pry 关于ruby-on-rai

  10. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

随机推荐