Наслагване върху Streaming MPMoviePlayerController

Прегледах примера от apple "MoviePlayer на iPhone"

Опитвам се да насложа върху mpmovieplayercontroller,

работи перфектно с видеоклип, който е в пакет,

но няма да работи, ако предавам поточно видеото от URL адреса.

изгледът с наслагване просто ще се скрие зад плейъра.

има ли начин да изведете изгледа с наслагване отпред?


person vicky    schedule 31.08.2009    source източник


Отговори (4)


MPMoviePlayerController създава свой собствен прозорец и го задава като ключов прозорец - вероятно вече знаете това от примерното приложение MoviePlayer.

Не знам защо, но има забавяне, когато плейърът използва поток - така че keyWindow, който получавате веднага след като инициализирате плейъра, вероятно не е прозорецът на плейъра, тъй като изглежда, че се добавя по-късно.

Можете да "измамите" и да използвате таймер, за да получите прозореца на плейъра няколко секунди по-късно, и да добавите вашето наслагване:

[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(addMyOverlay:) userInfo:nil repeats:FALSE]

Или можете да слушате събитието UIWindowDidBecomeKeyNotification и да направите същото:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];

Нито една опция не е страхотна (бих искал да знам по-чист начин да направя това), но върши работата.

person alex_c    schedule 06.09.2009
comment
всъщност използвах UIWindowDidBecomeKeyNotification вместо таймер, работи перфектно. не е необходим таймер. - person vicky; 22.10.2009
comment
Добре, съгласен съм. Че вашият прозорец - решение е перфектно. - person Sagar R. Kothari; 24.10.2009
comment
Опитах както центъра за уведомяване, така и базирания на таймер подход. И в двата случая се появява моето наслагване, но с грешно завъртане -- т.е. в пейзажен режим (който се появява в плейъра за филми преди 3.2), наслагването се появява на екрана, сякаш все още съм в портретен режим. Някой има ли опит с това? - person occulus; 03.06.2011

Можете да наслагвате своя изглед, когато получите известие „MPMoviePlayerContentPreloadDidFinishNotification“.

Регистрирайте се за известяване:

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(moviePreloadDidFinish:) 
                                             name:MPMoviePlayerContentPreloadDidFinishNotification 
                                           object:nil];

Добавяне на изглед с наслагване при получаване на известието:

//  Notification called when the movie finished preloading.
- (void) moviePreloadDidFinish:(NSNotification*)notification
{
    NSArray *windows = [[UIApplication sharedApplication] windows];
    if ([windows count] > 1)
    {
        // Locate the movie player window
        UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
        if ([moviePlayerWindow viewWithTag:0x3939] == nil) {
            self.videoOverlayView.tag = 0x3939;
            [moviePlayerWindow addSubview:self.videoOverlayView];
        }
        [moviePlayerWindow bringSubviewToFront:self.videoOverlayView];
    }
}
person Seunghoon    schedule 31.03.2010

Много просто решение:

appDelegate.window.backgroundColor = [UIColor clearColor];
appDelegate.window.windowLevel = 2;

Това ще запази потребителския интерфейс на вашето приложение в горната част на видео прозореца.

моята публикация

person MaxFish    schedule 30.09.2010

Предишният отговор беше базиран на таймер. & фиксирани 5 секунди.

Когато плейърът за филми започне, към приложението се добавя нов прозорец.

Използвайте таймер, за да проверите дали нов прозорец е добавен към вашето приложение или не.

Когато се добави прозорец ( прозорец на филмов плейър ). задайте известия.

-(void)viewDidLoad{

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePreloadDidFinish:) 
                                                 name:MPMoviePlayerContentPreloadDidFinishNotification 
                                               object:nil];

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePlayBackDidFinish:) 
                                                 name:MPMoviePlayerPlaybackDidFinishNotification 
                                               object:nil];

    // Register to receive a notification when the movie scaling mode has changed. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(movieScalingModeDidChange:) 
                                                 name:MPMoviePlayerScalingModeDidChangeNotification 
                                               object:nil];
    videoListController.xmlClassVideoList=t;
    // here ttttt is a timer declared in .h file
    tttttt=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self      selector:@selector(startMy) userInfo:nil repeats:YES];  
}

-(void)startMy{
    NSArray *windows = [[UIApplication sharedApplication] windows];  
    NSLog(@"%i",[windows count]);
    // depends on your application window
    // it may be 1/2/3
    if ([windows count] > 3) {
        // Locate the movie player window
        [tttttt invalidate];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
    }
}
person Sagar R. Kothari    schedule 20.10.2009
comment
Съгласен съм, че проверката на всеки 0,5 секунди има повече смисъл от чакането на 5 секунди, но защо просто не слушате UIWindowDidBecomeKeyNotification от самото начало и не забравите таймера? - person alex_c; 21.10.2009