Arhn - архитектура программирования

vlcj JPanel рисует поверх mediaPlayerComponent

У меня есть полностью функциональный видеоплеер на основе VLCj, как показано ниже.

Рабочий код

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;

/**
 * Minimal quick-start example.
 */
public class Example1 {

    private final JFrame frame;

    private final EmbeddedMediaPlayerComponent mediaPlayerComponent;

    public static void main(String[] args) {
        new NativeDiscovery().discover();

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example1().start("file:///C:/video.avi");
            }
        });
    }

    public Example1() {
        mediaPlayerComponent = new EmbeddedMediaPlayerComponent();

        frame = new JFrame("vlcj quickstart");
        frame.setLocation(50, 50);
        frame.setSize(1400, 800);
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(mediaPlayerComponent, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(320, 240));
        frame.pack();
        frame.setVisible(true);
    }

    private void start(String mrl) {
        mediaPlayerComponent.getMediaPlayer().playMedia(mrl);
    }
}

Изменения в коде для рисования поверх видео

Мне нужно нарисовать поверх видео (например, прямоугольник). Для этого я создал MyJPanel.

class MyPanel extends JPanel {
    private EmbeddedMediaPlayerComponent comp;

    public MyPanel(EmbeddedMediaPlayerComponent mediaPlayerComponent) {
        add(this.comp = mediaPlayerComponent);
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawRect(10, 10, 200, 100);
    }
}

И вместо строки:

frame.getContentPane().add(mediaPlayerComponent, BorderLayout.CENTER);

Я добавил:

frame.getContentPane().add(new MyPanel(mediaPlayerComponent), BorderLayout.CENTER);

Проблема:

После добавления MyPanel я получаю эту ошибку: и видео не отображается.

[0000000029d930e0] Ошибка демультиплексора avi: не задан ключевой кадр для дорожки 0

[0000000029e035d0] ошибка отображения ядра vout: не удалось установить сверху

01.06.2016

  • Вы смотрели Marquee? 02.06.2016

Ответы:


1

Вы просто не можете использовать Java2D для рисования поверх тяжелой видеоповерхности AWT Canvas.

Однако есть ряд других подходов, которые вы можете использовать для рендеринга поверх видео:

  1. Используйте собственный API бегущей строки — он ограничен рендерингом текста.
  2. Используйте собственный API логотипов — конечно, это ограничивается рендерингом растровых изображений, а не рисованием примитивов, таких как прямоугольник.
  3. Используйте «прямой» медиаплеер — здесь вы сами рендерите видео и можете использовать Java2D для рендеринга поверх видео. Однако медиаплееры с прямым рендерингом более требовательны к производительности.
  4. Наложите прозрачное окно верхнего уровня поверх поверхности видео и выполните рендеринг в него с помощью Java2D обычным способом. Это не идеально, так как вы должны синхронизировать окно наложения с положением и размером поверхности видео, и при этом оно может отставать. У vlcj есть API, который помогает с этим, и пример приложения, демонстрирующий это: vlcj/test/overlay/OverlayTest.java" rel="nofollow">https://github.com/caprica/vlcj/blob/d4c6dd5a0cb9f617fe236ea55fcf21b3fea588e8/src/test/java/uk/co/caprica/vlcj/test/overlay/ Оверлейтест.java

Я думаю, что № 4, хотя и не идеален, вероятно, лучшее, что вы можете сделать, и наиболее близко к тому, о чем вы просите.

02.06.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..