我有一个带有 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];
正如@Tung Fam 的回答所建议的,您可以在应用程序中轻松执行此操作以将视频静音:
player.isMuted = true
您可以使用上面的代码静音运行视频,问题是,如果您只是使用
isMuted = true
(比方说视频预览)它会起作用,但是您的应用程序将“劫持”任何现有系统AVAudioSession
。这意味着如果用户正在听音乐(Spotify 或 Apple Music),他们的音乐就会被中断。这是因为应用程序默认将 AVAudioSession
设置为 AVAudioSessionCategorySoloAmbient
,因此 您的应用程序将始终在开始播放视频、静音或未静音时中断后台所有正在运行的音频会话。这可能不是一个非常令人愉快的用户体验并导致混乱。
您可能想要做的是将视频静音显示为预览,同时用户继续在后台播放他们的歌曲。当用户全屏观看应用程序的视频时,任何背景音频都必须“暂停”或“中断”;本质上,您的应用程序将接管 AVAudioSession
。然后,播放完视频后,让“中断”的背景音频(例如 Spotify、Apple Music 等)恢复。以下步骤实现了类似于 Twitter 处理视频和背景音乐的行为:
didFinishLaunchingWithOptions
方法中,确保您的应用程序不会中断任何背景音乐。因为您的视频将以“静音”模式运行,您只需
mixWithOthers
。
do {
try AVAudioSession.sharedInstance().setCategory(
AVAudioSession.Category.playback,
options: [.mixWithOthers]
)
try AVAudioSession.sharedInstance().setActive(true)
} catch { /* some meaningful exception handling */ }
player.play()
之前,您可以再次设置
AVAudioSession
,就像这样 -
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
try AVAudioSession.sharedInstance().setActive(true)
} catch { /* some meaningful exception handling */ }
这基本上会暂停/中断任何正在进行的背景音频,让您的视频有声播放。
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
...也许不是在您启动应用程序时进行,但绝对是这样随着您的应用程序成熟并变得更加稳定。
@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 4:
player.isMuted = true // To mute the sound
player.isMuted = false // To un-mute the sound
旁注:将视频静音不会重置视频声音开始。它只是一个常识性的静音功能。
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")
}
}
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];
以下链接可能对您有帮助。