2015-10-24 4 views
0

У меня есть черные полосы вокруг моего видеоплеера, как показано на рисунке ниже. Как я могу избавиться от них? Я попытался установить размеры в классе AVPlayer, но в то время как это остановило случайное изменение размера видеопроигрывателя, оно не избавилось от черных полос.Как удалить черные полосы из холста vlcj и расширить холст до двух строк GridBagLayout?

Мой второй вопрос: как сделать так, чтобы видеоплеер сидел там, где он есть сейчас, но немного движется вверх, чтобы верхняя часть проигрывателя находилась в том же ряду, что и выпадающий список? Сейчас он находится в той же строке, что и JLabel, отображающий «английский», но я хочу, чтобы он расширялся на обеих строках.

enter image description here

Ниже вы найдете мой SSCCE. Это еще немного, но я избавился от всех зависимостей. Вы должны получить изображение выше, если вы его скомпилируете. Я поместил класс AVPlayer в качестве внутреннего класса для упрощения кода, на самом деле он имеет свой собственный класс. Вам нужно будет добавить источник видео для воспроизведения видеопроигрывателя.

public class SSCCE extends JPanel { 

private final JLabel kanjiLabel; 
private final JLabel englishLabel; 
private final JPanel wordPanel, cbPanel; 
private final JComboBox chapters; 
private final DefaultComboBoxModel model; 
private final JLabel chapLabel = new JLabel("Chapter"); 
private AVPlayer player; 

private final GridBagConstraints constraints = new GridBagConstraints(); 

public SSCCE() { 
    setLayout(new GridBagLayout()); 
    setConstraints(); 

    //wordPanel 
    wordPanel = new JPanel(); 
    wordPanel.setLayout(new BoxLayout(wordPanel, BoxLayout.Y_AXIS)); 
    wordPanel.setPreferredSize(new Dimension(500, 150)); 

    kanjiLabel = new JLabel(); 
    englishLabel = new JLabel(); 

    kanjiLabel.setFont(new java.awt.Font("Dialog", 0, 50)); 
    englishLabel.setFont(new java.awt.Font("Dialog", 0, 40)); 

    wordPanel.add(englishLabel); 
    wordPanel.add(Box.createRigidArea(new Dimension(10, 10))); 
    wordPanel.add(kanjiLabel); 

    //chapter combox 
    chapters = new JComboBox(); 
    model = new DefaultComboBoxModel(); 
    chapters.setModel(model); 
    cbPanel = new JPanel(); 
    addCB(); 

    constraints.gridy += 1; 
    add(wordPanel, constraints); 
    //add the audio video panel 
    player = new AVPlayer(); 
    constraints.gridx += 1; 
    add(player, constraints); 
} 

private void setConstraints() { 
    constraints.gridx = 0; 
    constraints.gridy = 0; 
    constraints.insets = new Insets(5, 5, 5, 5); 
    constraints.anchor = GridBagConstraints.CENTER; 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.weightx = 1.0; 
    constraints.weighty = 0.0; 
} 

private void addCB() { 
    setConstraints(); 
    cbPanel.removeAll(); 
    cbPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5)); 
    cbPanel.add(chapLabel); 
    cbPanel.add(chapters); 
    add(cbPanel, constraints); 

} 

public void displayNewWord() { 

    kanjiLabel.setText("Kanji"); 
    englishLabel.setText("English"); 
    player.playVideo("video.mp4"); //replace this with a video on your computer 
    revalidate(); 
    repaint(); 
} 

public class AVPlayer extends JPanel { 

    private static final String VLCPATH = "C:\\VideoLAN\\VLC"; 

    private final MediaPlayerFactory mpf; 
    private final EmbeddedMediaPlayer emp; 

    public AVPlayer() { 

     //this panels sizes 
     setPreferredSize(new Dimension(150, 150)); 
     setMinimumSize(new Dimension(150, 150)); 
     setMaximumSize(new Dimension(150, 150)); 

     //canvas 
     setLayout(new BorderLayout()); 
     Canvas canvas = new Canvas(); 
     canvas.setPreferredSize(new Dimension(150, 150)); 

     add(canvas, BorderLayout.CENTER); 

     //load the native vlc library 
     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), VLCPATH); 
     Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 
     mpf = new MediaPlayerFactory(); 

     emp = mpf.newEmbeddedMediaPlayer(); 
     emp.setVideoSurface(mpf.newVideoSurface(canvas)); 

    } 

    public void playVideo(String path) { 
     emp.prepareMedia(path); 
     emp.play(); 
     emp.setRepeat(true); 
    } 
} 
} 

И основной метод

JFrame frame = new JFrame(); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    SSCCE sscce = new SSCCE(); 
    frame.add(sscce, BorderLayout.NORTH); 

    frame.setVisible(true); 
    sscce.displayNewWord(); 
    frame.revalidate(); 
+0

Лучше не задавать два разных вопроса в одном сообщении и вместо этого размещать их как отдельные вопросы. Ваш второй вопрос не связан с vlcj и является более общим вопросом Swing. Я добавил ответ на первый вопрос, который вы задали (о vlcj). – caprica

ответ

1

Черные полосы являются частью выходного видеосигнала от встроенного VLC медиа-плеер.

Чтобы избавиться от них, вам необходимо установить соответствующее соотношение сторон и/или геометрию посевного материала.

Например:

mediaPlayer.setCropGeometry("4:3");   // W:H 
mediaPlayer.setCropGeometry("719x575+0+0"); // WxH+L+T 
mediaPlayer.setCropGeometry("6+10+6+10"); // L+T+R+B 
mediaPlayer.setAspectRatio("185:100"); 

Только вы знаете, что правильные значения должны быть.

В качестве альтернативы, если черные полосы не находятся в исходном видеовыходе, это обусловлено тем, что ваш размер Canvas не имеет того же формата изображения, что и видео.

Вы можете решить, какую из двух проблем у вас есть, установив фон Canvas на другой цвет.

+0

Так вот что происходит. Я думал, что это происходит, потому что JPanel и холст не были должным образом оценены. Спасибо, что предоставили мне эти методы, я должен был бы понять, что происходит отсюда, экспериментируя. – Aeleon