2010-01-30 4 views
14

J'ai besoin d'une bibliothèque d'extraction d'informations sur le média (wrapper Java ou JNI pur) capable de gérer les formats de média courants. Je l'utilise principalement pour les fichiers vidéo et j'ai besoin au moins ces informations:Media Information Extractor pour Java

  1. Durée de la vidéo (Runtime)
  2. bitrate vidéo
  3. vidéo framerate
  4. Format vidéo et codec
  5. Taille de la vidéo (largeur x hauteur)
  6. canaux audio
  7. Format audio
  8. bitrate audio et sam taux d'amorçage

Il existe plusieurs bibliothèques et outils mais je n'ai pas pu trouver pour Java.

+0

De quels formats/encodages parlons-nous ici? Les gens ont différentes définitions de «commun» pour les formats de médias. – aperkins

+0

Je veux dire les formats MPEG, DivX, XviD, Matroska, Real Video, Windows Media pour les vidéos; MP3 et AC3 pour audios. Il n'y a pas de formats spécifiques dont j'ai besoin, donc plus je supporte le format, mieux c'est. –

+0

Subs4me est-il destiné à être utilisé uniquement pour la plate-forme Linux? quand j'ai essayé votre exemple, j'ai frappé l'exception à cause de cette ligne dans lib 'if (! (Platform.isLinux())) return;' – kitokid

Répondre

10

Après quelques jours à poser cette question, j'ai trouvé MediaInfo qui fournit des dizaines d'informations techniques et d'étiquettes sur un fichier vidéo ou audio.

Il existe un wrapper JNI pour MediaInfo dans subs4mesource tree que je trouve très utile. Voici quelques extraits de code qui montrent comment extraire des informations à partir d'un fichier multimédia:

String fileName = "path/to/my/file"; 
File file   = new File(fileName); 
MediaInfo info = new MediaInfo(); 
info.open(file); 

String format  = info.get(MediaInfo.StreamKind.Video, i, "Format", 
         MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name); 
int bitRate  = info.get(MediaInfo.StreamKind.Video, i, "BitRate", 
         MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name); 
float frameRate = info.get(MediaInfo.StreamKind.Video, i, "FrameRate", 
         MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name); 
short width  = info.get(MediaInfo.StreamKind.Video, i, "Width", 
         MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name); 

int audioBitrate = info.get(MediaInfo.StreamKind.Audio, i, "BitRate", 
         MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name); 
int audioChannels = info.get(MediaInfo.StreamKind.Audio, i, "Channels", 
         MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name); 

S'il vous plaît noter que le code ci-dessus est un exemple de base et ne contient aucune vérification d'erreur (ce qui est une mauvaise habitude dans un vrai scénario). Notez également que les informations que vous pouvez extraire avec MediaInfo ne se limitent pas à celles mentionnées ci-dessus. Voir la sortie brute de MediaInfo pour connaître le type d'informations sur les médias que vous pouvez extraire ou lire MediaInfo C++ SDK.

+0

Subs4me est destiné à être utilisé uniquement pour la plate-forme Linux? quand j'ai essayé votre exemple, j'ai frappé l'exception à cause de cette ligne dans lib if (! (Platform.isLinux())) return; – kitokid

+0

Je ne suis pas sûr que subs4me soit complètement portable. J'utilise le code ci-dessus sur Windows sans aucun problème. –

+0

Salut Emre, pourriez-vous me parler de l'utilisation de subs4me? Je viens de mettre son fichier jar dans mon projet et récupère le MediaInfo. mais il lance java.lang.NoClassDefFoundError lors de l'appel de la classe InfoInfo Info = new MediaInfo() ;. Toutes les étapes manquantes ou nécessaires, donc je peux utiliser subs4me? Je suis perdu. Merci. – kitokid

1

Vous n'avez pas besoin d'un cadre pour ce genre de choses, par exemple le format de conteneur vidéo AVI a un 56 byte header contenant toutes les métadonnées pertinentes. There's bunch of other formats on that site too, ils semblent tous être assez trivial à mettre en œuvre.

+0

Je n'écris pas d'outil d'extraction d'informations sur les médias, donc je ne veux pas apprendre chaque format de média et implémenter la classe d'extraction appropriée. Notez également qu'il existe de nombreux formats de conteneurs qui ont une structure beaucoup plus complexe (et certains d'entre eux sont propriétaires), AVI est l'un des cas les plus simples. –

1

Essayez Xuggler. Voici quelques Xuggler source code qui interroge un fichier multimédia et imprime toutes sortes de métadonnées utiles.

  • Art
+0

déprécié: utiliser javacv –