2012-09-11 20 views
8

मुझे पता है कि यह एक पुराना सवाल है और मैंने इसके माध्यम से बहुत कुछ शोध किया है लेकिन ऐसा लगता है कि कोई उचित समाधान नहीं है।वीडियो अनुक्रम को वीडियो फ़ाइल में कनवर्ट करें एंड्रॉइड जावा

  • FFmpeg का उपयोग करना (लेकिन यह मूल कोड ऐसा नहीं मेरे लिए एक विकल्प पर निर्भर करता है)

  • Xuggler एपीआई (इसी कारण के रूप में: वहाँ जो मैं पहले से ही इस तरह के रूप में देखा है ऐसा करने के लिए कुछ तरीके हैं इसके बाद के संस्करण)

इम समाधान या भी सुझाव जो एक वीडियो फ़ाइल जो एक एंड्रॉयड फोन में प्लेबैक किया जा सकता है में एकाधिक छवियों (ड्रॉएबल या बिटमैप या यह है जो कुछ भी) में बदल सकते हैं की तलाश में। मैं इस पर 3 दिन पहले से ही अटक गया और समाधान ढूंढने के लिए दौड़ रहा था।

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

किसी भी मदद की मेरी अंग्रेजी के बारे में सराहना और खेद होगा, यह मेरा मूल नहीं है।

+0

हाय उपयोगकर्ता 1059287, क्या आपको इसका उत्तर मिला? मैं भी इसी की तलाश में था। –

उत्तर

5

आप एक शुद्ध जावा खुला स्रोत JCodec (http://jcodec.org) कहा जाता लाइब्रेरी का उपयोग कर सकते हैं, वर्ग नीचे MP4 क्लिप (264) में छवियों के अनुक्रम के रूप में परिवर्तित करने JCodec निम्न स्तर एपीआई का उपयोग को दर्शाता है: तो फिर

public class SequenceEncoder { 
    private SeekableByteChannel ch; 
    private Picture toEncode; 
    private RgbToYuv420 transform; 
    private H264Encoder encoder; 
    private ArrayList<ByteBuffer> spsList; 
    private ArrayList<ByteBuffer> ppsList; 
    private CompressedTrack outTrack; 
    private ByteBuffer _out; 
    private int frameNo; 
    private MP4Muxer muxer; 

    public SequenceEncoder(File out) throws IOException { 
     this.ch = NIOUtils.writableFileChannel(out); 

     // Transform to convert between RGB and YUV 
     transform = new RgbToYuv420(0, 0); 

     // Muxer that will store the encoded frames 
     muxer = new MP4Muxer(ch, Brand.MP4); 

     // Add video track to muxer 
     outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25); 

     // Allocate a buffer big enough to hold output frames 
     _out = ByteBuffer.allocate(1920 * 1080 * 6); 

     // Create an instance of encoder 
     encoder = new H264Encoder(); 

     // Encoder extra data (SPS, PPS) to be stored in a special place of 
     // MP4 
     spsList = new ArrayList<ByteBuffer>(); 
     ppsList = new ArrayList<ByteBuffer>(); 

    } 

    public void encodeImage(BufferedImage bi) throws IOException { 
     if (toEncode == null) { 
      toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420); 
     } 

     // Perform conversion 
     for (int i = 0; i < 3; i++) 
      Arrays.fill(toEncode.getData()[i], 0); 
     transform.transform(AWTUtil.fromBufferedImage(bi), toEncode); 

     // Encode image into H.264 frame, the result is stored in '_out' buffer 
     _out.clear(); 
     ByteBuffer result = encoder.encodeFrame(_out, toEncode); 

     // Based on the frame above form correct MP4 packet 
     spsList.clear(); 
     ppsList.clear(); 
     H264Utils.encodeMOVPacket(result, spsList, ppsList); 

     // Add packet to video track 
     outTrack.addFrame(new MP4Packet(result, frameNo, 25, 1, frameNo, true, null, frameNo, 0)); 

     frameNo++; 
    } 

    public void finish() throws IOException { 
     // Push saved SPS/PPS to a special storage in MP4 
     outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList)); 

     // Write MP4 header and finalize recording 
     muxer.writeHeader(); 
     NIOUtils.closeQuietly(ch); 
    } 
} 

आप इसे इस तरह उपयोग कर सकते हैं:

public static void main(String[] args) throws IOException { 
    SequenceEncoder encoder = new SequenceEncoder(new File("video.mp4")); 
    for (int i = 1; i < 100; i++) { 
     BufferedImage bi = ImageIO.read(new File(String.format("img%08d.png", i))); 
     encoder.encodeImage(bi); 
    } 
    encoder.finish(); 
} 
+0

आप यहां छवि फाइलें कहां जोड़ते हैं? – ralphgabb

+0

यह - outTrack.addFrame (नया एमपी 4 पैकेट (परिणाम, फ्रेम नहीं, 25, 1, फ्रेम नहीं, सच, शून्य, फ्रेम नहीं, 0)); बहुत समय ले रहा है @Stanislav Vitvitskyy – NarendraJi

+1

BufferedImage Android पर उपयोग नहीं किया जा सकता है। –

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