2012-07-04 46 views
29

Ho bisogno di decodifica H.264 con accelerazione hardware per un progetto di ricerca, per testare un protocollo auto-definito.Come utilizzare la decodifica video con accelerazione hardware su Android?

Come per la ricerca sul Web, ho trovato alcuni modi per eseguire la decodifica video con accelerazione hardware su Android.

  1. Usa ffmpeg libstagefright (overview of libstagefright) o utilizzare libstagefright nel sistema operativo direttamente, come here.
  2. Utilizzare OpenMax su una piattaforma hardware specifica. come here about samsung device e here about Qualcomm Snapdragon series
  3. Alcune persone menzionate pvPlayer,

Alcune persone "say" libstagefright è l'unico modo, mentre i ragazzi di Qualcomm hanno fatto il successo, ovviamente.

Attualmente non sono sicuro su quale modo potrebbe funzionare. Sono un po 'confuso ora. Se tutto potesse funzionare, preferirei sicuramente un metodo indipendente dall'hardware.

Come ho provato alcuni lettori video della loro accelerazione H/W con Galaxy Tab 7.7 (3.2 & Enxyos), VLC, Mobo, Rock, vplayer, rock e mobo funzionano bene, VLC non funziona, sembra vplayer avere un bug di rendering che costa le sue prestazioni.

In ogni caso, ho eseguito un'operazione su Rockplayer e cancellato tutte le sue librerie .so in data \ data \ com.redirecting \ rockplayer e la decodifica software si interrompe mentre la decodifica hw funziona ancora bene! Mi chiedo come l'abbiano fatto. Mi sembra che l'accelerazione potrebbe essere indipendente dalle piattaforme hardware.

Qualcuno può inchiodare questo problema? O fornire alcun riferimento con informazioni aggiuntive o dettagli migliori?

+0

Sono po 'confuso! Vuoi accedere direttamente (senza le API dei media di Android) al decodificatore accelerato H/W per decodificare i tuoi bit-stream? Perché tutti i moderni social phone decodificano H.264 usando l'accelerazione H/w. –

+0

@ OakBytes, voglio implementare la decodifica accelerata H/W, ma è fatta. Ora so solo come decodificare il flusso con la decodifica del software ffmpeg. L'accelerazione H/W si riferisce al livello di prestazioni a 1080P a 30 fps, mentre la decodifica del software è molto più debole. Ho evitato di fare riferimento alla decodifica del software come CPU, perché il modulo di accelerazione H/W fa anche parte della CPU. Cosa intendi per tutti i telefoni moderni già utilizzati con l'accelerazione H/W? –

+0

Quando si utilizza Gallery Media Player per riprodurre clip H.264, tutti i recenti telefoni Android utilizzano il decodificatore H.264 accelerato H/W. Immagino tu pensi di usare il decodificatore H.264 per decodificare il flusso di bit H.264 non elaborato e ottenere l'output decodificato, piuttosto che riprodurre un file contenente video H.264 e audio. –

risposta

22

Per rispondere alla domanda di cui sopra, mi permetta di introdurre alcuni concetti legati ad Android

OpenMAX Android utilizza OpenMAX per l'interfaccia codec. Quindi tutti i codec nativi (hardware accelerato o meno) forniscono l'interfaccia OpenMAX. Questa interfaccia viene utilizzata da StageFright (framework Player) per la decodifica dei supporti tramite codec

NDK Android consente alle applicazioni Java di interagire con le librerie native C/C++ che utilizzano NDK. Ciò richiede l'utilizzo di JNI (Java Native Interface).

Ora venendo alla tua domanda How to tap native decoder to decode raw video bitstream?

In Android versione 4.0 e di seguito, Android non ha fornito l'accesso ai decoder video sottostanti a livello di Java. Dovresti scrivere codice nativo per interagire direttamente con il decodificatore OMX. Sebbene ciò sia possibile, non è banale in quanto richiederebbe la conoscenza di come funziona OMX e come mappare questo OMX all'applicazione utilizzando NDK.

Nella versione 4.1 (versione Jelly Bean), Android sembra fornire accesso ai decodificatori accelerati hardware a livello di applicazione tramite le API JAVA.Ulteriori dettagli sulle nuove API a http://developer.android.com/about/versions/android-4.1.html#Multimedia

+0

Grazie per il vostro chiarimento su concetti e risposte. Ho esaminato i riferimenti solo per scoprire che è troppo vero che devo scavare nel framework del sistema operativo. Questo sicuramente funzionerebbe. –

+0

Tuttavia, come suggerisce l'operazione su Rockplayer, in cui ho cancellato tutte le librerie .so e la decodifica hardware funziona ancora mentre il dec di software fallisce, potrebbe esserci un modo più semplice per farlo nella versione di Android 4.0. Per quanto riguarda la mia decodifica bitstream e tutto il resto, dovrei comunque capire l'intera cosa dell'OMX. Puoi fornire l'API Java in Jelly Bean? –

+0

@Holygenn Ho aggiunto il link alle API di Media Player in Jelly Bean. In caso di RockPlayer, visualizza direttamente il video utilizzando decodificatori accelerati hardware o fornisce buffer di output? È più facile fare il primo rispetto a quest'ultimo con i decodificatori hardware accelerati –

0

Utilizzare ExoPlayer (github).

È un progetto open source sponsorizzato da Google che sostituisce MediaPlayer della piattaforma. Ogni componente nella pipeline è estensibile, inclusa la sorgente di esempio (come i frame H.264 vengono estratti dal protocollo personalizzato) al rendering (su Surface, SurfaceTexture, ecc.).

Include un bel demo app showing usage.

Problemi correlati