如何使用MPMoviePlayerController播放video时将audio静音/取消静音?

我创build了我自己的自定义控件,用于MPMoviePlayerController 。 到目前为止,除了静音button控制之外,所有的工作都正常。

在创buildMPMoviePlayerController实例之前,我使用以下代码configuration了MPMoviePlayerController

  NSError *modeError = nil; [self.audioSession setMode:AVAudioSessionModeMoviePlayback error:&modeError]; if (modeError != nil) { NSLog(@"Error setting mode for AVAudioSession: %@", modeError); } NSError *categoryError = nil; [self.audioSession setCategory:AVAudioSessionCategoryPlayback error:&categoryError]; if (categoryError != nil) { NSLog(@"Error setting category for AVAudioSession: %@", categoryError); } 

然后在我的静音buttoncallback方法我有以下代码:

  NSError *activeError = nil; [self.audioSession setActive:NO error:&activeError]; if (activeError != nil) { NSLog(@"Error setting inactive state for AVAudioSession: %@", activeError); } 

当点击静音button,我得到以下无用的错误:

 Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn't be completed. (OSStatus error 560030580.)" 

我链接到AVFoundation框架。

这真的开始纠缠我,因为我不能为我的生活find一种方法来减less或静音我的应用程序的播放音​​频。

我不想只改变AVAudioSession AVAudioSessionCategoryPlayback类别定义的应用程序级卷的系统全局卷。

看来你可以设置AVAudioPlayer的音量,但不能设置MPMoviePlayerController 。 我在这里看到其他职位,所以说只是创build一个AVAudioPlayer的实例,并设置音量,但这只是导致我的应用程序崩溃,我期望它有一些事情,我不使用initWithContentsOfURL:error:initWithData:error:而是使用`init'。

任何帮助,将不胜感激。

在与Apple技术人员交谈后,事实certificate,使用MPMoviePlayerController无法控制或静音audio。

相反,您必须使用AVFoundations AVPlayer类创build自己的控制器。

一旦你使用它,这是创build一个自定义的audio混合和设置音量水平的问题。 它实际上工作得很好。

示例代码:

  AVURLAsset * asset = [AVURLAsset URLAssetWithURL:[self localMovieURL] options:nil]; NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; // Mute all the audio tracks NSMutableArray * 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]; // Create a player item AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; [playerItem setAudioMix:audioZeroMix]; // Mute the player item // Create a new Player, and set the player to use the player item // with the muted audio mix AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; self.mPlayer = player; [mPlayer play]; 

我写了一个MPMoviePlayerControllerreplace类,它增加了对音量级别的支持。 我将很快上传到github,并在这篇文章中添加链接。

我知道这是一个旧的post,但我设法find一种方法来成功控制在iOS6和iOS7 MPMoviePlayerController控件的音量,使用MPVolumeView。 一个问题是它不能在模拟器中工作,只能在物理设备上工作。 只是控制音量,添加一个隐藏的MPVolumeView将正常工作。 但是,如果您使用隐藏的屏幕,则使用物理设备音量button更改音量时显示的本机操作系统音量显示仍将出现在中央屏幕上。 如果要防止这种情况,请确保您的MPVolumeView不隐藏。 相反,您可以给它一个非常低的Alpha透明度,并将其放在其他视图的后面,这样用户就看不到它了。

这是我用过的代码:

 MPVolumeView *volumeView = [[MPVolumeView alloc]initWithFrame:CGRectZero]; [volumeView setShowsVolumeSlider:YES]; [volumeView setShowsRouteButton:NO]; // control must be VISIBLE if you want to prevent default OS volume display // from appearing when you change the volume level [volumeView setHidden:NO]; volumeView.alpha = 0.1f; volumeView.userInteractionEnabled = NO; // to hide from view just insert behind all other views [self.view insertSubview:volumeView atIndex:0]; 

这允许您通过调用:[[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0]来控制音量;

但是,我仍然得到本机操作系统音量显示第一次尝试改变音量显示 – 在随后的加载它没有显示这个显示,所以计算它是在viewcontroller生命周期的阶段,我搬了它从我的viewDidLoad方法到viewDidAppear方法 – 它的工作 – 音量静音和本机音量显示没有出现, 我现在能够在video开始播放之前听到一秒钟的audio。 所以我迷上了播放状态确实改变了MPMoviePlayerController的委托。 在viewDidload中我添加了:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil]; 

而委托callback方法:

 -(void)videoPlaybackStateDidChange:(NSNotification *)aNotification { // Note, this doesn't work in simulator (even in iOS7), only on actual device! if ([moviePlayerController playbackState] == MPMoviePlaybackStatePlaying) { [[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0]; } } 

在开始播放之前,这个静音video的audio,但在生命周期中的viewDidLoad之后,所以没有本地OS音量静音显示。

在我的应用程序中,我检索并保存当前的音量级别之前静音(使用[MPMusicPlayerController applicationMusicPlayer] .volume属性),然后在视图控制器closures时恢复音量到这个级别,这意味着用户将不知道他们的设备音量级别被修改和恢复。

此外,如果您的MPMoviePlayerController在iOS7中使用非标准audio路由,调用[[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0]可能无法为您工作 – 在这种情况下,您可以遍历MPVolumeView控件的子视图,直到find视图哪个子类UISlider。 然后你可以调用[sliderView setValue:0 animated:NO]这应该为你工作。 这种方法不使用任何私人的苹果API,所以不应该让你的应用程序被拒绝 – 毕竟有这么多合法的理由,为什么你会提供这个function,这是可能的在iOS6,而不必去这些长度! 事实上,我发现苹果已经删除了在iOS7中设置MPMoviePlayerController上的音量的function。强制迁移到AVPlayer?

更新:我的iPad应用程序现在已经被批准使用这种方法,并在应用程序商店生活。