2017-06-06 4 views
0

J'essaie d'utiliser Xuggler comme FFMPEG Metadata Wrapper (J'ai juste besoin de la liste des chapitres de MP4/M4V Video).Java Xuggler Metadata Liste des chapitres Vidéo MP4/M4V

Jusqu'à présent, je n'ai pas été en mesure de trouver une solution. Quelqu'un peut-il m'aider?

Je ne ai pu obtenir les informations suivantes:

final String filename = "...path..."; 
    IContainer container = IContainer.make(); 
    int result = container.open(filename, IContainer.Type.READ, null); 
    if (result < 0) 
     throw new RuntimeException("Failed to open media file"); 
    int numStreams = container.getNumStreams(); 
    long duration = container.getDuration(); 
    long fileSize = container.getFileSize(); 
    long bitRate = container.getBitRate(); 
    System.out.println("Number of streams: " + numStreams); 
    System.out.println("Duration (ms): " + duration); 
    System.out.println("File Size (bytes): " + fileSize); 
    System.out.println("Bit Rate: " + bitRate); 
    for (int i = 0; i < numStreams; i++) { 
     IStream stream = container.getStream(i); 
     IStreamCoder coder = stream.getStreamCoder(); 
     System.out.println("*** Start of Stream Info ***"); 
     System.out.printf("stream %d: ", i); 
     System.out.printf("type: %s; ", coder.getCodecType()); 
     System.out.printf("codec: %s; ", coder.getCodecID()); 
     System.out.printf("duration: %s; ", stream.getDuration()); 
     System.out.printf("start time: %s; ", container.getStartTime()); 
     System.out.printf("timebase: %d/%d; ", stream.getTimeBase().getNumerator(), 
       stream.getTimeBase().getDenominator()); 
     System.out.printf("coder tb: %d/%d; ", coder.getTimeBase().getNumerator(), 
       coder.getTimeBase().getDenominator()); 
     System.out.println(); 
     if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) { 
      System.out.printf("sample rate: %d; ", coder.getSampleRate()); 
      System.out.printf("channels: %d; ", coder.getChannels()); 
      System.out.printf("format: %s", coder.getSampleFormat()); 
     } else if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) { 
      System.out.printf("width: %d; ", coder.getWidth()); 
      System.out.printf("height: %d; ", coder.getHeight()); 
      System.out.printf("format: %s; ", coder.getPixelType()); 
      System.out.printf("frame-rate: %5.2f; ", coder.getFrameRate().getDouble()); 
     } 
     System.out.println(); 
     System.out.println("*** End of Stream Info ***"); 

MISE À JOUR 07/06/2017 Je viens d'essayer avec VLCJ, mais je ne peux pas obtenir la liste des chapitres.

File file = new File("ia_ISL_13_r720P.m4v"); 

    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "vlc64/"); 
    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 

    MediaPlayerFactory mpf = new MediaPlayerFactory(); 
    EmbeddedMediaPlayer emp = mpf.newEmbeddedMediaPlayer(); 

    MediaMeta mediaMeta = mpf.getMediaMeta(file.getAbsolutePath(), true); 
    MediaMetaData asMediaMetaData = mediaMeta.asMediaMetaData(); 
    System.out.println(asMediaMetaData.getAlbum()); 
    System.out.println(asMediaMetaData.getArtist()); 
    System.out.println(asMediaMetaData.getTitle()); 

    emp.prepareMedia(file.getAbsolutePath()); 
    emp.play(); 
    emp.nextChapter(); // -> GO NEXT CHAPTER - SUCCESS 

    List<List<String>> allChapterDescriptions = emp.getAllChapterDescriptions(); 

    for (List<String> list : allChapterDescriptions) { 
     for (String string : list) { 
      System.out.println(string); 
     } 
    } 
+0

Quelqu'un peut-il vous aider avec quoi? Quel est le problème exact avec votre code? Des exceptions? S'il vous plaît clarifier votre question! –

+0

J'avais écrit: (J'ai juste besoin de la liste des chapitres de MP4/M4V Video). Le code ne contient aucune erreur. Quoi qu'il en soit, j'ai mis à jour le post. – MrSax

+0

MISE À JOUR 07.06.2017 – MrSax

Répondre

0

avez-vous testé Mp4Chapters? Est pour .net mais est open source et peut-être aide. Je l'utilise dans un projet C# Je suppose que c'est similaire à ce que vous faites, très similaire ... Ici je nourris une liste avec les chapitres mp4 et m4v, avec les anciennes coutures des fichiers mp4 et m4v pour fonctionner correctement, mais aM ayant des problèmes avec de nouveaux (2014 ->)

using Mp4Chapters; 

// more code here... 

private void readChapters(string inputFull) 
{ 
      using (var str = File.OpenRead(this.inputFull)) 
      { 
       var extractor = new ChapterExtractor(new StreamWrapper(str)); 
       extractor.Run(); 
       // build the listbox 
       foreach (var c in extractor.Chapters ?? new ChapterInfo[0]) 
       { 
        this.lb_chapters.Items.Add(new { chapterTime = c.Time, chapterName = c.Name }); 
       } 
      } 
} 

Autres options consiste à analyser le fichier vidéo en utilisant ffmpeg et lire le résultat:

ffmpeg -i ia_ISL_13_r720P.m4v -f ffmetadata metadata.txt

J'espère que cela aide, laissez moi sais. (désolé pour l'anglais, n'est pas ma langue principale)