2010-12-08 6 views
2

Je voudrais activer la lecture vidéo HD pour mon application Java Swing, mais je suis préoccupé par l'évolutivité et le manque apparent d'accès direct en écriture d'écran. J'ai une bibliothèque C++ native qui va encoder et décoder (h.264) J'accèderai à cette librairie via JNI et ça retournera un int [] que je vais rendre à l'écran.Vidéo HD en Java Swing? Trop lent?

Les performances de codage/décodage sont assez bonnes jusqu'à présent grâce à JNI. Cependant, je suis préoccupé par les frais généraux de rendu. Je voudrais avoir plusieurs rendus de vidéo ouverts en même temps, donc je voudrais m'assurer que je fais les choses de la manière la plus efficace possible.

Est-ce la manière la plus efficace de rendre la vidéo avec Java/Swing? Est-il possible que je puisse écrire directement à l'écran et ne pas avoir à passer par le système de peinture Java?

Voici comment mon code ressemble: ` VideoDisplay public class étend JLabel {

BufferedImage m_bufferedImage = null; 


public VideoDisplay(Dimension frameSize) { 
    // If there is nothing to show, make sure the widget is black. 
    setBackground(Color.black); 

    m_bufferedImage = new BufferedImage(frameSize.width, frameSize.height, 
      BufferedImage.TYPE_INT_ARGB); 

    ImageIcon frameIcon = new ImageIcon(m_bufferedImage); 
    setIcon(frameIcon); 

} 

public void displayNewFrame(int[] newPixels, Dimension imageSize) { 
    m_bufferedImage.setRGB(0, 0, imageSize.width, imageSize.height, 
      newPixels, 0, imageSize.width); 
    repaint(); 

} 

}`

En ce moment, ma tête pour l'affichage vidéo 720p à 24fps semble être d'environ 6% CPU sur un processeur Core2 Quad 6600.

Y a-t-il un moyen plus rapide de le faire?

+0

Jetez un oeil à JMF (Java Media Framework): http://en.wikipedia.org/wiki/Java_Media_Framework – Jesper

+2

Java Media Framework est ancien et n'a pas été mis à jour depuis des lustres . Il ne supporte pas beaucoup de formats. – bradforj287

Répondre

1

Vous devriez contourner Java complètement et soit utiliser une surface, ou mettre les données dans un tampon direct et un image volatile retour ceci. Edit: ne semble pas que vous pourriez être en mesure de faire ce dernier facilement. Quoi qu'il en soit, transférez les données d'image via JNI via un tampon d'octets direct. Vous pouvez obtenir un pointeur de tampon dans C.