2015-12-02 109 views
2

我需要爲我的項目使用Java創建視頻播放器。我已經在互聯網上查了很多例子。其中一些運行,但不顯示任何屏幕,我只能聽到視頻的聲音。請幫我解決這個...使用Java創建視頻播放器

我使用下面的進口

import javax.media.*; 

編輯: 下面是我使用的代碼:

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import javax.swing.*; 
import javax.media.*; 

public class MediaPlayerDemo extends JFrame 
{ 
    private Player player; 
    private File file; 

    public MediaPlayerDemo() 
    { 
     super("Demonstrating the Java Media Player"); 

     JButton openFile = new JButton("Open file to play"); 
     openFile.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       openFile(); 
       createPlayer(); 
      } 
     }); 
     getContentPane().add(openFile, BorderLayout.NORTH); 

     setSize(300, 300); 
     show(); 
    } 

    private void openFile() 
    { 
     JFileChooser fileChooser = new JFileChooser(); 

     fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
     int result = fileChooser.showOpenDialog(this); 

     // user clicked Cancel button on dialog 
     if (result == JFileChooser.CANCEL_OPTION) 
      file = null; 
     else 
      file = fileChooser.getSelectedFile(); 
    } 

    private void createPlayer() 
    { 
     if (file == null) 
      return; 

     removePreviousPlayer(); 

     try 
     { 
      // create a new player and add listener 
      player = Manager.createPlayer(file.toURL()); 
      player.addControllerListener(new EventHandler()); 
      player.start(); // start player 
     } 
     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(this, "Invalid file or location", "Error loading file", 
      JOptionPane.ERROR_MESSAGE); 
     } 
    } 

    private void removePreviousPlayer() 
    { 
     if (player == null) 
      return; 

     player.close(); 

     Component visual = player.getVisualComponent(); 
     Component control = player.getControlPanelComponent(); 

     Container c = getContentPane(); 

     if (visual != null) 
      c.remove(visual); 

     if (control != null) 
      c.remove(control); 
    } 

    public static void main(String args[]) 
    { 
     MediaPlayerDemo app = new MediaPlayerDemo(); 

     app.addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
       System.exit(0); 
      } 
     }); 
    } 

    // inner class to handler events from media player 
    private class EventHandler implements ControllerListener 
    { 
     public void controllerUpdate(ControllerEvent e) 
     { 
      if (e instanceof RealizeCompleteEvent) 
      { 
       Container c = getContentPane(); 

       // load Visual and Control components if they exist 
       Component visualComponent = player.getVisualComponent(); 

       if (visualComponent != null) 
        c.add(visualComponent, BorderLayout.CENTER); 

       Component controlsComponent = player.getControlPanelComponent(); 

       if (controlsComponent != null) 
        c.add(controlsComponent, BorderLayout.SOUTH); 

       c.doLayout(); 
      } 
     } 
    } 
} 
+1

請分享您嘗試過的代碼。 –

+0

你能更具體地說明你在哪裏得到錯誤的代碼? –

+0

我可以運行代碼,但我不知道爲什麼我只能聽到我選擇的視頻的聲音,但它不顯示屏幕。 – Anna

回答

5

我用vlcj,它工作順利。它是java綁定到vlcj播放器的好東西,你不必提供任何驅動器,因爲vlcj已經在二進制發行版中包含了所有這些驅動器。

給它一個去,有爲你建的example of already working player

+0

假設我想分發我的播放器,我該如何做到這一點如果用戶將vlc庫安裝在不是默認位置的地方, – mautrok

1

嘗試JavaFX的媒體播放器:

可用編解碼器:

  • 音頻:MP3;包含未壓縮PCM的AIFF;包含未壓縮PCM的WAV;具有高級音頻編碼(AAC)音頻的MPEG-4多媒體容器
  • 視頻:包含VP6視頻和MP3音頻的FLV; MPEG-4多媒體 容器與H.264/AVC(高級視頻編碼)視頻壓縮。

這裏從Oracle的例子:

import javafx.application.Application; 
import javafx.collections.ListChangeListener; 
import javafx.collections.MapChangeListener; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaView; 
import javafx.scene.media.Track; 
import javafx.stage.Stage; 

