2013-04-05 147 views
2

我在使用vlcj播放youtube視頻時遇到問題。直到上週或所有事情都在發揮作用。 我打電話給mediaPlayer.playMedia(「http://www.youtube.com/watch?v=1t8fl96HPQI」),工作正常,但不再。它根本不會產生任何錯誤。 請注意,我可以播放本地文件和其他在線流式網址,但不能播放YouTube視頻。使用vlcj不能播放youtube視頻

這是我正在使用的代碼。 (基本上它是一個現成的例子)

/* 
* 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); 
// } 
} 

YouTube視頻你想這個代碼:

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()); 
     } 
    }); 

當它工作時,我注意到上面的代碼是打印2個子項目,其中之一是視頻的實際網址。

但現在只打印一個子項是這樣的:

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

這是不實際的URL視頻和我認爲多數民衆贊成爲什麼不玩。

爲什麼會發生這種情況的任何想法? Google是否改變了他們的YouTube網頁格式?

我試着升級vlc youtube.lua文件,正如在我找到的教程中提到的,但沒有運氣。

此外,當我在vlc中使用相同的鏈接,它工作正常。

規格:

Ubuntu的12.0.4 64位

VLC媒體播放器2.0.5 Twoflower

vlcj 2.2.0

由於提前,

馬里奧斯

回答

0

谷歌改變了他們的YouTube網頁格式的任何內容嗎?

最有可能。這種情況一直髮生,直到我不依賴於我的應用程序中的這個功能(儘管如果我可以的話它會很好)。它太過脾氣了,對Youtube的佈局做了一些小的改變,它停止了加工。我不確定VLCJ使用的Lua文件與VLC的安裝是否相同(儘管我可能在此出錯)。