Рендеринг HD-видео в Java Swing?Слишком медленно? - PullRequest
2 голосов
/ 08 декабря 2010

Я хотел бы включить воспроизведение HD-видео для своего приложения Java Swing, но меня беспокоит масштабируемость и явное отсутствие прямого доступа для записи на экран. У меня есть собственная библиотека C ++, которая будет выполнять кодирование и декодирование (h.264). Я получу доступ к этой библиотеке через JNI, и она вернет int [], который я буду отображать на экране.

Производительность кодирования / декодирования пока довольно хороша благодаря JNI. Я обеспокоен, однако, по поводу издержек рендеринга. Мне бы хотелось, чтобы одновременно открывалось несколько вариантов рендеринга видео, поэтому я хотел бы убедиться, что я делаю вещи максимально эффективным способом.

Это самый эффективный способ рендеринга видео с помощью Java / Swing? Есть ли способ, которым я могу писать прямо на экран и не проходить через систему рисования Java?

Вот так выглядит мой код: ` Открытый класс VideoDisplay расширяет 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();

}

} `

В настоящий момент мои накладные расходы на отображение видео с разрешением 720p со скоростью 24FPS, по-видимому, составляют около 6% ЦП на процессоре Core2 Quad 6600.

Есть ли более быстрый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

В проекте DJ Native Swing есть медиаплеер win32 и VLC, который может быть встроен в Swing: http://djproject.sourceforge.net/ns

1 голос
/ 23 февраля 2011

Вы должны полностью обойти Java и либо использовать поверхность, либо поместить данные в прямой буфер и нестабильное изображение обратно.

Изменить: не похоже, что вы могли бы сделать последнее легко. В любом случае, передавайте данные изображения через JNI через прямой байтовый буфер. Вы можете получить указатель буфера в C.

...