2013-05-01 7 views
5

इसलिए मैंने हाल ही में जावा जावा के साथ काम करना शुरू कर दिया है ताकि मेरे जावा कार्यक्रमों में वीडियो और ऑडियो डालने और सम्मिलित किया जा सके। ऑडियो ने ठीक काम किया है, लेकिन हर बार जब मैं वीडियो फ़ाइल को चलाने और चलाने की कोशिश करता हूं, तो यह एक MEDIA_UNSUPPORTED अपवाद देता है। मैंने चारों ओर पढ़ा है और देखा है कि वीडियो फ़ाइल एमपी 4 (जो यह है) होने की आवश्यकता है, इसलिए मैंने इसे एक अलग प्रकार में परिवर्तित करने की कोशिश की और फिर इसे एमपी 4 (एच .264एएसी) में दो अलग-अलग कनवर्टर्स के साथ फिर से परिवर्तित कर दिया। कुछ नहीं बदलता है।एमपी 4 जावाएफएक्स में असमर्थित?

यहाँ कोड के साथ मैं काम कर रहा हूँ है: लाइन जहां "मीडिया" वस्तु आरंभ नहीं हो जाता (निर्माता की शुरुआत) पर

import java.net.URL; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javafx.application.Platform; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.embed.swing.JFXPanel; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.VBox; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaView; 
import javafx.util.Duration; 


public class CallVideo extends JFrame{ 

public static final String VID_URL = "file:/C:/Users/Public/Videos/Videos/testCon.mp4"; //http://static.clipcanvas.com/sample/clipcanvas_14348_H264_320x180.mp4 

private JFXPanel panel; 

public CallVideo(String url) 
{ 
    panel = new JFXPanel(); 
    Platform.runLater(new Runnable() 
    { 
     public void run() 
     { 
      final Media clip = new Media(VID_URL); 
      final MediaPlayer player = new MediaPlayer(clip); 
      final MediaView viewer = new MediaView(player); 
      viewer.setFitHeight(200); 
      viewer.setFitWidth(200); 
      final Button button = new Button("Bing Zzzzt!"); 
      button.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) 
       { 
        viewer.getMediaPlayer().seek(Duration.ZERO); 
        viewer.getMediaPlayer().play(); 
       } 
      }); 

     setMediaEventHandlers(viewer); 
      VBox vid = new VBox(); 
      vid.getChildren().addAll(viewer, button); 
      Scene aScene = new Scene(vid, 200, 200); 
      panel.setScene(aScene); 
     } 
    }); 
    this.add(panel); 
    this.setSize(500, 500); 
    this.setLocationRelativeTo(null); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.setVisible(true); 
} 

private void setMediaEventHandlers(final MediaView view) { 
    final MediaPlayer player = view.getMediaPlayer(); 

    System.out.println("Initial: " + player.getStatus()); 
    player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() { 
     @Override 
     public void changed(ObservableValue<? extends MediaPlayer.Status> observable, MediaPlayer.Status oldStatus, MediaPlayer.Status curStatus) { 
     System.out.println("Current: " + curStatus); 
     } 
    }); 

    if (player.getError() != null) { 
     System.out.println("Initial Error: " + player.getError()); 
    } 

    player.setOnError(new Runnable() { 
     @Override public void run() { 
     System.out.println("Current Error: " + player.getError()); 
     } 
    }); 
    } 

public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      new CallVideo(VID_URL); 
     } 
    }); 
} 

}

त्रुटि तब होती है। मुझे यह देखने के लिए कुल नुकसान हुआ है कि समस्या क्या है। मैं ऑडियो खेल लेकिन वीडियो प्रदर्शित नहीं के बारे में सवाल देखा है, लेकिन यह भी मेरे लिए काम नहीं करता है कि ...

मामले किसी में यह की जरूरत है:

ग्रहण

JDK 7

JavaFX 2.0

विंडोज 7 प्रो

संपादित करें:

सबसे पहले, मैंने देखा कि मैं वास्तव में जावाएफएक्स 2.0 का उपयोग कर रहा हूं ... क्या यह समस्या हो सकती है?

मैं जवाब में प्रदान की दोनों संस्करणों परीक्षण किया है, और दोनों (statusListener द्वारा कहा जाता है) यह त्रुटि लौटाते जब कि इसका जवाब द्वारा URL का उपयोग कर:

