Čo je MediaMetadataRetriever a ako funguje

MediaMetadataRetriever je jednotný rozhranie na získavanie rámcov a metaúdajov z vstupného médiového súboru. Pred použitím ostatných metód v tejto triede je potrebné zavolať metódu na nastavenie zdroja dát. Táto operácia môže byť časovo náročná a jej výsledok ovplyvňuje ďalšie kroky pri získavaní metadát či snímok.

Nastavenie zdroja dát

SetDataSource môže pracovať s rôznymi vstupmi: cestou k súboru, URI alebo FileDescriptor. Pri práci so súbormi je možné použiť cestu cez String; pri URI je možné poskytnúť hlavičky ako Map, ktoré sa prenášajú na strane zdroja. Ak je zadaná cesta alebo URI, zavolanie tejto metódy je časovo náročné a je potrebné správne spravovať výnimky.

Podrobnosti:

  • SetDataSource(String path) - otvorí súbor z lokálneho systému a použije jeho FileDescriptor ako vstupný zdroj.
  • SetDataSource(String uri, Map headers) - nastaví zdroj na základe URI a doplní hlavičky pre prístup.
  • SetDataSource(Context context, Uri uri) - spracuje URI s použitím ContentResolver a AssetFileDescriptor; ak URI odkazuje na súbor, použije sa cesta alebo FileDescriptor; ak nie je možné získať pevný descriptor, vyhodí sa IllegalArgumentException.

Pri práci s kontextom a URI je dôležité správne pracovať s bezpečnostnými výnimkami a uzatvárať AssetFileDescriptor po použití.

Získavanie metaúdajov

Po nastavení zdroja dát je možné získať metaúdaje volaním extractMetadata(int keyCode). Kľúče METADATA_KEY_XXX sú vopred definované a pokrývajú informácie ako:

  • METADATA_KEY_ALBUM, METADATA_KEY_ARTIST, METADATA_KEY_TITLE, METADATA_KEY_DURATION
  • METADATA_KEY_YEAR, METADATA_KEY_DATE, METADATA_KEY_GENRE
  • METADATA_KEY_MIMETYPE, METADATA_KEY_HAS_AUDIO, METADATA_KEY_HAS_VIDEO
  • METADATA_KEY_VIDEO_WIDTH, METADATA_KEY_VIDEO_HEIGHT
  • METADATA_KEY_BITRATE, METADATA_KEY_LOCATION

Pri použití metódy getFrameAtTime(long timeUs, int option) je možné získať reprezentatívny rámec (bitmap) v danom časovom bode. Opcie určujú, ktorý rámec je preferovaný (napríklad predchádzajúci synchronný rám, najbližšie k času atď.). Ak nie je možné nájsť rámec presne na zadanom timeUs, je možné získať rámec v jeho blízkosti. Hodnota timeUs môže byť záporná, v ktorom prípade sú ignorované časové pozície a vyberá sa akýkoľvek reprezentatívny rámec podľa implementácie.

Podobne sa môže získať embedded picture (logo či obal) prostredníctvom getEmbeddedPicture(), ktorá vráti byte[] reprezentujúce vložené obrázky. Typy obrázkov sú určené internými konštantami, ako EMBEDDED_PICTURE_TYPE_ANY.

Použitie a praktické poznámky

Metódy sú navrhnuté tak, aby boli použité až po nastavení zdroja dát. Bez toho by bola žiadosť o metaúdaje alebo rámce neplatná. Pri spracovaní URI, najmä pri otvorení AssetFileDescriptor, je dôležité správne spravovať výnimky SecurityException a uzatvárať zdroje, ako je FD alebo AssetFileDescriptor, aby nedošlo k únikom zdrojov.

Niektoré kľúče metaúdajov môžu byť neprítomné alebo nie sú podporované pre konkrétny typ média. V takom prípade metóda extractMetadata vráti null alebo neplatný výsledok v závislosti od implementácie.

Bežné metódy a ich význam

  • setDataSource(...) - nastavenie zdroja dát pred všetkými operáciami.
  • extractMetadata(int keyCode) - získanie metaúdajov ako titul, autor, galéria, trvanie a ďalšie.
  • getFrameAtTime(long timeUs, int option) - získanie rámca v DP (bitmap) pre generovanie náhľadov.
  • getEmbeddedPicture() - ziskanie vložených obrázkov, ako obal média.
Infografika: Schematické znázornenie toku údajov v MediaMetadataRetriever
Metóda Popis Typ návratu
setDataSource(String path) Nastavenie zdroja údajov zo súboru void
extractMetadata(int keyCode) Vracia metaúdaj pre zadaný kľúč String
getFrameAtTime(long timeUs, int option) Vytvorenie snímky (bitmap) z nájdeného rámca Bitmap
getEmbeddedPicture() Vracia vložený obrázok (obal) byte[]

tags: #co #je #media #metadata #retriever