【问题标题】:Turn off audio playback of AVPlayer?关闭 AVPlayer 的音频播放?
【发布时间】:2015-10-28 00:02:23
【问题描述】:

我有一个带有 AVPlayerItem 的 AVPlayer。我想要的是关闭 AVPlayer 的音频播放。我只想播放视频。

有人可以帮助我吗?谢谢!

    self.avPlayerItem = [AVPlayerItem playerItemWithURL:self.videoUrl];
    self.avPlayer = [AVPlayer playerWithPlayerItem:self.avPlayerItem];
    [self.avPlayer play];
    self.avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;


    self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
    self.avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidPlayToEndTime:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:self.avPlayerItem];


    CGRect screenRect = [[UIScreen mainScreen] bounds];

    self.avPlayerLayer.frame = CGRectMake(0, 0, screenRect.size.width , screenRect.size.height );
    [self.view.layer insertSublayer:self.avPlayerLayer atIndex:0];

【问题讨论】:

    标签: ios objective-c iphone audio avplayer


    【解决方案1】:

    正如@Tung Fam 的回答所暗示的,您可以在您的应用程序中轻松地执行此操作以使视频静音-

    player.isMuted = true

    处理所有用例:

    您可以使用上面的代码静音运行视频,问题是,如果您只使用isMuted = true(比如说视频预览)它会起作用,但您的应用会“劫持”AVAudioSession操作系统,这意味着如果用户正在听音乐(spotify 或苹果音乐),他们的音乐会被打断。这是因为您的应用将默认设置为 AVAudioSessionAVAudioSessionCategorySoloAmbient,这意味着 您的应用将始终在开始播放视频、静音或静音后立即中断在后台运行的所有音频会话未静音。这可能不是一个非常令人愉悦的用户体验并导致混乱。

    您可能想要做的是,将您的视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户全屏观看您的应用视频时,任何背景音频都必须“暂停”或“中断”,本质上是您的应用接管了AVAudioSession。然后,一旦您播放完视频,让“中断”的背景音乐(例如:Spotify、Apple Music 等)继续播放。以下步骤准确实现了 Twitter 应用处理视频和背景音乐的方式-

    1. didFinishLaunchingWithOptions 方法中的 AppDelegate 中,确保您的应用不会中断任何背景音乐。现在,由于您的视频将以“静音”模式运行,您只需 mixWithOthers

        do{
         try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, options: [.mixWithOthers])
         try AVAudioSession.sharedInstance().setActive(true)
       }catch{//some meaningful exception handling}
      
    2. 当您的应用开始全屏播放视频(未静音/有声音)时,您现在必须中断所有背景音乐。为此,在您的player.play() 之前,您可以再次设置AVAudioSession,就像这样-

       do{
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
        }catch{//some meaningful exception handling}
      

    这基本上会暂停/中断任何正在进行的背景音频,让您的视频有声播放。

    1. 您的视频播放完毕后,您现在必须让AVAudioSession 知道它可以恢复任何被您中断的音频会话(例如 Spotify、Apple Music、地图导航说明等)。为此,一旦您的视频停止播放,您就可以执行此操作-

       do{
             try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, options: [.mixWithOthers])
             try AVAudioSession.sharedInstance().setActive(false, options: AVAudioSessionSetActiveOptions.notifyOthersOnDeactivation)
          }catch{//some meaningful exception handling}
      

    关于如何处理AVAudioSessionhere's 文档,还有很多可用的选项。 here 是 Apple 针对不同类型应用使用 AVAudioSession 的指南。


    这只是关于如何使用AVAudioSession 的一个非常基本的解释,但根据您应用程序的功能,可能需要使用 KVO、AppDelegate 方法(用于应用程序进入后台或进入前台等) ) 以适当地设置AVAudioSession。进一步需要注意的是,您确实需要使用AVAudioSession 上的所有选项,因为它可能无法按照您认为的方式工作,因此可能会变得有点累人。更需要注意的是,令人惊讶的是,除了 Apple 的文档和这里和那里的一些关于 SO 的问题外,我几乎没有在网上找到关于 AVAudioSession 的详细信息。底线是 - 如果您的应用程序处理音频/视频,那么强烈建议根据 Apple 的“Audio Guidelines By App Type”剧本适当处理AVAudioSession,也许不是在您启动应用程序时,但绝对是随着您的应用程序成熟并变得更加稳定。

    【讨论】:

    • 这个答案很好,谢谢:)
    • 这个 API 现在是 AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: [AVAudioSession.CategoryOptions.mixWithOthers])
    • 更改类别/选项后是否需要调用 setActive(true)?
    • mixWithOthers 只有一个问题 - 如果您使用它,它会禁用控制中心功能 :(。如果您启用 mixWithOthers,您将无法在控制中心的媒体播放器中显示您的信息。 ..
    【解决方案2】:

    AVPlayer 有选项

    @property (nonatomic, getter=isMuted) BOOL muted NS_AVAILABLE(10_7, 7_0);
    

    你可以写

    - (void) muteSound:(BOOL)mute
    {
        self.avPlayer.muted = mute;
    }
    

    随心所欲地使用它

    - (void) startPlayingVideo
    {
    
        [self muteSound:YES];
    
        //other code
    
    } 
    

    【讨论】:

    • 对于 swift 5 它只是: player.isMuted = true 之前调用 .play() ;)
    【解决方案3】:

    如果有人正在寻找 Swift 4

    player.isMuted = true // To mute the sound
    player.isMuted = false // To un-mute the sound
    

    旁注:将视频静音并不会重置视频声音以开始播放。它只是一种常识性静音功能。

    【讨论】:

    • 一个小问题 - 如果用户正在后台播放歌曲(Spotify 或 Apple Music 等),那么 AVPlayer 将接管原声并暂停正在后台播放的音乐
    • @Annjawn 很有趣。但我想知道。如果您在应用上播放声音,您希望其他声音在后面,还是应该暂停?
    • 它应该暂停,当您的应用视频停止时它应该再次恢复。查看 Twitter 的实现。
    • @Annjawn 检查过,是的,他们做得很好。你知道怎么做吗?还是您的意思是在这种情况下我们不应该使用 isMuted 属性?
    • 我很清楚如何实现它...(从 Twitter 工程师本人那里得到这个想法 :-))。我将很快发布带有代码的答案。
    【解决方案4】:

    您可以在 AppDelegate didFinishLaunchingWithOptions 中添加它。如果您不希望您的视频停止当前在其他应用上播放的声音(即使您的视频播放器设置为静音)

    func setAudioMix(){
        do{
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: [.mixWithOthers])
            try AVAudioSession.sharedInstance().setActive(true)
        }catch{
            print("something went wrong")
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可以通过在viewDidLoad() 中实现以下代码来使音频静音。

      AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[self myAssetURL] 
      options:nil];
      NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
      
      // Mute all the audio 
      tracksNSMutableArray *allAudioParams = [NSMutableArray array];
      
      for (AVAssetTrack *track in audioTracks) {    
      AVMutableAudioMixInputParameters *audioInputParams 
      =[AVMutableAudioMixInputParameters audioMixInputParameters];   
      
      [audioInputParams setVolume:0.0 atTime:kCMTimeZero];  
      
      [audioInputParams setTrackID:[track trackID]];    [allAudioParams 
      addObject:audioInputParams];}
      
      AVMutableAudioMix *audioZeroMix = 
      [AVMutableAudioMix audioMix];
      [audioZeroMix setInputParameters:allAudioParams];
      

      以下链接可能会对您有所帮助。

      1. https://goo.gl/WYJNUF
      2. https://goo.gl/epHNGs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 2018-02-20
        相关资源
        最近更新 更多