我有一个带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];
答案 0 :(得分:16)
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
}
答案 1 :(得分:13)
正如@Tung Fam的回答所示,您可以在应用中轻松完成此操作以静音视频 -
player.isMuted = true
处理所有用例:
您可以使用上面的代码在静音上运行视频,问题是,如果您只是使用isMuted = true
(对于让我们说视频预览)它会起作用,但您的应用将会&# 34;劫持"来自操作系统的AVAudioSession
,这意味着如果用户是听音乐(spotify或苹果音乐),他们的音乐就会被打断。这是因为您的应用的默认设置为AVAudioSession
到AVAudioSessionCategorySoloAmbient
,这意味着您的应用会在开始播放后立即中断在后台运行的所有音频会话视频,静音或未静音。这可能不是一个非常令人愉快的用户体验并导致混淆。
您可能想要做的是,将视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户使用您应用的视频进入全屏时,任何背景音频都必须"暂停"或者被打断"基本上你的应用程序接管AVAudioSession
。然后,一旦你完成了你的视频播放,就让#34;中断"背景音乐(例如:Spotify,Apple Music等)恢复。以下步骤完全实现了Twitter的应用处理视频和背景音乐的方式 -
在didFinishLaunchingWithOptions
方法的AppDelegate中,确保您的应用不会中断任何背景音乐。现在,因为您的视频将在"静音"你可以简单地mixWithOthers
。
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers])
try AVAudioSession.sharedInstance().setActive(true)
}catch{//some meaningful exception handling}
当您的应用开始播放视频全屏(未静音/有声)时,您现在必须中断任何背景音乐。为此,在您player.play()
之前,您可以再次设置AVAudioSession
,就像这样 -
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [])
try AVAudioSession.sharedInstance().setActive(true)
}catch{//some meaningful exception handling}
这将基本暂停/中断正在进行的任何背景音频,让您的视频播放声音。
视频播放完毕后,您必须让AVAudioSession
知道它可以恢复被您打断的任何音频会话(即Spotify,苹果音乐,地图导航说明等)。 )。要做到这一点,一旦你的视频停止播放,你可以这样做 -
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers])
try AVAudioSession.sharedInstance().setActive(false, with: AVAudioSessionSetActiveOptions.notifyOthersOnDeactivation)
}catch{//some meaningful exception handling}
有关如何处理文档AVAudioSession
和here's的更多选项。 here是Apple针对不同类型的应用使用AVAudioSession
的指南。
这只是关于如何使用AVAudioSession
的一个非常基本的解释,但根据您的应用程序的功能,可能需要使用KVO,AppDelegate方法(用于应用程序转到后台和/或来到前台等等)适当地设置AVAudioSession
。进一步需要注意的是,你真的需要在AVAudioSession
上使用所有选项,因为它可能不会像你想象的那样工作,所以它可能会变得有点费力。更值得注意的是,令人惊讶的是,除了Apple的文档以及此处有关于SO的一些问题之外,我在AVAudioSession
发现的细节很少。底线是 - 如果你的应用处理音频/视频,那么强烈建议根据Apple的#34; Audio Guidelines By App Type"的剧本适当处理AVAudioSession
,也许不是当你启动你的应用程序,但绝对是你的应用程序成熟,变得更稳定。
答案 2 :(得分:5)
如果有人正在寻找 Swift 4 :
player.isMuted = true // To mute the sound
player.isMuted = false // To un-mute the sound
旁注:视频静音不会重置视频声音以启动。它只是一种常识性的静音功能。
答案 3 :(得分:0)
您可以通过在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];
以下链接可以为您提供帮助。
答案 4 :(得分:0)
您可以将其添加到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")
}
}