2012-06-13 5 views
4

Je tente de traduire un grand nombre d'images tamponnées (images pré-enregistrées créées à la volée par mon application) dans une vidéo en utilisant Java et, espérons-le, une bibliothèque qui peut aider le processus.Encode une vidéo dans h264 en utilisant des images tamponnées?

J'ai exploré un certain nombre d'options différentes, telles que jcodec (il n'y avait pas de documentation sur la façon de l'utiliser). Xuggler (impossible de l'exécuter en raison de problèmes de compatibilité avec jdk5 et ses bibliothèques associées). et un certain nombre d'autres bibliothèques qui avaient une documentation très médiocre. J'essaie de trouver une bibliothèque que je peux utiliser qui utilise java pour (1) créer des vidéos h264 en écrivant des images tamponnées image par image et (2) a une documentation pour que je puisse comprendre comment utiliser la digue chose.

Des idées sur ce que je devrais examiner?

Si le code source Java pur existe quelque part qui peut réaliser cela, je serais très intéressé à le voir. Parce que j'aimerais voir comment la personne a réalisé la fonctionnalité et comment je pourrais l'utiliser!

Merci à l'avance ...

+0

Combien de temps votre programme a pour encoder '' BufferedImages' à Vidéo'? – Mavie

Répondre

1

Voici comment vous pouvez le faire avec JCodec:

public class SequenceEncoder { 
    private SeekableByteChannel ch; 
    private Picture toEncode; 
    private RgbToYuv420 transform; 
    private H264Encoder encoder; 
    private ArrayList<ByteBuffer> spsList; 
    private ArrayList<ByteBuffer> ppsList; 
    private CompressedTrack outTrack; 
    private ByteBuffer _out; 
    private int frameNo; 
    private MP4Muxer muxer; 

    public SequenceEncoder(File out) throws IOException { 
     this.ch = NIOUtils.writableFileChannel(out); 

     // Transform to convert between RGB and YUV 
     transform = new RgbToYuv420(0, 0); 

     // Muxer that will store the encoded frames 
     muxer = new MP4Muxer(ch, Brand.MP4); 

     // Add video track to muxer 
     outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25); 

     // Allocate a buffer big enough to hold output frames 
     _out = ByteBuffer.allocate(1920 * 1080 * 6); 

     // Create an instance of encoder 
     encoder = new H264Encoder(); 

     // Encoder extra data (SPS, PPS) to be stored in a special place of 
     // MP4 
     spsList = new ArrayList<ByteBuffer>(); 
     ppsList = new ArrayList<ByteBuffer>(); 

    } 

    public void encodeImage(BufferedImage bi) throws IOException { 
     if (toEncode == null) { 
      toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420); 
     } 

     // Perform conversion 
     transform.transform(AWTUtil.fromBufferedImage(bi), toEncode); 

     // Encode image into H.264 frame, the result is stored in '_out' buffer 
     _out.clear(); 
     ByteBuffer result = encoder.encodeFrame(_out, toEncode); 

     // Based on the frame above form correct MP4 packet 
     spsList.clear(); 
     ppsList.clear(); 
     H264Utils.encodeMOVPacket(result, spsList, ppsList); 

     // Add packet to video track 
     outTrack.addFrame(new MP4Packet(result, frameNo, 25, 1, frameNo, true, null, frameNo, 0)); 

     frameNo++; 
    } 

    public void finish() throws IOException { 
     // Push saved SPS/PPS to a special storage in MP4 
     outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList)); 

     // Write MP4 header and finalize recording 
     muxer.writeHeader(); 
     NIOUtils.closeQuietly(ch); 
    } 
} 
+1

En fait, vous avez tapé la classe de https://github.com/jcodec/jcodec/blob/master/src/main/java/org/jcodec/api/SequenceEncoder.java. Pourriez-vous clarifier la raison? Pourquoi OP devrait réécrire cette classe? – CAMOBAP

+0

@CAMOBAP ou à partir de http://stackoverflow.com/q/17695475/5353361. 'RgbToYuv420',' CompressedTrack' et la plupart des méthodes ne sont pas importées dans Eclipse à partir de jcodec-0.1.9.jar. La même chose peut être dite pour le tutoriel sur http://jcodec.org/. Pourtant, le github a été mis à jour il y a seulement 3 jours. Pourquoi les gens continuent-ils à publier des «SequenceEncoder» cassés? – John

1

jcodec maintenant (jcodec-0.1.9.jar) comprend SequenceEncoder qui permet directement écrit BufferedImage s à un flux vidéo.

J'ai passé un certain temps à corriger l'importation par défaut de cette nouvelle classe dans Eclipse. Après avoir enlevé la première importation, en essayant (comme je le disais plus haut, je ne pouvais pas trouver certaines des classes) pour créer mon propre en utilisant le code de Stanislav et réimporter j'ai repéré l'erreur:

import org.jcodec.api.awt.SequenceEncoder; 
//import org.jcodec.api.SequenceEncoder; 

Le second est complètement dépréciée sans documentation me dirigeant vers ce dernier.

La méthode proportionnelle est alors:

private void saveClip(Trajectory traj) { 
    //See www.tutorialspoint.com/androi/android_audio_capture.htm 
    //for audio cap ideas. 
    SequenceEncoder enc; 
    try { 
     enc = new SequenceEncoder(new File("C:/Users/WHOAMI/today.mp4")); 
     for (int i = 0; i < BUFF_COUNT; ++i) { 
      BufferedImage image = buffdFramToBuffdImage(frameBuff.get(i)); 
      enc.encodeImage(image); 
     } 
     enc.finish(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+1

'jcodec' crée une vidéo au format' QuickTime' et prend beaucoup de temps par image (ou BufferedImage). – Mavie

Questions connexes