关闭AVPlayer的音频播放?

问题描述 投票:0回答:5

我有一个带有 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
5个回答
50
投票

正如@Tung Fam 的回答所建议的,您可以在应用程序中轻松执行此操作以将视频静音:

player.isMuted = true

处理所有用例

您可以使用上面的代码静音运行视频,问题是,如果您只是使用

isMuted = true
(比方说视频预览)它会起作用,但是您的应用程序将“劫持”任何现有系统
AVAudioSession 
。这意味着如果用户正在听音乐(Spotify 或 Apple Music),他们的音乐就会被中断。这是因为应用程序默认将
AVAudioSession
设置为
AVAudioSessionCategorySoloAmbient
,因此 您的应用程序将始终在开始播放视频、静音或未静音时中断后台所有正在运行的音频会话。这可能不是一个非常令人愉快的用户体验并导致混乱。

您可能想要做的是将视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户全屏观看应用程序的视频时,任何背景音频都必须“暂停”或“中断”;本质上,您的应用程序将接管

AVAudioSession

。然后,播放完视频后,让“中断”的背景音频(例如 Spotify、Apple Music 等)恢复。以下步骤实现了类似于 Twitter 处理视频和背景音乐的行为:

  1. 在 AppDelegate 的

    didFinishLaunchingWithOptions

     方法中,确保您的应用程序不会中断任何背景音乐。因为您的视频将以“静音”模式运行,您只需 
    mixWithOthers

    do { try AVAudioSession.sharedInstance().setCategory( AVAudioSession.Category.playback, options: [.mixWithOthers] ) try AVAudioSession.sharedInstance().setActive(true) } catch { /* some meaningful exception handling */ }
    
    
  2. 当您的应用程序开始全屏播放视频(未静音/有声音)时,您现在必须中断任何背景音乐。为此,在

    player.play()

     之前,您可以再次设置 
    AVAudioSession
    ,就像这样 - 

    do { try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback) try AVAudioSession.sharedInstance().setActive(true) } catch { /* some meaningful exception handling */ }
    这基本上会暂停/中断任何正在进行的背景音频,让您的视频有声播放。

  3. 视频播放完声音后,您现在必须让

    AVAudioSession

     知道它可以恢复被您中断的任何音频会话(即 Spotify、Apple Music、地图导航说明等)。为此,一旦您的视频停止播放,您可以执行以下操作:

    do { try AVAudioSession.sharedInstance().setCategory( AVAudioSession.Category.playback, options: [.mixWithOthers] ) try AVAudioSession.sharedInstance().setActive(false, options: AVAudioSessionSetActiveOptions.notifyOthersOnDeactivation) } catch { /* Some meaningful exception handling */ }
    
    
关于如何处理

AVAudioSession

,还有很多选择。 
这里文档,这里是Apple针对不同类型的应用程序使用AVAudioSession
的指南。


这只是关于如何使用

AVAudioSession

 的非常基本的解释,但根据您的应用程序的功能,可能需要使用 KVO、AppDelegate 方法(用于应用程序进入后台和/或进入前台等)来适当设置 
AVAudioSession
。进一步的警告是,您确实需要尝试 
AVAudioSession
 上的所有选项,因为它可能不会按照您想象的方式工作,因此可能会变得有点累人。更需要注意的是,令人惊讶的是,除了苹果的文档和一些关于 SO 的问题之外,我在网上发现很少有关于 
AVAudioSession
 的详细信息。

底线是:如果您的应用程序处理音频/视频,那么强烈建议根据 Apple 的“

按应用程序类型的音频指南

”手册适当地处理 
AVAudioSession...也许不是在您启动应用程序时进行,但绝对是这样随着您的应用程序成熟并变得更加稳定。


25
投票
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 }
    

7
投票
如果有人正在寻找

Swift 4

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

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


2
投票
您可以将其添加到 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") } }
    

-1
投票
您可以通过在

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
© www.soinside.com 2019 - 2024. All rights reserved.