/** 
* A sample media player which loops indefinitely over the same video 
*/ 
public class MediaPlayer extends Application { 
private static final String MEDIA_URL = "http://someserver/somedir/somefile.mp4"; 

private static String arg1; 

    @Override public void start(Stage stage) { 
     stage.setTitle("Media Player"); 

// Create media player 
     Media media = new Media((arg1 != null) ? arg1 : MEDIA_URL); 
     javafx.scene.media.MediaPlayer mediaPlayer = new javafx.scene.media.MediaPlayer(media); 
     mediaPlayer.setAutoPlay(true); 
     mediaPlayer.setCycleCount(javafx.scene.media.MediaPlayer.INDEFINITE); 

// Print track and metadata information 
     media.getTracks().addListener(new ListChangeListener<Track>() { 
public void onChanged(Change<? extends Track> change) { 
       System.out.println("Track> "+change.getList()); 
      } 
     }); 
     media.getMetadata().addListener(new MapChangeListener<String,Object>() { 
public void onChanged(MapChangeListener.Change<? extends String, ? extends Object> change) { 
       System.out.println("Metadata> "+change.getKey()+" -> "+change.getValueAdded()); 
      } 
     }); 

// Add media display node to the scene graph 
     MediaView mediaView = new MediaView(mediaPlayer); 
     Group root = new Group(); 
     Scene scene = new Scene(root,800,600); 
     root.getChildren().add(mediaView); 
     stage.setScene(scene); 
     stage.show(); 
    } 

public static void main(String[] args) { 
if (args.length > 0) { 
      arg1 = args[0]; 
     } 
     Application.launch(args); 
    } 
} 

https://blogs.oracle.com/javafx/entry/mpeg_4_multimedia_support_in

0

Java媒體框架可用於創建多媒體應用,如視頻和音頻播放器。

0

這裏是工作代碼。

package New; 

import java.net.URL; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.HPos; 
import javafx.geometry.Insets; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaPlayer.Status; 
import javafx.scene.media.MediaView; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class FxMediaExample2 extends Application { 
    public static void main(String[] args) { 
     Application.launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     // Locate the media content in the CLASSPATH 
     URL mediaUrl = getClass().getResource("Test.mp4"); 
     String mediaStringUrl = mediaUrl.toExternalForm(); 

     // Create a Media 
     Media media = new Media(mediaStringUrl); 

     // Create a Media Player 
     final MediaPlayer player = new MediaPlayer(media); 
     // Automatically begin the playback 
     player.setAutoPlay(true); 

     // Create a 400X300 MediaView 
     MediaView mediaView = new MediaView(player); 

     mediaView.setFitWidth(400); 
     mediaView.setFitHeight(300); 
     mediaView.setSmooth(true); 
     mediaView.setLayoutX(200); 
     mediaView.setLayoutY(200); 
     // Create the DropShadow effect 
     DropShadow dropshadow = new DropShadow(); 
     dropshadow.setOffsetY(5.0); 
     dropshadow.setOffsetX(5.0); 
     dropshadow.setColor(Color.RED); 

     mediaView.setEffect(dropshadow); 

     Rectangle rect4 = new Rectangle(35, 55, 95, 25); 
     rect4.setFill(Color.RED); 
     rect4.setStroke(Color.BLACK); 
     rect4.setStrokeWidth(1); 

     // Create the HBox 
     // HBox controlBox = new HBox(5, null, null); 

     // Create the VBox 
     VBox root = new VBox(1, mediaView); 

     GridPane gridpane = new GridPane(); 
     gridpane.setPadding(new Insets(95)); 
     gridpane.setHgap(1); 
     gridpane.setVgap(10); 

     GridPane.setHalignment(rect4, HPos.CENTER); 

     Group grp = new Group(); 
     gridpane.add(root, 1, 1); 

     grp.getChildren().add(gridpane); 

     // Create the Scene 
     Scene scene = new Scene(grp); 

     // Add the scene to the Stage 
     stage.setScene(scene); 
     // Set the title of the Stage 
     stage.setTitle("A simple Media Example"); 
     // Display the Stage 
     stage.show(); 
    } 
}