2012-02-17 20 views
27

क्या कोई जावा लाइब्रेरी की अनुशंसा कर सकता है जो मुझे प्रोग्राम को प्रोग्रामेटिक रूप से बनाने की अनुमति देगा? विशेष रूप से, यह निम्न करना होगा:प्रोग्राम बनाने के लिए अनुशंसित जावा लाइब्रेरी

  • फ्रेम
  • एक पृष्ठभूमि WAV/एमपी 3 जोड़े जाने के लिए
  • अनुमति देते हैं 'आकस्मिक' WAV/MP3s मनमाने ढंग से जोड़ा जा करने की अनुमति के रूप में BufferedImages की एक श्रृंखला ले, प्रोग्राम के रूप में निर्दिष्ट अंक
  • उत्पादन एक आम प्रारूप (एमपीईजी आदि)

किसी को भी कुछ भी अनुशंसा कर सकते हैं में वीडियो? तस्वीर/ध्वनि मिश्रण के लिए, मैं कुछ ऐसी चीजों के साथ भी रहूंगा जो फ्रेम की श्रृंखला लेते हैं, और प्रत्येक फ्रेम के लिए मुझे उस फ्रेम से जुड़े असम्पीडित ध्वनि डेटा के कच्चे बाइट्स की आपूर्ति करना पड़ता था।

पीएस इसे "थर्ड पार्टी लाइब्रेरी" भी नहीं होना चाहिए, जैसे जावा मीडिया फ्रेमवर्क में उपर्युक्त प्राप्त करने के लिए कॉल हैं, लेकिन मेरी स्केची मेमोरी से मुझे लगता है कि यह नहीं है।

+0

आप इस कोशिश कर सकते हैं। http://wiki.xuggle.com/MediaTool_Introduction – Ovilia

+0

मैंने Xuggle को देखा, लेकिन यह सेट करने के लिए गधे में दर्द की तरह आधा नहीं दिखता है। निश्चित नहीं है कि इन लोगों के पास एक जार/डीएल/एक्सई डाउनलोड करने के साथ एक मानसिक ब्लॉक क्यों है ... –

+0

पीएस मेरे पास अभी एक समाधान है - कुछ भी बेहतर लंबित है - फ्रेम को सहेजना है जैसे कि पीएनजी फाइलें फिर फ्रेम पर कमांडलाइन ffmpeg उपयोगिता को कॉल करें। मुझे लगता है कि वैसे भी एक पुस्तकालय हुड के तहत क्या कर सकता है। –

उत्तर

5

मैंने शुद्ध जावा में आपकी आवश्यकताओं की सूची में आइटम 1, 2, और 4 सफलतापूर्वक निष्पादित करने के लिए नीचे उल्लिखित कोड का उपयोग किया है। यह एक लायक है और आप शायद यह पता लगा सकते हैं कि # 3 को कैसे शामिल किया जाए।

http://www.randelshofer.ch/blog/2010/10/writing-quicktime-movies-in-pure-java/

+0

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

4

मैंने पाया एक उपकरण कहा जाता ffmpeg जो मल्टीमीडिया फ़ाइलों को परिवर्तित कर सकते हैं एक से दूसरे प्रारूप के रूप में। Ffmpeg में libavfilter नामक एक फ़िल्टर है जो vhook के लिए विकल्प है जो वीडियो/ऑडियो को डीकोडर और एन्कोडर के बीच संशोधित या जांचने की अनुमति देता है। मुझे लगता है कि कच्चे फ्रेम को इनपुट करना और वीडियो उत्पन्न करना संभव होना चाहिए। मैंने ffmpeg के किसी भी जावा कार्यान्वयन पर शोध किया और "Getting Started with FFMPEG-JAVA" शीर्षक वाला पृष्ठ पाया जो जेएनए का उपयोग करके एफएफएमपीईजी के आसपास एक जावा रैपर है।

+0

धन्यवाद - मैं निश्चित रूप से कुछ चरण में इसे देख लूंगा! –

-1

जावाएफएक्स आज़माएं।

जावाएफएक्स में कई प्रारूपों में छवियों को प्रस्तुत करने के लिए समर्थन और जावाफ़ैक्स समर्थित सभी प्लेटफॉर्म पर ऑडियो और वीडियो के प्लेबैक के लिए समर्थन शामिल है।

Here

Here स्लाइडशो, समय और दृश्यों बनाने पर एक ट्यूटोरियल है जोड़ तोड़ छवियों पर एक ट्यूटोरियल है।

Here ध्वनि जोड़ने पर अक्सर पूछे जाने वाले प्रश्न हैं।

इनमें से अधिकांश JavaFX 1.3 पर हैं। अब जावाएफएक्स 2.0 बाहर है।

0

क्यों FFMPEG का उपयोग नहीं करते?

http://fmj-sf.net/ffmpeg-java/getting_started.php

यहाँ कैसे FFMPEG के साथ एक वीडियो में विभिन्न मीडिया स्रोतों को संकलित करने का एक उदाहरण है:

इसके लिए एक जावा आवरण हो रहा है

http://howto-pages.org/ffmpeg/#multiple

और , अंत में, दस्तावेज़:

http://ffmpeg.org/ffmpeg.html

+0

