JavaFx веб-просмотр YouTube

Пару недель назад я использовал NetBeans для создания одного из примеров javafx
Проект webview, и он работал нормально.
Я особенно заинтересован в использовании javafx для воспроизведения видео на YouTube
в приложении swinginterop.
Это часть более крупного проекта, поэтому я использовал пример SwingInterop из NetBeans
для загрузки проигрывателей в JFrame.
Мне нужно загрузить более одного видео YouTube.
И снова все отлично сработало .
Я использую Windows XP, NetBeans 7.2, Java 1.7 9
В эти дни я снова попробовал приложение, но на этот раз на YouTube я вижу
«Это видео в настоящее время недоступно».
Первое, мне пришло в голову, что, возможно, у меня нет последней версии FlashPlayer ...
Излишне говорить, что я скачал все ...
Приложение больше не будет воспроизводить видео с YouTube
Я даже снова переустановил java и netbeans, но ничего не изменилось.
Я также упоминаю, что в Firefox, браузере, который у меня установлен на моем компьютере,
youtube работает нормально.
Это довольно неприятно знать, что ... . что-то было в порядке и может быть ...
я нашел способ что-то там запутать ...
Итак, прямо сейчас я могу видеть веб-страницы в javafx webview, но видео на YouTube все еще не воспроизводятся ... < br>

В последний раз, когда я просил о помощи, я не вставлял код ... извините за это.

Итак, я сделал еще один небольшой проект, в котором было всего два класса, чтобы показать, что я делал

Я не тестировал это на другом компьютере, потому что, если это случилось однажды - велика вероятность, что это повторится снова, и, поскольку что-то само собой не исправляется,
я хочу иметь возможность ответить на этот вопрос, когда он появится. < br>

Спасибо Джуэлси и Грегори за проявленный интерес

вот код:

фрейм, на который загружены игроки

package stackoverflow;

import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;

public class PlayersFrame extends JFrame
{
    public PlayersFrame()
    {
        // initialize jframe
        setLayout(null);
        setTitle("   YouTube on JFrame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        CreatePlayersList();
    }

    // all the players have the same size
    Dimension PlayerSize = new Dimension(300, 230);    

    private void CreatePlayersList()
    {
        /*
         * create an instance of playerclass
         * containing the location and the youtube embedded address
         * for each of the four players
         */

        Point NewPlayerLocation = null;
        PlayerClass NewPlayer = null;

        NewPlayerLocation = new Point(10, 10);
        NewPlayer = new PlayerClass(NewPlayerLocation, PlayerSize, "http://www.youtube.com/embed/SvcDwPlaWgw?rel=0");
        // add player1 class to the players list
        Players.add(NewPlayer);

        NewPlayerLocation = new Point(320, 10);
        NewPlayer = new PlayerClass(NewPlayerLocation, PlayerSize, "http://www.youtube.com/embed/L0huXvTeVvU?rel=0");
        // add player2 class to the players list
        Players.add(NewPlayer);

        NewPlayerLocation = new Point(10, 240);
        NewPlayer = new PlayerClass(NewPlayerLocation, PlayerSize, "http://www.youtube.com/embed/rHcnsEoSK_c?rel=0");
        // add player3 class to the players list
        Players.add(NewPlayer);

        NewPlayerLocation = new Point(320, 240);
        NewPlayer = new PlayerClass(NewPlayerLocation, PlayerSize, "http://www.youtube.com/embed/vaXuK-RsT6E?rel=0");
        // add player4 class to the players list
        Players.add(NewPlayer);

        // stand by
        LoadPlayers();
    }

    // list of players data
    List<PlayerClass> Players = new ArrayList<>();

    /*
     * a class to hold data about a player
     */
    public class PlayerClass
    {
        public PlayerClass(Point playerLocation, Dimension playerSize, String youTubeAddress)
        {
            PlayerLocation = playerLocation;
            PlayerSize = playerSize;
            YouTubeAddress = youTubeAddress;
        }
        public Point PlayerLocation = null;
        public Dimension PlayerSize = null;
        public String YouTubeAddress = null;
    }

    /*
     * in this swinginterop project i want to display youtube videos on a jframe
     * with webview i get more that i ask for
     * webview will display an entire web page
     * so a web page is created on the fly containing a frame for the player
     */
    private String GeneratePlayerPage(Dimension PlayerSize, String EmbeddedAddress)
    {
        String GeneratedPage = null;

        GeneratedPage = "<html>\n";        
        GeneratedPage += "<body>\n";        
        GeneratedPage += "<iframe\n";        
        GeneratedPage += "style=\"position:absolute;\n";
        GeneratedPage += "left:0px;top:0px;" + 
                "width:" + String.valueOf(PlayerSize.width) +
                "px;height:" + String.valueOf(PlayerSize.height) + "px;\"\n";
        GeneratedPage += "src=\"" + EmbeddedAddress + "\"" + "\n";
        GeneratedPage += "frameborder=\"0\" allowfullscreen>\n";        
        GeneratedPage += "</iframe>\n";        
        GeneratedPage += "</body>\n";        
        GeneratedPage += "</html>";

        return(GeneratedPage);
    }

    /*
     * why synchronized ? ...
     * 
     * each javafx object runs on it's own thread
     * this means that, sooner or later
     * you will have to deal with crossthreading issues
     * 
     * in this project it does not throw an error
     * but since the playersform will add controls on a locked procedure,
     * and i don't use a single player on the jframe,
     * some of the players will not appear on the frame.
     *
     * if only one player is loaded on the jframe
     * then all this is not necessary.
     *
     * i don't know if the players are there but are not rendered
     * or the players were just not loaded
     * 
     * with this synchronized void a callback from the javafx object is handled
     */
    public synchronized void OkPlayer()
    {
        try
        {
            /*
             * a player was loaded
             * delay before the next player
             */
            Thread.sleep(10);
        }
        catch(Exception Ex)
        {}

        /*
         * if the players list is empty than all the players have been loaded
         * but you also get an error, so check the size ...
         */
        if(Players.size() > 0)
        {
            LoadPlayers();
        }
    }

    void LoadPlayers()
    {
        /*
         * get the data from the first playerclass in the players list
         * and create a new player
         */
        PlayerClass TempPlayer = Players.get(0);
        Dimension playerSize = TempPlayer.PlayerSize;
        YouTubePlayer player = new YouTubePlayer(this, playerSize,
        GeneratePlayerPage(playerSize, TempPlayer.YouTubeAddress));
        add(player);        
        player.setLocation(TempPlayer.PlayerLocation);
        player.setSize(TempPlayer.PlayerSize);
        player.setVisible(true);
        // remove the used playerclass from the players list
        Players.remove(0);
    }
}

и игрок

package stackoverflow;

import java.awt.Dimension;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UnsupportedLookAndFeelException;

public final class YouTubePlayer extends JPanel
{
    public YouTubePlayer(PlayersFrame playersFrame, Dimension PlayerSize, String YouTubeAddress)
    {
        remote = playersFrame;
        init(PlayerSize, YouTubeAddress);
    }

