2013-04-05 3 views
2

Je rencontre un problème pour lire des vidéos YouTube avec vlcj. Jusqu'à la semaine dernière, tout fonctionnait. J'appelais mediaPlayer.playMedia ("http://www.youtube.com/watch?v=1t8fl96HPQI") et fonctionnait bien mais pas plus. il ne produit aucune erreur du tout. Notez que je peux lire des fichiers locaux et d'autres URL de diffusion en ligne, mais pas des vidéos YouTube.Lecture de vidéos youtube avec vlcj ne fonctionne plus

Ceci est le code que j'utilise. (Essentiellement son exemple prêt)

/* 
* This file is part of VLCJ. 
* 
* VLCJ is free software: you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation, either version 3 of the License, or 
* (at your option) any later version. 
* 
* VLCJ is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with VLCJ. If not, see <http://www.gnu.org/licenses/>. 
* 
* Copyright 2009, 2010, 2011 Caprica Software Limited. 
*/ 

package com.javacodegeeks.youtube.test; 

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Frame; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.List; 

import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.EmptyBorder; 

import uk.co.caprica.vlcj.binding.internal.libvlc_media_t; 
import uk.co.caprica.vlcj.player.MediaPlayer; 
import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter; 
import uk.co.caprica.vlcj.player.MediaPlayerFactory; 
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; 
import uk.co.caprica.vlcj.test.VlcjTest; 

/** 
* A minimal YouTube player. 
* <p> 
* The URL/MRL must be in the following format: 
* <pre> 
* http://www.youtube.com/watch?v=000000 
* </pre> 
* The only thing that makes this different from a 'regular' media player 
* application is the following piece of code: 
* <pre> 
* mediaPlayer.setPlaySubItems(true); // <--- This is very important for YouTube media 
* </pre> 
* Note that it is also possible to programmatically play the sub-item in 
* response to events - this is slightly more complex but more flexible. 
* <p> 
* The YouTube web page format changes from time to time. This means that the 
* lua scripts that vlc provides to parse the YouTube web pages when looking 
* for the media to stream may not work. If you get errors, especially errors 
* alluding to malformed urls, then you may need to update your vlc version to 
* get newer lua scripts. 
*/ 
public class NewClass extends VlcjTest { 

    private MediaPlayerFactory factory; 
    private EmbeddedMediaPlayer mediaPlayer; 
    private Frame mainFrame; 

    private JLabel urlLabel; 
    private JTextField urlTextField; 
    private JButton playButton; 

    public static void main(String[] args) throws Exception { 
    setLookAndFeel(); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     new NewClass().start(); 
     } 
    }); 
    } 

    public NewClass() { 
    mainFrame = new Frame("vlcj YouTube Test"); 
    mainFrame.setIconImage(new ImageIcon(getClass().getResource("/icons/vlcj-logo.png")).getImage()); 
    mainFrame.setSize(800, 600); 
    mainFrame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
     exit(0); 
     } 
    }); 
    mainFrame.setLayout(new BorderLayout()); 

    JPanel cp = new JPanel(); 
    cp.setBackground(Color.black); 
    cp.setLayout(new BorderLayout()); 

    JPanel ip = new JPanel(); 
    ip.setBorder(new EmptyBorder(4, 4, 4, 4)); 
    ip.setLayout(new BoxLayout(ip, BoxLayout.X_AXIS)); 

    urlLabel = new JLabel("URL:"); 
    urlLabel.setDisplayedMnemonic('u'); 
    urlLabel.setToolTipText("Enter a URL in the format http://www.youtube.com/watch?v=000000"); 
    urlTextField = new JTextField(40); 
    urlTextField.setFocusAccelerator('u'); 
    urlTextField.setToolTipText("Enter a URL in the format http://www.youtube.com/watch?v=000000"); 
    playButton = new JButton("Play"); 
    playButton.setMnemonic('p'); 

    ip.add(urlLabel); 
    ip.add(urlTextField); 
    ip.add(playButton); 

    cp.add(ip, BorderLayout.NORTH); 

    Canvas vs = new Canvas(); 
    vs.setBackground(Color.black); 
    cp.add(vs, BorderLayout.CENTER); 

    mainFrame.add(cp, BorderLayout.CENTER); 

    urlTextField.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     play(); 
     } 
    }); 

    playButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     play(); 
     } 
    }); 

    factory = new MediaPlayerFactory(); 

    mediaPlayer = factory.newEmbeddedMediaPlayer(); 
    mediaPlayer.setVideoSurface(factory.newVideoSurface(vs)); 

    mediaPlayer.setPlaySubItems(true); // <--- This is very important for YouTube media 

    mediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventAdapter() { 
     @Override 
     public void mediaSubItemAdded(MediaPlayer mediaPlayer, libvlc_media_t subItem) { 
     List<String> items = mediaPlayer.subItems(); 
     System.out.println(items); 
     System.out.println(mediaPlayer.subItemCount()); 
     } 
    }); 
    } 

    private void start() { 
    mainFrame.setVisible(true); 
    } 

    private void play() { 
    String mrl = urlTextField.getText(); 
    mediaPlayer.playMedia(mrl); 

    } 

    private void exit(int value) { 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 
    factory.release(); 
    System.exit(value); 
    } 

    /** 
    * Set the cross platform look and feel. 
    * 
    * @throws Exception if an error occurs 
    */ 

