2013-04-11 4 views
10

Ich habe meine eigenen benutzerdefinierten Steuerelemente für die Verwendung mit der MPMoviePlayerController erstellt. Bisher funktioniert alles außer der Mute-Tastensteuerung.Wie kann ich bei der Wiedergabe von Videos mit MPMoviePlayerController Audio stummschalten bzw. die Stummschaltung aufheben?

Ich habe die AVAudioSession mit dem folgenden Code konfiguriert, bevor ich meine Instanz der MPMoviePlayerController erstellen.

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); 
    } 

Da ist in meinem Mute-Taste Callback-Methode habe ich den folgenden Code:

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

Wenn die Mute-Taste ich folgende unuseful Fehlermeldung erhalten klicken:

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

Ich Verknüpfung bin zu das AVFoundation Rahmenwerk.

Das fängt wirklich an, mich zu ärgern, da ich für das Leben von mir nicht einen Weg ausarbeiten kann, um das Playbackaudio meiner Anwendung zu reduzieren oder zu stumm zu machen.

Ich möchte nicht das globale Volumen des Systems nur das Volumen der Anwendungsebene ändern, wie von der Kategorie AVAudioSessionAVAudioSessionCategoryPlayback definiert.

Es scheint, dass Sie die Lautstärke des AVAudioPlayer, aber nicht die MPMoviePlayerController einstellen können. Ich habe andere Beiträge hier auf SO gesehen, die sagen, nur eine Instanz von AVAudioPlayer erstellen und die Lautstärke einstellen, aber dies verursacht nur meine App zum Absturz und ich nehme an, es hat etwas damit zu tun, dass ich nicht die initWithContentsOfURL:error: oder initWithData:error: und stattdessen mit `init '.

Jede Hilfe wäre willkommen.

Antwort

10

Nach einem Gespräch mit einem Apple-Techniker stellt sich heraus, dass es nicht möglich ist, den Ton über MPMoviePlayerController zu steuern oder zu stummschalten.

Stattdessen müssen Sie Ihren eigenen Controller mit AVFoundations Klasse erstellen.

Sobald Sie dies verwenden, ist es eine Frage der Erstellung eines benutzerdefinierten Audio-Mix und Einstellung der Lautstärke. Es funktioniert wirklich sehr gut.

Beispielcode:

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]; 

Ich habe eine MPMoviePlayerController Ersatz Klasse geschrieben, die Unterstützung für Lautstärke hinzufügt. Ich werde das in Kürze auf github hochladen und den Link in diesem Beitrag hinzufügen.

+1

Würde ich gerne diese Klasse sehen, haben Sie es jemals auf GH gesetzt? –

+0

Ich fürchte nicht, ich bin mir nicht 100% sicher, wie stabil meine Implementierung ist, so dass ich nie dazu gekommen bin, sie aufzustellen. Vielleicht stelle ich es nur als Referenz auf. Ein großer Fehler, den ich auch bei dieser Technik entdeckt habe, besteht darin, dass Sie nur die 0-100% des eingestellten Lautstärkepegels kontrollieren können, wenn Sie dies zur Steuerung des Wertepegels verwenden (anstatt nur zu stummschalten). Angenommen, die Lautstärke des Geräts ist auf 50% eingestellt, und Sie verwenden diese Methode, um das App-Volumen um 50% zu reduzieren. Das, was Sie hören werden, beträgt 25%. – Camsoft

+0

ok, interessant. danke für die Antwort. Ich werde wahrscheinlich mit dem Wechsel zum AVPlayer gehen, um .mute –

3

Ich weiß, das ist ein alter Beitrag, aber ich habe einen Weg gefunden, um die Lautstärke des MPMoviePlayerController-Steuerelement in iOS6 & iOS7, mit einem MPVolumeView erfolgreich zu steuern. Ein Problem ist, dass es NICHT im Simulator funktioniert, nur auf dem physischen Gerät. Um nur die Lautstärke zu regeln, funktioniert das Hinzufügen einer versteckten MPVolumeView gut. Wenn Sie jedoch eine verborgene Anzeige verwenden, wird die Anzeige des nativen OS-Volumes, die angezeigt wird, wenn Sie die Lautstärke mithilfe der Tasten für die Lautstärke des physischen Geräts ändern, weiterhin auf dem mittleren Bildschirm angezeigt. Wenn Sie dies verhindern möchten, stellen Sie sicher, dass Ihre MPVolumeView nicht ausgeblendet ist. Stattdessen können Sie ihm eine sehr niedrige Alpha-Transparenz zuweisen und sie hinter anderen Ansichten platzieren, sodass der Benutzer sie nicht sehen kann.

Hier ist der Code, den ich verwendet habe:

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]; 

Dieses Sie die Lautstärke durch den Aufruf steuern: [[MPMusicPlayerController applicationMusicPlayer] setVolume: 0,0];

Aber ich bekam immer noch die native OS Volume-Anzeige erschien das erste Mal, wenn ich versuchen würde, die Lautstärke zu ändern - bei nachfolgenden Ladevorgänge zeigte es diese Anzeige nicht, so dass es etwas mit der Bühne in der Viewcontroller Leben zu tun hatte Ich habe es von meiner ViewDidLoad-Methode auf die ViewDidAppear-Methode verschoben - es funktionierte - das Volume stummgeschaltet und die native Volume-Anzeige erschien nicht, , aber Ich konnte jetzt eine Teilsekunde hören, bevor das Video abgespielt wurde. Also habe ich mich in den Playback-Zustand versetzt, habe den Delegaten des MPMoviePlayerControllers gewechselt. In viewDidLoad ich hinzugefügt:

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

und die Delegierten Callback-Methode:

-(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]; 
    } 
} 

Das das Audio des Videos stumm geschaltet, bevor sie anfingen zu spielen, aber nach dem viewDidLoad im Lebenszyklus, also keine native OS Lautstärke stumm geschaltetes Display. In meiner App habe ich den aktuellen Lautstärkepegel vor dem Stummschalten abgerufen und gespeichert (mithilfe der [MPMusicPlayerController applicationMusicPlayer] .volume -Eigenschaft) und das Volume dann auf diesen Wert zurückgesetzt, als der Ansichtscontroller geschlossen wurde, was bedeutet, dass der Benutzer nichts davon bemerkt hätte dass ihre Gerätelautstärke geändert und zurückgesetzt wurde.

Wenn Ihr MPMoviePlayerController eine nicht standardmäßige Audio-Route in iOS7 verwendet, funktioniert der Aufruf von [[MPMusicPlayerController applicationMusicPlayer] setVolume: 0.0] möglicherweise nicht für Sie - in diesem Fall können Sie die Unteransichten Ihres MPVolumeView-Steuerelements durchlaufen Sie finden eine Ansicht, welche Unterklassen UISlider. Sie können dann [sliderView setValue: 0 animated: NO] aufrufen, was für Sie funktionieren sollte. Diese Methode verwendet keine privaten Apple-APIs, daher sollten Sie Ihre App nicht zurückweisen - schließlich gibt es so viele legitime Gründe, warum Sie diese Funktionalität anbieten würden, und es war in iOS6 möglich, ohne diese Längen zu erreichen! In der Tat war ich verwirrt, um zu entdecken, dass Apple die Funktionalität entfernt hatte, um den Datenträger auf MPMoviePlayerController in iOS7 an erster Stelle zu setzen. Erzwungene Migration zu AVPlayer?

Aktualisierung: Meine iPad App wurde jetzt mit dieser Methode genehmigt und ist im App Store verfügbar.

+0

Es ist eine interessante Art, damit umzugehen, aber wenn der Benutzer Musik im Hintergrund spielt, werden sie es auf jeden Fall bemerken. Nur zu deiner Information. –

Verwandte Themen