    private static JFXPanel browserFxPanel;
    private Pane browser;

    public void init(Dimension playerSize, String youTubeAddress) 
    {
        final Dimension PlayerSize = playerSize;
        final String YouTubeAddress = youTubeAddress;
        browserFxPanel = new JFXPanel();
        browserFxPanel.setPreferredSize(new Dimension(PlayerSize.width, PlayerSize.height));        
        add(browserFxPanel);

        Platform.runLater(new Runnable() 
        {
            public void run() 
            {
                // inside the player's thread
                createScene(PlayerSize, YouTubeAddress);
            }
        });
    }

    /*
     * the program will start on the javafx thread
     * the main void is placed in the javafx component
     * 
     * maybe there are other ways to launch the program
     * but for this one it is good enough ... for now
     */
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                try
                {
                    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) 
                    {
                        // set windows look and feel
                        if ("Windows".equals(info.getName())) 
                        {
                            javax.swing.UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                }
                catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException Ex)//ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) 
                {}

                // create an instance of playersframe
                PlayersFrame LoadPlayers = new PlayersFrame();
                LoadPlayers.setSize(new Dimension(640, 520));
                // make it visible
                LoadPlayers.setVisible(true);        
            }
        });
    }

    PlayersFrame remote = null;

    private void createScene(Dimension PlayerSize, String YouTubeAddress) 
    {
        browser = createBrowser(PlayerSize, YouTubeAddress);
        browserFxPanel.setScene(new Scene(browser));        
        /*
         * player loaded
         * let playersform know that it can proceed
         * with the next player, if there still is one
         */
        remote.OkPlayer();
    }

    private Pane createBrowser(Dimension PlayerSize, String YouTubeAddress) 
    {
        WebView view = new WebView();
        view.setPrefSize(PlayerSize.width, PlayerSize.height);
        final WebEngine eng = view.getEngine();
        eng.loadContent(YouTubeAddress);
        GridPane grid = new GridPane();
        grid.getChildren().addAll(view);
        return grid;
    }
}

вот как это выглядит

http://i.stack.imgur.com/UvhcJ.jpg

и это "вещь"

http://i.stack.imgur.com/lB4uY.jpg

последний игрок действует так же, как и остальные

Если я использую пример из NetBeans и просто вставляю ссылку на YouTube
я получаю тот же результат

Мне действительно нужно знать, что происходит

Спасибо


person S_Teo    schedule 02.11.2012    source источник
comment
Добавьте ссылку на недоступное видео.   -  person jewelsea    schedule 03.11.2012
comment
Также поможет знание того, какая ОС и версия Java / JavaFX. Обновлялась ли ваша ОС недавно?   -  person AC2MO    schedule 03.11.2012
comment
привет, Грегори, я использую windows xp, у меня java 1.7_9 и netbeans 7.2   -  person S_Teo    schedule 03.11.2012
comment
Я загрузил последнюю версию sdk от оракула, ведьма включает javafx   -  person S_Teo    schedule 03.11.2012
comment
когда я компилирую программы javafx в netbeans, он говорит, что обнаружил javafx ant api 1.2, я понимаю, что ant используется для развертывания приложений javafx   -  person S_Teo    schedule 03.11.2012
comment
Я тестировал это на другом компьютере, и у меня такой же результат   -  person S_Teo    schedule 08.11.2012
comment
Я думаю, это как-то связано с webkit, что мне делать?   -  person S_Teo    schedule 08.11.2012
comment
В этой ветке обсуждалась аналогичная проблема: forum.oracle.com/thread/2467376   -  person ytw    schedule 28.08.2013


Ответы (1)


Ознакомьтесь с системными требованиями:

http://docs.oracle.com/javafx/2/system_requirements_2-2/jfxpub-system_requirements_2-2.htm

For Windows XP and Windows Vista, JavaFX Media 2.2 requires that one of the following external modules be installed to play AAC audio and H.264/AVC video: 
MainConcept H.264/AVC Pro Decoder Pack
DivX Plus Codec Pack
MainConcept Showcase (includes demo version codecs)

DivX можно загрузить бесплатно: http://www.divx.com/

Ссылка: https://forums.oracle.com/thread/2467376

person AZ_    schedule 11.09.2013