views:

3045

answers:

3
+5  A: 

This sample application that Apple provides should help. From the description:

Demonstrates how to use the Media Player Framework to play a movie full-screen. The sample contains code to configure the movie background color, playback controls and scaling mode via the built-in Settings application. Also shows how to draw custom overlay controls on top of the movie during playback.

Martin Gordon
This works for adding a custom control, however it does not toggle with the default controls.The sample shows how to catch a touch within your own custom control, but what they show you will not work with hiding your control. You will need to still catch other taps to be able to hide your control.
kdbdallas
+4  A: 

I found the BEST way to do this!

You create your movie player like normal and then do the following:

id vvController = [theMovie videoViewController];
[[vvController _overlayView] addSubview:mainView];

Where 'mainView' is your custom overlay. Doing this makes it so your custom overlay will show and hide with the normal overlays as they are now one in the same!

Please note that this is still using the standard frameworks, but it is undocumented in the frameworks. So it should be 100% appstore safe, but "could" change without notice from Apple in later frameworks.

kdbdallas
I had just been searching for the same thing. Good work. +1
Akusete
do you guys happen to know if you can create custom controls other than the ones in the mediaplayer? for example, frame by frame playback?
keuminotti
You can create controls, but what those controls do is limited to what you can do with the SDK. For example, I have a rating control that I show and when rated it sends it off to a server. What you are wanting would require being able to tell the player to move forward 1 frame and stop, which you cant currently. File a feature request at bugreporter.apple.com if you want it.
kdbdallas
+3  A: 

Folks here have probably also seen in various other blog posts the following approach to "get the movie-player window" -- at index = 1. Though this approach (see snippet below) is also possibly a bit "fragile", it's likely a bit "safer" since it does not make use of any undocumented or non-public methods in MPMoviePlayerController.

Note also that you should wait until you get a MPMoviePlayerContentPreloadDidFinishNotification, so that the movie-player window (idx=1) will indeed exist ;-)

Note I'm also assigning an arbitrary (integer-valued) view "tag" to myOverlayView here -- so that I can re-use the view when possible, i.e. check if it's already been added to the parent player window.

anyhoo, here's the relevant code-snippet:

// use slight "hack" to get our (parent) movie-player window, should always (?) be the UIWindow at index = 1
//
UIWindow *moviePlayerWindow= [[[UIApplication sharedApplication] windows] objectAtIndex:1];

myOverlayView.center = CGPointMake(
                            moviePlayerWindow.bounds.size.width - (myOverlayView.bounds.size.height / 2) - myOverlayView.display_origin.y,
                            moviePlayerWindow.center.y
                                  ); // center our overlay-view

myOverlayView.hidden = NO; // and show it

if( [moviePlayerWindow viewWithTag: MY_OVERLAY_VIEW_TAG] == nil ) {
    // haven't added our overlay-view as a sub-view to the main MoviePlayer window yet... so do that now
    myOverlayView.tag = MY_OVERLAY_VIEW_TAG;
    [moviePlayerWindow addSubview: myOverlayView];
}
[moviePlayerWindow bringSubviewToFront: myOverlayView]; // in any case, bring it to the foreground
sfjava