2014-07-03 10 views
5

मैं फ्रेम द्वारा java8-64bit फ्रेम में एक एमपी 4 फ़ाइल पढ़ना चाहता हूं और प्रत्येक हार्ड फ्रेम को मेरे हार्डडिस्क में एक जेपीजी के रूप में लिखना चाहता हूं। मेरा पहला प्रयास एक दृश्य घटक पर फ़ाइल फ़ाइल खेलने के लिए जावाएफएक्स 2.2 मीडिया प्लेयर का उपयोग करना था। मैंने सोचा कि शायद एक नया फ्रेम लोड होने के बाद एक ईवेंट प्राप्त करने के लिए पर्यवेक्षक को पंजीकृत करने का विकल्प होगा और घटक सतह पर चित्रित करने के लिए तैयार होगा लेकिन ऐसा लगता है कि ऐसी कोई विधि नहीं है। यह उन फ्रेम/पिक्सेल को पकड़ने के लिए पर्याप्त होगा जो घटक पर चित्रित किए गए हैं।फ़्रेम द्वारा वीडियो फ्रेम को कैसे पढ़ा जाए?

क्या यह मीडिया प्लेयर का उपयोग करके किया जा सकता है? मीडिया प्लेयर का उपयोग करने का कारण यह है कि यह बीसीएस है जो मुझे सबसे आसान समाधान था। मैं vlcj, बस 32 बिट, और gstreamer लेकिन tryed भाग्य :(बिना

मैं अब तक मिल गया:

player.setOnNextFrameReady(final Event evt) { writeImage(evt.getFrame()) }; 

धन्यवाद:

public class VideoGrabber extends extends JFrame { 

// code for scene setup omitted 

final MediaView view = createMediaView(...) 

// some other stuff happens here 

// now start the video 
view.getMediaPlayer().seek(Duration.ZERO); 
view.getMediaPlayer().play(); 
view.getMediaPlayer().setOnEndOfMedia(new Runnable() 
{ // save image when done 
    BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_BGR 
    view.paint(img.getGraphics()); 
    ImageIO.write(img, "JPEG", new File("pic-"+System.currentTimeMillis()+".jpg")); 
}); 

// somewhere else to create 
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; 
} 

वहाँ किसी भी तरह निम्न करने के लिए एक तरीका है!

उत्तर

3

Marvin Framework फ्रेम द्वारा मीडिया फ़ाइलों को फ्रेम करने के तरीकों को प्रदान करने के तरीके प्रदान करता है। नीचे एक सरल वीडियो प्रसंस्करण उदाहरण दिखाया गया है जो स्नूकर बॉल के पथ को हाइलाइट करता है।

enter image description here

वीडियो छोड़ दिया पर फ्रेम के बीच 30ms के अंतराल के साथ फ्रेम द्वारा फ्रेम खेला जाता है। दाईं ओर वीडियो फ्रेम द्वारा फ्रेम खेला जाता है, लेकिन एक साधारण छवि प्रसंस्करण दृष्टिकोण के माध्यम से सफेद गेंद के सभी पदों को रखते हुए।

स्रोत कोड here और वीडियो here पर देखा जा सकता है।

आवश्यक स्रोत कोड मीडिया फ़ाइल फ्रेम अनुरोध करने के लिए मारविन का उपयोग कर नीचे:

public class MediaFileExample implements Runnable{ 

    private MarvinVideoInterface videoAdapter; 
    private MarvinImage    videoFrame; 

    public MediaFileExample(){ 
     try{ 
      // Create the VideoAdapter used to load the video file 
      videoAdapter = new MarvinJavaCVAdapter(); 
      videoAdapter.loadResource("./res/snooker.wmv"); 

      // Start the thread for requesting the video frames 
      new Thread(this).start(); 
     } 
     catch(MarvinVideoInterfaceException e){e.printStackTrace();} 
    } 

    @Override 
    public void run() { 
     try{ 
      while(true){ 
       // Request a video frame 
       videoFrame = videoAdapter.getFrame(); 
      } 
     }catch(MarvinVideoInterfaceException e){e.printStackTrace();} 
    } 

    public static void main(String[] args) { 
     MediaFileExample m = new MediaFileExample(); 
    } 
} 
+0

बहुत अच्छा, मैं इसे आज़मा दूंगा। – Chris

1

ffmpeg जैसे फ्रेमवर्क व्यक्तिगत वीडियो (यानी फ़ोल्डर में छवियों) में विभाजित करने के लिए कमांड लाइन टूल्स के साथ आते हैं।

यह प्रश्न देखें: ffmpeg split avi into frames with known frame rate

उत्तर में जावा फ्रेमवर्क के लिंक शामिल हैं जो ffmpeg को लपेटते हैं।

+0

आपके उत्तर के लिए धन्यवाद। जावा में वीडियो से फ्रेम प्राप्त करने के बाद मैं मांग पर और प्रसंस्करण करना चाहता हूं और अंत में इसे सहेजना चाहता हूं। ffmpeg छवियों की एक धारा बना सकते हैं जिसे मैं डिस्क पर सभी डेटा लिखने के बिना इसे संसाधित करने के लिए किसी भी तरह से जावा में खोल सकता हूं? – Chris

+0

आप 'https: // code.google.com/p/jjmpeg /' आज़मा सकते हैं। मैं फ्रेम से फ्रेम को फ्रेम में निकालने के लिए कमांड लाइन का उपयोग करने की अनुशंसा नहीं करता क्योंकि वीडियो स्ट्रीम में मांग बहुत महंगी होगी। –

+0

फिर से धन्यवाद। दुर्भाग्यवश jjmpeg का उपयोग करने का अर्थ यह होगा कि मुझे वास्तविक कार्यों को करने के लिए समय निकालने के बजाय रिवर्स इंजीनियरिंग करने के लिए और अधिक समय बिताना है कि यह कैसे उपयोग किया जाए (सभी उपलब्ध नहीं है)। शायद कुछ अन्य जवाब दिलचस्प समाधान के साथ पॉप अप होगा। लेकिन thx! – Chris

7

आप स्नैपशॉट उपयोग कर सकते हैं() MediaView की। पहले मीडिया प्लेयर को मीडिया व्यू घटक से कनेक्ट करें, फिर वीडियो स्थिति खोजने के लिए MediaPlayer.seek() का उपयोग करें। और फिर आप छवि फ्रेम निकालने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं:

int width = mediaPlayer.getMedia().getWidth(); 
    int height = mediaPlayer.getMedia().getHeight(); 
    WritableImage wim = new WritableImage(width, height); 
    MediaView mv = new MediaView(); 
    mv.setFitWidth(width); 
    mv.setFitHeight(height); 
    mv.setMediaPlayer(mediaPlayer); 
    mv.snapshot(null, wim); 
    try { 
     ImageIO.write(SwingFXUtils.fromFXImage(wim, null), "png", new File("/test.png")); 
    } catch (Exception s) { 
     System.out.println(s); 
    } 
+0

बहुत अंडररेड उत्तर। धन्यवाद। – Smig

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