Autore Topic: Riproduzione video con MediaPlayer  (Letto 1536 volte)

Offline davidemo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Play Store ID:
    getfun
  • Sistema operativo:
    mint
Riproduzione video con MediaPlayer
« il: 30 Novembre 2012, 16:27:19 CET »
0
Ciao a tutti, sono nuovo del forum.
Sto sviluppando un piccolo giochino per android ( TreeVolve ), abbiamo quasi finito ma mi sono bloccato nella riproduzione di semplici video durante l'esecuzione del gioco.
Il problema è molto semplice. Non visualizza un fico secco :-( Provato con decine di codec diversi, ma niente, non funziona.
Ora vi spiego.

Con questa funzione richiamo il surface che serve anche nella classe MediaPlayer per riprodurre un video.

Codice (Java): [Seleziona]
holder = getHolder();
                holder.addCallback(new Callback() {
                       
                        [...]
                       
                        public void surfaceCreated(SurfaceHolder holder) {
                                level.playerholder = holder;                   
                                gameLoopThread.setRunning(true);
                                renderLoopThread.setRunning(true);
                                gameLoopThread.start();
                                renderLoopThread.start();      
                               
                        }
                       
                        [...]
                });

Qui
level.playerholder = holder;
Mi salvo nella classe il holder del surface.

Ora nella classe Level:

Codice (Java): [Seleziona]
Uri srcPath = null;
                        switch(startVideo){
                        case 1:
                                srcPath = Uri.parse("android.resource://com.getfun.treevolve/" + R.raw.getfunvideo5);
                                break;
                        }                      
                        MediaPlayer mediaPlayer = MediaPlayer.create(context, srcPath,playerholder);                   
                        mediaPlayer.start();           
                       
                        Log.d("player", "Video width: " + Integer.toString(mediaPlayer.getVideoWidth()));

Schermata nera, non fa ne play ne niente.

Da notare che in Log.d il width del video me lo da come 0.
Da notare che se cancello il holder in MediaPlayer.create il getVideoWidth() me lo stampa correttamente, si sente l'audio ma non si vede niente (beh, non sa dove farlo vedere)

Non da nessun errore nel logcat, se carico un video non compattibile mi da errore il mediaplayer, quindi il video è compattibile.

Secondo me c'è qualcosa di non compattibile nel surface, vuole qualcos'altro ma non so cosa. Ho chiesto su vari forum anche quello ufficiale, ma nessuno sa darmi una risposta. (è da 3 settimane che ci provo).


Sono abbastanza disperato perchè quei video davano veramente un tocco in più al gioco.


Grazie mille in anticipo per l'aiuto, siete la mia ultima spiaggia :-(

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Riproduzione video con MediaPlayer
« Risposta #1 il: 30 Novembre 2012, 17:24:33 CET »
0
Tra i vari esempi del SDK presenti nel applicativo "ApiDemos" c'è quello su come utilizzare la classe MediaPlayer, questo è dell'ultima versione:

Cross Reference: /development/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.java

in generale è meglio esaminare quello del SDK in uso, basta vedere come viene usato.

Android sopporta solo un limitato numero di formati contenitori e pochissimi codec. Questo è l'elenco presente nella documentazione ufficiale:

Android Supported Media Formats | Android Developers

Tra le varie versioni Android sono stati aggiunti alcuni codec ma rimangono pochi e funzionano solo da una determinata versione in poi.

adb logcat | tee /tmp/logcat | grep TAG

Offline davidemo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Play Store ID:
    getfun
  • Sistema operativo:
    mint
Re:Riproduzione video con MediaPlayer
« Risposta #2 il: 30 Novembre 2012, 17:27:45 CET »
0
Grazie per la risposta.

Comunque si, il formato è corretto, l'ho preso da quella pagina e li ho provati tutti.

Il problema di questi esempi è questo:

setContentView(R.layout.mediaplayer_2);

Qui mi chiedono di avere un file xml con un elemento videoview (credo), e io non uso nessun elemento xml :-(

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Riproduzione video con MediaPlayer
« Risposta #3 il: 30 Novembre 2012, 17:51:45 CET »
0
Nel sorgente c'è basta cercarlo:

Cross Reference: /development/samples/ApiDemos/res/layout/mediaplayer_2.xml

Android permette di avere gli elementi della GUI istanziati direttamente in Java o attraverso un file XML. Dal file XML si vede che si tratta semplicemente di un LinearLayout con dentro una SurfaceView, è equivalente a poche righe in Java.
adb logcat | tee /tmp/logcat | grep TAG

Offline davidemo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Play Store ID:
    getfun
  • Sistema operativo:
    mint
Re:Riproduzione video con MediaPlayer
« Risposta #4 il: 30 Novembre 2012, 18:39:17 CET »
0
Quindi per far visualizzare il video dovrei cancellare la surfaceview del gioco e inizializzare quest'altra?
Non ho mai lavorato con queste cose, primo esperimento fatto con android e il giochetto gira tutto su una unica surfaceview, tutti gli elementi di GUI me li sono porgrammati io :-S

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Riproduzione video con MediaPlayer
« Risposta #5 il: 30 Novembre 2012, 20:02:24 CET »
0
Come tutte le cose è sempre meglio iniziare con cose più semplici e con piccoli passi arrivare a programmi più complessi.

Non credo che sia possibile condividere la stessa SurfaceView tra un MediaPlayer e un gioco, di solito lo spazio colore è molto diverso e poi possono esserci altre incompatibilità dovute alle funzioni hardware per la decodifica del video.

Android permette di avere una gestione molto complessa delle view, è possibile avere più layer sovrapposti con trasparenza o view che condividono lo stesso spazio ma solo una attiva o altre soluzioni, dipende molto dalle proprie conoscenze sulle API di Android.
adb logcat | tee /tmp/logcat | grep TAG

Offline davidemo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Play Store ID:
    getfun
  • Sistema operativo:
    mint
Re:Riproduzione video con MediaPlayer
« Risposta #6 il: 01 Dicembre 2012, 00:06:03 CET »
0
è proprio quello che volevo evitare :-( Lo sto scrivendo in modo generico perchè sarà giocabile anche su altri sistemi operativi e architetture e quindi tradotto anche in altri linguaggi.
Scrivendo il gioco per android in modo generico mi era più semplice tradurre il tutto in C++ e OjectC.
Sai per caso se ci sono altri modi per renderizzare un video nella stessa surfaceview generica?
Vabbè, se no niente video ma slideshow di immagini per la versione android :-(

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Riproduzione video con MediaPlayer
« Risposta #7 il: 01 Dicembre 2012, 01:35:25 CET »
0
Credo che conosci poco API di Android per trarre conclusioni.

API di Android come ho detto prima è molto ricca, è possibile sovrapporre più View tra di di loro, ad esempio:

Android Developers Blog: Android Layout Tricks #3: Optimize by merging

esistono anche altre soluzioni oltre al FrameLayout o il "merge" come usare la "setContentView"  e successivi "addContentView" (se possibile), dipende molto da quello che uno vuole fare e dalle proprie conoscenze.
adb logcat | tee /tmp/logcat | grep TAG

Offline davidemo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Play Store ID:
    getfun
  • Sistema operativo:
    mint
Re:Riproduzione video con MediaPlayer
« Risposta #8 il: 01 Dicembre 2012, 14:41:16 CET »
0
Mi sono dimenticato di ringraziarti.


Sto facendo un paio di test, per ora non molto positivi purtroppo.
Aggiungere un altro layout sopra per visualizzare il video mi fa calare di 10-20 frame tutto il gioco. Ho appena incominciato quindi magari sto facendo qualcosa di sbagliato, ma cercato su google tanti hanno questo problema.
Riprovo in un altro modo.


Grazie, ciao

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Riproduzione video con MediaPlayer
« Risposta #9 il: 01 Dicembre 2012, 18:10:27 CET »
0
Tieni conto che decomprimere e ridimensionare un video compresso con codec MPEG4 e famiglia non è una operazione a costo zero, serve un certo tempo di CPU e GPU e le risorse dei dispositivi mobili sono molto limitate rispetto a un PC di ultima generazione.
adb logcat | tee /tmp/logcat | grep TAG