Current Error: MediaException: MEDIA_UNSUPPORTED : com.sun.media.jfxmedia.MediaException: "Error enter code herelocator unsupported media format" : com.sun.media.jfxmedia.MediaException: "Error locator unsupported media format" 

अपने ही फ़ाइल का उपयोग कर, कार्यक्रम मीडिया कन्स्ट्रक्टर को कॉल करने के तुरंत बाद यह त्रुटि लौटाती है:

Exception in thread "AWT-EventQueue-0" MediaException: MEDIA_UNSUPPORTED : Unrecognized file signature! 
at javafx.scene.media.Media.<init>(Media.java:382) 
at CallVideo.<init>(CallVideo.java:27) 
at CallVideo$5.run(CallVideo.java:90) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

मैंने ऊपर दिए गए कोड को अपडेट किया है।

सोल्ड! कारण वास्तव में मैं नौकरी के लिए एक अनुचित जावाएफएक्स (और संभवतः जेडीके) का उपयोग कर रहा था। मैं वास्तव में उस सामान के नियंत्रण में नहीं हूं क्योंकि ये स्कूल कंप्यूटर हैं, लेकिन इससे मुझे कुछ अच्छा लगा ... मदद के लिए धन्यवाद! मैंने इसे अपने अंतिम कोड के साथ अपडेट किया।

उत्तर

7

यह मेरे लिए कुछ मुद्दों को ठीक करने के लिए आपके प्रोग्राम को संशोधित करने के बाद मेरे लिए काम किया।

swingvideoplayer

कुछ परिवर्तन मैं लागू:

  1. एक MediaView वीडियो देखने के लिए है, तो एक बनाया है और देखा जा करने के लिए वीडियो के लिए आदेश में एक सक्रिय JavaFX दृश्य के लिए जोड़ा जा करने की जरूरत है के लिए आवश्यक है ।
  2. कुछ जावाएफएक्स नियंत्रण मुख्य धागे की बजाय जावाएफएक्स अनुप्रयोग धागे पर बनाए जाने की आवश्यकता है, अन्यथा आपको java.lang.IllegalStateException: Toolkit not initialized मिल जाएगा।
  3. निगरानी मीडिया त्रुटि घटनाओं और कुछ नैदानिक ​​लॉग जोड़ने से मीडिया एन्कोडिंग समस्याओं का निवारण करने में मदद मिलती है।

एक JavaFX एकमात्र समाधान

आपका कार्यक्रम एक स्विंग आवेदन जो थोड़ा अधिक जटिल है तो बस एक मानक JavaFX आवेदन में मीडिया खेलने में JavaFX एम्बेड करता है। एक मानक जावाएफएक्स अनुप्रयोग में एमपी 4 के प्लेबैक के लिए अनुरूप कोड मेरे उत्तर में प्रदान किया जाता है: Can't play mp4 converted file - JavaFX 2.1। केवल जावाएफएक्स का उपयोग करने की अनुशंसा की जाती है जब तक कि आपके पास स्विंग की विशिष्ट आवश्यकता न हो (जैसे कि मौजूदा जावा स्विंग एप्लिकेशन के अंदर अपने जावाएफएक्स आधारित मीडिया प्लेयर को एम्बेड करना)।

ओरेकल Incorporating Media Assets Into JavaFX Applications के लिए एक अच्छा ट्यूटोरियल प्रदान करता है।


JavaFX media package description मीडिया प्लेबैक एन्कोडिंग, कंटेनर और प्रोटोकॉल जो JavaFX का समर्थन करता है दर्ज होते हैं। का उपयोग कर एक JavaFX MediaPlayer

नोट एक स्विंग App से mp4 वीडियो प्ले बैक करने के लिए


नमूना नमूना ही संभव मीडिया त्रुटियों के एक सबसेट फैल जाती है। एक कोड टेम्पलेट के लिए जो सभी मीडिया त्रुटियों को पकड़ और लॉग कर सकता है JavaFX media error handling documentation देखें।

import javax.swing.*; 
import javafx.application.Platform; 
import javafx.beans.value.*; 
import javafx.embed.swing.JFXPanel; 
import javafx.event.*; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.VBox; 
import javafx.scene.media.*; 
import javafx.util.Duration; 

public class VideoPlayer extends JFrame { 

    public static final String VID_URL = 
    "http://static.clipcanvas.com/sample/clipcanvas_14348_H264_320x180.mp4"; 

