Showing posts with label MPMoviePlayerdidFinishNotification. Show all posts
Showing posts with label MPMoviePlayerdidFinishNotification. Show all posts

Friday, January 15, 2010

MPMoviePlayerController vezerlese - megoldas

Tovabbra is az a lenyeg, hogy MPMoviePlayerController-rel le tudjak jatszani egymas utan tobb movie-t es a "previous" "next" gombokkal tudjak valtogatni kozottuk valamint a Done gombra alljon le.

Volt tobb rosz megoldasom:
-megneztem, hogy MPMoviePlayerPlaybackDidFinishNotification-ben meg tudom-e allapitan miert lett vege, de erre a 3.1.2-ben nincs lehetoseg (ugyanugy kuldi a notification-t, ha vege van a movie-nak, vagy ha a megnyomta a user a done, "prev", "next" gombok valamelyiket)
-Probaltam atlatszo UIButton-okkal letakarni ezeket a gombokat es a sajat gombjaim megnyomasat lekezelni, de ez sem jo, mert a default controlok eltunnek/megjelennek es errol sincsen semmi ertesites.
-Felmerult, hogy csupa sajat UIView-val megcsinalni, ami egyreszt nem lett volna tul szep, masreszt a timeline es a volume control gondot okozott volna.

Vegul ezt a megoldast talaltam (ami egyreszt nem menne at valoszinuleg az app store-on, masreszt a kovetkezo SDK-val valtozhat is. 3.1.2-vel probaltam):

Tovabbra is felteszem az osszes controlt az MPMoviePlayerController-re (MPMovieControlModeDefault), majd igy ferek hozzajuk a UIWindowDidBecomeKeyNotification-ra feliratkozva. (Eloszor a MPMoviePlayerContentPreloadDidFinishNotification-t akartam hasznalni, de az nem volt jo. Elsore ezt nem is vettem eszre, mert az elso movie betoltesenel eloszor a keyWindow notificaton jott meg es utana a preloadDidFinish, viszont a masodik play-nel mar forditva.):

id internal;

object_getInstanceVariable(player, "_internal", (void *)&internal);

id videoViewController;

object_getInstanceVariable(internal, "_videoViewController", (void*)&videoViewController);

UIView *overlayView = [videoViewController _overlayView]; //MPFullScreenVideoOverlay


Ennek a UIView-nak pedig a subview-it siman le lehet kerni amik nagyjabol igy neznek ki. Azert nagyjabol, mert subviews egy NSArray-t ad vissza amiben az elemek sorrendje nem kotott. Azt figyeltem meg, hogy az MPFullScreenVideoOverlay-nek ha lekerem a subview-it akkor az mindig ugyanabban a sorrendben jott vissza /MPFullScreenTransportControls, NPCenteringNavigationBar/ es meg az MPFullScreenTransportControls subview-it lekerve is ugyanaz volt a sorrend /play, next, previous/, de az NPCenteringNavigationBar-nal az elso video betoltesenel UINavigationButton, UIView volt a sorrend, de a masodiknal mar pont forditva. Tehat ha subview-kat kerunk le egy NSArray-ba, akkor ne hagyatkozzunk a sorrendre, mert nem mi raktuk ossze!!!

Tehat ha igy a kezunkben van peldaul a "next" gomb, akkor arra ra is kothetjuk a sajat targetaction-unket a UIControlEventTouchUpInside-ra. Nem art elott lekotni rola a defult action-t:

[nextButton removeTarget:fstc action:nil forControlEvents:UIControlEventTouchUpInside];

[nextButton addTarget:self action:@selector(nextButtonClicked:) forControlEvents:UIControlEventTouchUpInside];


Aztan persze meg kell irni a sajat nextButtonClicked methodunkat is (meg a tobbi gombet is) amiben ha van meg lejatszando movie-nk akkor release-eljuk az MPMoviePlayerController-t majd csinalunk egy ujat a kovetkezo movie-val.>

Wednesday, January 6, 2010

MPMediaPlayerController problemak

Tovabbra is tobb video egymas utan lejatszasat akarom megoldani es kozben belefutottam 2 problemaba:

1. Ha letrehozok egy MPMoviePlayerController-t akkor annak a retainCount-ja 1 ahogy kell, de amint meghivom rajta a play method-ot a retainCount 3 lesz. (A controller maga modul szinten van deklaralva, de ugyanez tortenik, ha helyben deklaralom, hozom letre es probalom lejatszani.) Igy persze egy sima release sem eleg a MPMoviePlayerDidFinishNotification kezeleseben. (Ugyanakkor, ha a controller-t nil-re allitom majd ujra letrehozom es meghivom a play mehtod-ot akkor mar csak 2 lesz a retainCount es nem 3.) Megneztem az Apple MoviePlayer peldakodjat es ott megjobban elszall a retainCount.

2. A masik problema, hogy ha az MPMoviePayerdidFinishNotification kezeleseben lenullazom a controller-t (akkor is, ha nil-re allitom) es utana egy masik videoval ujra letrehozom, majd meghivom rajta a play method-ot es a notification azert jott, mert a user megnyomta a "next" gombot, akkor a notification ujra megjon amint elindult a masodik video azaz a masodiknak rogton vege lesz. Ha a notification eredetileg azert jott, mert vege volt a videonak, akkor nincs ilyen problema.