2014-09-17 18 views
5

To nie jest pytanie o odtwarzanie dwóch oddzielnych filmów w dwóch osobnych WideoViews na jednym działaniu.Odtwarzaj dwa filmy w jednym wideoView jednocześnie

Zostałem poproszony o sprawdzenie, czy możliwe jest utworzenie działania z jednym VideoView. Gdy użytkownik otworzy działanie, zostanie poproszony o wybranie podstawowego filmu wideo, a następnie wybierz drugie wideo. Oba filmy będą odtwarzane w jednym wideoView jednocześnie, ale podstawowy film będzie miał alfa 255, a drugi wideo będzie mieć 150 alfy.

Do testów jednak pliki wideo znajdujące się w telefonie będą zrobić.

W tym momencie udało mi się utworzyć tylko działanie, które odtwarza pojedynczy film wideo w VideoView.

Pomyślałem, że jeśli utworzę niestandardową klasę VideoView, mogę przesłonić funkcję onDraw i jakoś chwycić ramkę wideo z drugiego wideo, zastosować alfa, a następnie przerysować ją na pierwszym kanale VideoView, ale nie wiem, od czego zacząć .

Moja druga uwaga związana z tym procesem dotyczy ilości pamięci używanej do odtwarzania dwóch filmów jednocześnie w jednym filmie wideo, a także przetwarzania wymaganego do zastosowania alfa, a następnie ponownego przerysowania go bez zakłócania działania lub odtwarzania wideo. .

Nie jestem pewien, od czego zacząć lub jak najlepiej się do tego podejść i jeśli to możliwe, liczyłem na pewne wskazówki co do metod lub obiektów do użycia.

Zajmuję się tworzeniem aplikacji demonstracyjnej, aby pokazać klienta w systemie Android 2.2 za pomocą Eclipse. Nie zamierzam teraz kierować reklam na wyższe systemy, ponieważ telefon demonstracyjny obsługuje system Android 2.2.

+0

Możesz użyć 2 VideoView jeden nad drugim. ramka obu widoków wideo będzie taka sama. w każdym razie nie można odtwarzać 2 różnych filmów jednocześnie w jednym wideoView. – Deepak

Odpowiedz

1

Nie jestem do końca pewien, dlaczego chciałbyś użyć takiego VideoView. VideoViews używają tylko jednego MediaPlayera i użycie go do zsynchronizowania jednego filmu na drugim wymagałoby prawdopodobnie bardzo kludgey implementacji dwóch MediaPlayerów przez tę samą podklasę VideoView, renderując na tej samej powierzchni.

Obejrzyj the source code, aby zobaczyć, jak MediaPlayer renderuje wideo w VideoView i jak kontroluje odtwarzanie MediaController. Prawdopodobnie możesz się tam włamać, aby mieć dwa MediaPlayery skierowane jednocześnie do tego samego VideoView/SurfaceView. Alternatywnie możesz prawdopodobnie podklasę MediaPlayer obsługiwać wiele źródeł danych.

Wykonanie którejkolwiek z tych czynności jest sprzeczne z założeniami VideoView i MediaPlayer, a wydajność będzie ogromna.

Jeśli korzystanie z VideoView nie jest trudnym wymogiem, moją propozycją byłoby użycie istniejącej biblioteki wideo, takiej jak ffmpeg, która byłaby łatwiejsza i bardziej wydajna niż przepisywanie klas podstawowych mediów (uwaga: użycie ffmpeg będzie wymagało NDK, Sugeruję użycie existing ffmpeg wrapper, aby zaoszczędzić czas).

Po dodaniu do projektu ffmpeg, zastosowanie drugiego wideo jako OverlayVideoFilter byłoby dość łatwe i powinno umożliwić nałożenie jednego filmu na drugie (chociaż kontrolowanie odtwarzania jednocześnie może być dla ciebie wyzwaniem) .

Właściwa ścieżka do wykonania prawdopodobnie zależy od tego, co chcesz zrobić ze złożonym wideo po jego uzyskaniu (wyeksportuj wideo jako pojedynczy film, steruj odtwarzaniem itp.).

+1

Cześć Andrew, dziękuję za komentarz. Po opublikowaniu tego pytania zacząłem zaglądać do ffmpeg, ale nie znalazłem wspomnianej klasy Overlay VideoFilter. –

1

Odtwarzanie dwóch filmów w jednym widoku wideo nie jest możliwe.Dzieje się tak dlatego, że VideoView jest w rzeczywistości rozszerzonym SurfaceView, który jest zarówno przestarzały, jak i na początku nigdy nie działał super dobrze. (więcej na ten temat na dole)

Nie wiem, dlaczego trudno jest użyć VideoView, ponieważ jest to bardzo uproszczone i nie da ci tego, czego potrzebujesz.

Jeśli Twoim wymaganiem dla VideoView jest utrzymanie kontroli multimediów i funkcji odtwarzania, lepiej jest zrobić niestandardowy widok. Rozszerz LinearLayout i dodaj do niego dwa SurfaceViews o wadze 1. Skopiuj zawartość VideoView.java i umieść ją w swoim nowym Widoku, i dokonaj modyfikacji, aby obsłużyć dwa SurfaceViews odtwarzające dwa filmy synchronicznie.

Właściwie lepiej używać TextureViews zamiast SurfaceViews, który został dodany w api 14. Naprawia wiele niedociągnięć SurfaceView i radzi sobie z takimi animacjami, jak lepiej niż VideoView.

+0

Cześć Doge, dziękuję za komentarz. Myślałem o używaniu TextureViews, ale zostało dodane w api 14 i szukam docelowego api 8 na systemach Android 2.2. –

Powiązane problemy