关闭AVPlayer的音频播放?

Turn off audio playback of AVPlayer?

我有一个带有 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];

A​​VPlayer 有选项

@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

} 

您可以通过在 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

如果有人正在寻找 Swift 4:

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

旁注:将视频静音不会重置视频声音以启动。它只是一个常识性静音功能。

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

player.isMuted = true

处理所有用例:

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

您可能想要做的是,将您的视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户全屏播放您应用的视频时,任何背景音频都必须“暂停”或“中断”,本质上是您的应用接管 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. 当您的应用程序开始全屏播放视频(un-muted/with 声音)时,您现在必须中断任何背景音乐。为此,在 player.play() 之前,您可以再次设置 AVAudioSession,就像这样-

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

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

  1. 一旦您的视频播放完声音,您现在必须让 AVAudioSession 知道它可以恢复任何被您打断的音频会话(即 Spotify、apple music、map导航说明等)。为此,一旦您的视频停止播放,您可以执行此操作-

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

关于如何处理 AVAudioSessionhere's the documentation. And here 是 Apple 针对不同类型的应用程序使用 AVAudioSession 的指南,有很多可用的选项。


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

您可以在 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")
    }
}