// private static void setLookAndFeel() throws Exception { 
// String lookAndFeelClassName = null; 
// LookAndFeelInfo[] lookAndFeelInfos = UIManager.getInstalledLookAndFeels(); 
// for(LookAndFeelInfo lookAndFeel : lookAndFeelInfos) { 
//  if("Nimbus".equals(lookAndFeel.getName())) { 
//  lookAndFeelClassName = lookAndFeel.getClassName(); 
//  } 
// } 
// if(lookAndFeelClassName == null) { 
//  lookAndFeelClassName = UIManager.getSystemLookAndFeelClassName(); 
// } 
// UIManager.setLookAndFeel(lookAndFeelClassName); 
// } 
} 

Pour les vidéos youtube vous voulez ce code:

mediaPlayer.setPlaySubItems(true); // <--- This is very important for YouTube media 

et le code ci-dessous obtient tous les sous-éléments.

mediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventAdapter() { 
     @Override 
     public void mediaSubItemAdded(MediaPlayer mediaPlayer, libvlc_media_t subItem) { 
     List<String> items = mediaPlayer.subItems(); 
     System.out.println(items); 
     System.out.println(mediaPlayer.subItemCount()); 
     } 
    }); 

Quand il travaillait, je remarquais que le code ci-dessus a été l'impression 2, l'un des sous-éléments d'entre eux étant l'URL de la vidéo.

Mais maintenant, il imprime un seul sous-élément comme ceci:

[http://www.youtube.com/get_video_info?video_id=1t8fl96HPQI & el = detailpage]

qui n'est pas l'URL de la vidéo et je pense que c'est pourquoi ne joue pas.

Des idées sur les raisons pour lesquelles cela se produit? Est-ce que google a changé quelque chose dans le format de ses pages youtube?

J'ai essayé de mettre à jour le fichier vlc youtube.lua comme cela a été suggéré dans un tutoriel que j'ai trouvé mais sans succès.

En outre, lorsque j'utilise le même lien dans vlc, cela fonctionne très bien.

Spécifications:

Ubuntu 12.0.4 64 bits

VLC media player 2.0.5 Twoflower

vlcj 2.2.0

Merci à l'avance,

Marios

Répondre

0

Google a-t-il changé quelque chose dans le format de ses pages YouTube?

Très probablement. Cela arrive tout le temps, au point que je ne compte pas sur cette fonctionnalité dans mon application (même si ce serait bien si je pouvais.) C'est trop capricieux, un petit changement à la disposition de Youtube et ça s'arrête travail. Je ne suis pas sûr que le fichier Lua utilisé par VLCJ est le même que l'installation de VLC (bien que je puisse me tromper là.)

Questions connexes