तो फिलहाल मैं वास्तव में एफएफएमपीईजी का उपयोग कर रहा हूं, हालांकि थोड़ा सा गड़बड़ तरीके से क्योंकि मुझे पता नहीं चला कि सभी विकल्पों का उपयोग कैसे किया जाए। एटीएम मैं सभी फ्रेम को फ़ोल्डर में छवियों के रूप में सहेज रहा हूं, फिर उन पर FFMPEG चला रहा हूं। मुझे लगता है कि फ्रेम को सीधे एक-एक करके एफएफएमपीईजी को बिना सहेजने के लिए पाइप करने का एक तरीका है, लेकिन इसे अभी तक नहीं मिला है। मैंने सोचा कि पहले से ही एक पुस्तकालय हो सकता है, उदाहरण के लिए। –

1

आप जेसीओडीसी नामक एक शुद्ध जावा कोडेक लाइब्रेरी आज़मा सकते हैं।
इसमें एक बहुत ही बुनियादी एच .264 (एवीसी) एन्कोडर और एमपी 4 मक्सर है। यहां उनके नमूने से लिया गया एक पूर्ण नमूना कोड है - TranscodeMain

private static void png2avc(String pattern, String out) throws IOException { 
    FileChannel sink = null; 
    try { 
     sink = new FileOutputStream(new File(out)).getChannel(); 
     H264Encoder encoder = new H264Encoder(); 
     RgbToYuv420 transform = new RgbToYuv420(0, 0); 

     int i; 
     for (i = 0; i < 10000; i++) { 
      File nextImg = new File(String.format(pattern, i)); 
      if (!nextImg.exists()) 
       continue; 
      BufferedImage rgb = ImageIO.read(nextImg); 
      Picture yuv = Picture.create(rgb.getWidth(), rgb.getHeight(), ColorSpace.YUV420); 
      transform.transform(AWTUtil.fromBufferedImage(rgb), yuv); 
      ByteBuffer buf = ByteBuffer.allocate(rgb.getWidth() * rgb.getHeight() * 3); 

      ByteBuffer ff = encoder.encodeFrame(buf, yuv); 
      sink.write(ff); 
     } 
     if (i == 1) { 
      System.out.println("Image sequence not found"); 
      return; 
     } 
    } finally { 
     if (sink != null) 
      sink.close(); 
    } 
} 

यह नमूना और अधिक परिष्कृत है और वास्तव में MP4 फ़ाइल में एन्कोड फ्रेम के muxing पता चलता है:

private static void prores2avc(String in, String out, ProresDecoder decoder, RateControl rc) throws IOException { 
    SeekableByteChannel sink = null; 
    SeekableByteChannel source = null; 
    try { 
     sink = writableFileChannel(out); 
     source = readableFileChannel(in); 

     MP4Demuxer demux = new MP4Demuxer(source); 
     MP4Muxer muxer = new MP4Muxer(sink, Brand.MOV); 

     Transform transform = new Yuv422pToYuv420p(0, 2); 

     H264Encoder encoder = new H264Encoder(rc); 

     MP4DemuxerTrack inTrack = demux.getVideoTrack(); 
     CompressedTrack outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, (int) inTrack.getTimescale()); 

     VideoSampleEntry ine = (VideoSampleEntry) inTrack.getSampleEntries()[0]; 
     Picture target1 = Picture.create(ine.getWidth(), ine.getHeight(), ColorSpace.YUV422_10); 
     Picture target2 = null; 
     ByteBuffer _out = ByteBuffer.allocate(ine.getWidth() * ine.getHeight() * 6); 

     ArrayList<ByteBuffer> spsList = new ArrayList<ByteBuffer>(); 
     ArrayList<ByteBuffer> ppsList = new ArrayList<ByteBuffer>(); 
     Packet inFrame; 
     int totalFrames = (int) inTrack.getFrameCount(); 
     long start = System.currentTimeMillis(); 
     for (int i = 0; (inFrame = inTrack.getFrames(1)) != null && i < 100; i++) { 
      Picture dec = decoder.decodeFrame(inFrame.getData(), target1.getData()); 
      if (target2 == null) { 
       target2 = Picture.create(dec.getWidth(), dec.getHeight(), ColorSpace.YUV420); 
      } 
      transform.transform(dec, target2); 
      _out.clear(); 
      ByteBuffer result = encoder.encodeFrame(_out, target2); 
      if (rc instanceof ConstantRateControl) { 
       int mbWidth = (dec.getWidth() + 15) >> 4; 
       int mbHeight = (dec.getHeight() + 15) >> 4; 
       result.limit(((ConstantRateControl) rc).calcFrameSize(mbWidth * mbHeight)); 
      } 
      spsList.clear(); 
      ppsList.clear(); 
      H264Utils.encodeMOVPacket(result, spsList, ppsList); 
      outTrack.addFrame(new MP4Packet((MP4Packet) inFrame, result)); 
      if (i % 100 == 0) { 
       long elapse = System.currentTimeMillis() - start; 
       System.out.println((i * 100/totalFrames) + "%, " + (i * 1000/elapse) + "fps"); 
      } 
     } 
     outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList)); 

     muxer.writeHeader(); 
    } finally { 
     if (sink != null) 
      sink.close(); 
     if (source != null) 
      source.close(); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^