关闭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];
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
}
您可以通过在 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];
以下链接可能对您有所帮助。
如果有人正在寻找 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),他们的音乐就会被打断。那是因为您的应用程序将默认设置为 AVAudioSession
到 AVAudioSessionCategorySoloAmbient
,这意味着 您的应用程序将始终中断所有在后台 运行ning 的音频会话一旦开始播放视频,静音或未静音。这可能不是一个非常令人愉快的用户体验,并会导致混淆。
您可能想要做的是,将您的视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户全屏播放您应用的视频时,任何背景音频都必须“暂停”或“中断”,本质上是您的应用接管 AVAudioSession
。然后,在您播放完视频后,让“中断”的背景音乐(例如:Spotify、Apple Music 等)恢复播放。下面的步骤准确地实现了 Twitter 的应用程序如何处理视频和背景音乐-
在 didFinishLaunchingWithOptions
方法中的 AppDelegate 中,确保您的应用不会中断任何背景音乐。现在,由于您的视频 运行 处于“静音”状态,您可以简单地 mixWithOthers
.
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, options: [.mixWithOthers])
try AVAudioSession.sharedInstance().setActive(true)
}catch{//some meaningful exception handling}
当您的应用程序开始全屏播放视频(un-muted/with 声音)时,您现在必须中断任何背景音乐。为此,在 player.play()
之前,您可以再次设置 AVAudioSession
,就像这样-
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
}catch{//some meaningful exception handling}
这基本上会 pause/interrupt 任何正在进行的背景音频,让您的视频有声播放。
一旦您的视频播放完声音,您现在必须让 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}
关于如何处理 AVAudioSession
和 here'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")
}
}
我有一个带有 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];
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
}
您可以通过在 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];
以下链接可能对您有所帮助。
如果有人正在寻找 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),他们的音乐就会被打断。那是因为您的应用程序将默认设置为 AVAudioSession
到 AVAudioSessionCategorySoloAmbient
,这意味着 您的应用程序将始终中断所有在后台 运行ning 的音频会话一旦开始播放视频,静音或未静音。这可能不是一个非常令人愉快的用户体验,并会导致混淆。
您可能想要做的是,将您的视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户全屏播放您应用的视频时,任何背景音频都必须“暂停”或“中断”,本质上是您的应用接管 AVAudioSession
。然后,在您播放完视频后,让“中断”的背景音乐(例如:Spotify、Apple Music 等)恢复播放。下面的步骤准确地实现了 Twitter 的应用程序如何处理视频和背景音乐-
在
didFinishLaunchingWithOptions
方法中的 AppDelegate 中,确保您的应用不会中断任何背景音乐。现在,由于您的视频 运行 处于“静音”状态,您可以简单地mixWithOthers
.do{ try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, options: [.mixWithOthers]) try AVAudioSession.sharedInstance().setActive(true) }catch{//some meaningful exception handling}
当您的应用程序开始全屏播放视频(un-muted/with 声音)时,您现在必须中断任何背景音乐。为此,在
player.play()
之前,您可以再次设置AVAudioSession
,就像这样-do{ try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) }catch{//some meaningful exception handling}
这基本上会 pause/interrupt 任何正在进行的背景音频,让您的视频有声播放。
一旦您的视频播放完声音,您现在必须让
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}
关于如何处理 AVAudioSession
和 here'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")
}
}