2017-02-06 22 views
3

Мы с моим другом работали над проектом Java для создания простого медиаплеера с использованием классов Media, MediaPlayer и MediaView. Однако с самого начала у нас были проблемы с успешным открытием видео, которое мы используем в качестве тестового файла. После многих разрозненных исключений во время выполнения мы, наконец, выяснили, что источником нашей проблемы была строка, передаваемая в каждый объект (для среды требуется строка, представляющая путь к файлу в формате URI). После некоторых изменений, мы обнаружили, что следующий URI работал на моем компьютере, чтобы открыть файл:Сложность с синтаксисом URI и преобразование в строку

Media m = new Media("file:///C:/Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4"); 
MediaPlayer mp = new MediaPlayer(m); 
MediaView mv = new MediaView(mp); 

Однако позже мы пытались реализовать открытый метод, который позволил бы пользователю выбрать файл (как объект файла) они хотели играть. Когда мы сделали это, мы использовали следующую команду, чтобы открыть файл:

File currentFile = new File(null); 

FileChooser fc = new FileChooser(); 
fc.setTitle("Open"); 
currentFile = fc.showOpenDialog(null); 

Media m = new Media(currentFile.toURI().toString()); 
MediaPlayer mp = new MediaPlayer(m); 
MediaView mv = new MediaView(mp); 

Это начало давать нам во время выполнения исключения снова и поэтому мы использовали Println в консоль, чтобы выяснить, в чем проблема. Строка используется теперь два «/» S меньше того, что оно должно было быть:

"file:/C:/Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4" 

Однако, даже после изменения строки, мы до сих пор получил ту же ошибку во время выполнения, как только был выбран файл :

Exception in Application start method 
java.lang.RuntimeException: Exception in Application start method 
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 

Мы прокомментировали весь метод Open и вернулись к исходному коду, но продолжаем получать те же ошибки.

Наш полный код доступен здесь:

SmartPlay класс

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.scene.paint.Color; 
import java.io.File; 
import javafx.stage.FileChooser; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.application.Platform; 

public class SmartPlay extends Application { 
    File currentFile; 
    Scene scene; 

    @Override 
    public void start(Stage primary) { 
    primary.setTitle("SmartPlay"); 
    selectCurrentFileToOpen(); 
    //Player(currentFile.toURI().toString().substring(0,5)+"//"+currentFile.toURI().toString().substring(5)); 
    Player player = new Player("file:///C:/Users/mewww/Google%20Drive/Java/SmartPlay/EXOMonsterMV.mp4"); 

    scene = new Scene(player, 720, 480, Color.BLACK); 
    player.setTop(makeMenus()); 

    primary.setScene(scene); 
    primary.show(); 
    } 

    private MenuBar makeMenus() { 
     MenuBar mb = new MenuBar(); 
     Menu fileMenu = new Menu("File"); 
     MenuItem openItem = new MenuItem("Open..."); 
     openItem.setOnAction(e -> { 
      selectCurrentFileToOpen(); 
      scene.setRoot(new Player(currentFile.toURI())); 
     }); 
     MenuItem quitItem = new MenuItem("Quit"); 
     quitItem.setOnAction(e -> Platform.exit()); 
     fileMenu.getItems().addAll(openItem, quitItem); 
     return mb; 
    } 

    public boolean selectCurrentFileToOpen() { 
     FileChooser fc = new FileChooser(); 
     fc.setTitle("Open"); 
     currentFile = fc.showOpenDialog(null); 
     return true; 
    } 

    public void stop() { 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

класс игрока

import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaView; 
import java.net.URI; 

public class Player extends BorderPane { 
    Media m; 
    MediaPlayer mp; 
    MediaView mv; 
    Pane p; 
    MediaBar bar; 

    public Player(String file) { 
     m = new Media(file); 
     mp = new MediaPlayer(m); 
     mv = new MediaView(mp); 

     p = new Pane(); 
     p.getChildren().addAll(mv); 
     setCenter(p); 

     bar = new MediaBar(mp); 

     setBottom(bar); 

     setStyle("-fx-background-color:#cccccc"); 

     mp.play(); 
    } 
} 

MediaBar класс

import javafx.scene.layout.HBox; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.layout.Priority; 
import javafx.scene.control.Slider; 
import javafx.scene.control.Label; 
import javafx.scene.control.Button; 
import javafx.util.Duration; 

public class MediaBar extends HBox { 
    Slider time = new Slider(); 
    Slider vol = new Slider(); 

    Button playButton = new Button("Pause"); 
    Button halfSpeed = new Button("0.5x"); 
    Button normalSpeed = new Button("1.0x"); 
    Button doubleSpeed = new Button("2.0x"); 

    Label volume = new Label("Volume: "); 
    Label nowTime; 

    MediaPlayer player; 

    public MediaBar(MediaPlayer play) { 
     player = play; 

     setAlignment(Pos.CENTER); 
     setPadding(new Insets(5,10,5,10)); 

     vol.setPrefWidth(70); 
     vol.setMinWidth(30); 
     vol.setValue(100); 

     nowTime = new Label(formatTime(player.getCurrentTime()) + "/" + formatTime(player.getTotalDuration())); 
     HBox.setHgrow(time, Priority.ALWAYS); 

     playButton.setPrefWidth(30); 

     getChildren().addAll(playButton,time,nowTime,volume,vol);   
    } 

    public static String formatTime(Duration duration) { //StackOverflow: Jon Skeet 
     long seconds = (long) duration.toSeconds(); 
     long absSeconds = Math.abs(seconds); 
     String positive = String.format(
      "%d:%02d:%02d", 
      //absSeconds/3600, 
      (absSeconds % 3600)/60, 
      absSeconds % 60); 
     return seconds < 0 ? "-" + positive : positive; 
    } 
} 
+2

Является ли файл '':/C: /Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4 "' что вы на самом деле получили или только то, что, по вашему мнению, вы видели? и если первое, почему кавычки? И, пожалуйста, укажите оставшуюся часть трассировки стека. – EJP

+0

Это именно то, что было напечатано в журнале консоли, я просто использовал кавычки, чтобы идентифицировать его как строку. –

+0

И что было * актуальным * результатом изменения этой строки? – EJP

ответ

1

Итак, я запустил ваш код в командной строке, и мне удалось получить более конкретную ошибку отладки. Таким образом, похоже, что форматирование времени, которое вы делаете в своем MediaBar, вызывает ошибку. Я не знаю точно, что вы пытаетесь с этим сделать, но способ форматирования времени неверен. Если вы прокомментируете это, а также другие вещи, которые вы используете для добавления форматирования времени, путь URI будет правильным, и ваше видео должно работать нормально. Я знаю, что для форматирования вам не хватает «% 02d». Что касается того, что вы форматируете, я не слишком уверен, поэтому я не могу вам помочь.

+0

Я считаю, что для того, что вы хотите сделать, было бы проще использовать toMinutes() и toSeconds(), которые находятся в java.time и в классе продолжительности. Это поможет с преобразованием и просто отформатирует, как вы хотите. – mkahihu

 Смежные вопросы

  • Нет связанных вопросов^_^