MPMoviePlayerViewController mit embedded video innerhalb von UITabBarController
Ich werde versuchen, ein eingebettetes video-Wiedergabe nicht ordnungsgemäß implementiert innerhalb einer tab-bar-navigation. In meinem speziellen Fall das video dargestellt werden soll, in einem nicht-Vollbild-Weise auf einer UIView, die mit gehostet wird, die von einem UIViewController, verwaltet von einem UITabBarController.
Zur Vereinfachung der Beispiel, können sagen, ich habe zwei Tabletten in meiner tabbar. Zuerst zeigt man einige random stuff, die zweite zeigt die viewcontroller, dass die Gastgeber das eingebettete video.
Sobald der Benutzer wählt den zweiten Reiter, das video laden und Abspielen einwandfrei.
Zum initialisieren der player verwende ich den folgenden code von meinem UIView abgeleiteten Klasse, ausgelöst durch den Initialisierer (initWithFrame):
- (void)initPlayback
{
self.movieViewController = [[MPMoviePlayerViewController alloc] init];
movieViewController_.wantsFullScreenLayout = NO;
movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
[self addSubview:self.movieViewController.view];
}
Für die Wiedergabe starten, ich bin mit dem folgenden code, ausgelöst durch die Methode viewWillAppear meiner UIViewController abgeleitete Klasse:
- (void)playVideo
{
[movieViewController_.moviePlayer setContentURL:fileURL_];
}
Wenn dann der Benutzer wählt den ersten tab (während das video noch abgespielt wird), mache ich sicher, dass das video gestoppt, als würde es weiter spielen, wenn das nicht getan wurde:
- (void)stopVideo
{
[movieViewController_.moviePlayer stop];
}
Sobald der Benutzer wählt den zweiten Reiter wieder, die Ansicht bleibt leer, nichts wird geladen oder abgespielt wird, obwohl die playVideo-Methode aufgerufen.
Was bin ich, warum ist die video-Wiedergabe zu Versagen, wenn zulassen, indem Sie die zweite Registerkarte?
==========neuer Versuch=============
Dieser Zeit habe ich aufgehört, sich auf shouldAutoplay (wie vorgeschlagen) aber, dass nicht einen Unterschied machen.
Angepasst und Hinzugefügt code, für diese;
- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification
{
if (movieViewController_.moviePlayer.loadState == MPMovieLoadStatePlayable &&
movieViewController_.moviePlayer.playbackState != MPMoviePlaybackStatePlaying)
{
[movieViewController_.moviePlayer play];
}
}
- (void)deregisterFromNotifications
{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
}
- (void)registerForNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MPMoviePlayerLoadStateDidChange:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
}
- (void)initPlayback
{
NSLog(@"playback init...");
self.movieViewController = [[MPMoviePlayerViewController alloc] init];
movieViewController_.wantsFullScreenLayout = NO;
movieViewController_.moviePlayer.shouldAutoplay = NO;
movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
movieViewController_.moviePlayer.currentPlaybackTime = 0.0f;
[self addSubview:movieViewController_.view];
}
- (void)playVideo
{
NSLog(@"playback starting...");
[self registerForNotifications];
[movieViewController_.moviePlayer setContentURL:fileURL_];
}
- (void)stopVideo
{
NSLog(@"playback stopping...");
[movieViewController_.moviePlayer stop];
[self deregisterFromNotifications];
}
- omg, die Antwort war so einfach, ich bin zu zögern, es zu schreiben, als eine Antwort.... durch hinzufügen von [movieViewController_.moviePlayer prepareToPlay] zu meinem playVideo Methode, Dinge begonnen, funktioniert gut und wie erwartet. Macht keinen Sinn für mich, aber es funktioniert.
- Herzlichen Glückwunsch! Yay! Es war mir unklar, dass Sie das spielen über das Netzwerk.
MPMovieLoadStatePlayable
als loadstate bedeutet, dass Sie heruntergeladen haben genug von dem Film, so dass das Telefon ist bequem, es zu spielen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In
playVideo
ich denke, es sollte[movieViewController_.moviePlayer setContentURL:fileURL_];
[movieViewController_.moviePlayer play];
Ich gehe davon aus, dass es funktioniert das erste mal, weil autoplay standardmäßig
YES
MPMoviePlayerViewController
ist eine Unterklasse vonUIViewController
. Wenn Sie die zweite Registerkarte gewidmet, um die Anzeige von video -, warum nicht einfach eine Instanz davon als root-view-controller für das zweite tab?Hinzufügen [movieViewController_.moviePlayer prepareToPlay] zu meinem playVideo Methode funktioniert der trick (bei der Arbeit mit remote-streams).