    private static final int VID_WIDTH  = 320; 
    private static final int VID_HEIGHT = 180; 
    private static final int PLAYER_WIDTH = 320; 
    private static final int PLAYER_HEIGHT = 265; 

    private void play(final String url) { 
    final JFXPanel panel = new JFXPanel(); 
    Platform.runLater(new Runnable() { 
     @Override public void run() { 
     initFX(panel, url); 
     } 
    }); 
    this.add(panel); 
    this.setSize(PLAYER_WIDTH, PLAYER_HEIGHT); 
    this.setLocationRelativeTo(null); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.setVisible(true); 
    } 

    private void initFX(JFXPanel panel, String url) { 
    MediaView mediaView = createMediaView(url); 

    final Scene playerScene = new Scene(
     createPlayerLayout(mediaView), 
     PLAYER_WIDTH, 
     PLAYER_HEIGHT 
    ); 

    setMediaEventHandlers(
     mediaView 
    ); 

    panel.setScene(playerScene); 
    } 

    private MediaView createMediaView(String url) { 
    final Media clip = new Media(url); 
    final MediaPlayer player = new MediaPlayer(clip); 
    final MediaView view = new MediaView(player); 
    view.setFitWidth(VID_WIDTH); 
    view.setFitHeight(VID_HEIGHT); 
    return view; 
    } 

    private VBox createPlayerLayout(final MediaView view) { 
    final Button button = new Button("Play From Start"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent event) { 
     view.getMediaPlayer().seek(Duration.ZERO); 
     view.getMediaPlayer().play(); 
     } 
    }); 

    final VBox layout = new VBox(8); 
    layout.setAlignment(Pos.CENTER); 
    layout.getChildren().addAll(
     view, 
     button 
    ); 

    layout.setStyle("-fx-background-color: linear-gradient(to bottom, derive(lightseagreen, -20%), lightseagreen);"); 

    return layout; 
    } 

    private void setMediaEventHandlers(final MediaView view) { 
    final MediaPlayer player = view.getMediaPlayer(); 

    System.out.println("Initial: " + player.getStatus()); 
    player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() { 
     @Override 
     public void changed(ObservableValue<? extends MediaPlayer.Status> observable, MediaPlayer.Status oldStatus, MediaPlayer.Status curStatus) { 
     System.out.println("Current: " + curStatus); 
     } 
    }); 

    if (player.getError() != null) { 
     System.out.println("Initial Error: " + player.getError()); 
    } 

    player.setOnError(new Runnable() { 
     @Override public void run() { 
     System.out.println("Current Error: " + player.getError()); 
     } 
    }); 
    } 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override public void run() { 
     VideoPlayer player = new VideoPlayer(); 
     player.play(VID_URL); 
     } 
    }); 
    } 
} 

हल हो!

यह देखने के लिए अच्छा है कि मूल पोस्टर वीडियो प्लेबैक काम करने में सक्षम था और अंतिम त्रुटि सिर्फ पुराने जावाएफएक्स संस्करण (2.0) का उपयोग कर रही थी जो एमपी 4 प्लेबैक का समर्थन नहीं करती है। जावाएफएक्स 2.2+ को अपडेट करना (जो एमपी 4 प्लेबैक का समर्थन करता है) ने इस मुद्दे को ठीक किया।

+0

असल में, मैंने पहले आपके द्वारा दिए गए उदाहरण को अन्य प्रश्न के लिए दिया था और, इस कोड की तरह, यह अभी भी पहले की तरह ही त्रुटि देता है, और न ही खेलता है। मैंने नोटिस किया कि, हालांकि, अपनी खुद की फाइल का उपयोग करते समय, मुझे एक लाल त्रुटि मिलती है, जबकि आप जिस लिंक को आपूर्ति कर रहे हैं वह स्थिति के माध्यम से एक त्रुटि देता हैप्रॉपर्टी श्रोता ... – Chaos

+0

उस नमूने के लिए आपको बहुत बहुत धन्यवाद! – Chris

+0

मैं javaFx 2.2 का उपयोग कर रहा हूं और मुझे अभी भी यह त्रुटि मिलती है। क्या कोई अन्य मुद्दा है जिसे इस पोस्ट में उल्लिखित नहीं किया गया है? – cp101020304

संबंधित मुद्दे