2010-09-10 15 views
40

में छवियों की एक श्रृंखला को एन्कोड करें मैं एंड्रॉइड पर छवियों/फ़ोटो की श्रृंखला से वीडियो फ़ाइल कैसे बना सकता हूं? क्या यह वर्तमान एसडीके के साथ किया जा सकता है? या मुझे कोडेक लाइब्रेरी चाहिए?वीडियो

+0

मैं [मल्टीमीडिया सिस्टम के लिए StackOverflow] में यह सवाल (http://area51.stackexchange.com/proposals पूछने के लिए सुझाव देते हैं:
आप उसे नीचे को सुधार वर्ग का उपयोग कर सकते JCodec निम्न स्तर एपीआई का इस्तेमाल/91149/मल्टीमीडिया-सिस्टम) – Hamed

उत्तर

11

मैं मार्क से सहमत हूं। सी/सी ++ पुस्तकालयों में ffmpeg here या X264 here हैं। मुझे कहना है कि मैंने उन्हें या एंड्रॉइड एनडीके का उपयोग करने में आसान नहीं पाया है, लेकिन शायद यह इसलिए है क्योंकि मुझे वास्तव में सी/सी ++ और जेएनआई के बारे में बहुत कुछ पता नहीं है। यदि आप इस मार्ग में रूचि रखते हैं, तो एंड्रॉइड के लिए रॉकप्लेयर फ्री ऐप में एंड्रॉइड पर उपयोग के लिए तैयार ffmpeg से पूर्व-निर्मित साझा पुस्तकालय हैं। वे दावा करते हैं कि इन पुस्तकालयों में केवल एलजीपीएल घटकों का उपयोग होता है, लेकिन मुझे लगता है कि आपको इस पर खुद को संतुष्ट करना होगा। जावा के संबंध में, ffmpeg नामक एक बंदरगाह (प्रकार) है, जिसे बिना किसी आश्चर्यजनक रूप से, jffmpeg कहा जाता है जिसे आप here तक एक्सेस कर सकते हैं लेकिन यह अभी भी मौजूदा Ffmpeg ढांचे में से अधिकांश को कॉल करता है, इसलिए आप वापस एनडीके भूमि में हैं। जावा मीडिया फ्रेमवर्क (जेएमएफ) के साथ छवियों की एक श्रृंखला को वीडियो में परिवर्तित करना संभव है लेकिन इसमें निम्नलिखित दोष हैं:

  1. वीडियो स्वरूपों की सीमित संख्या।
  2. वीडियो का उत्पादन नहीं करता है जिसे अधिकतर (यदि नहीं सभी) एंड्रॉइड फोन पर खेला जा सकता है उदा। एच 264 या एमपीईजी 4।
  3. जेएमएफ कोड अब काफी पुराना है, लंबे समय तक प्रगति नहीं हुई है, फूला हुआ है और अच्छी तरह से संरचित नहीं है इसलिए अतिरिक्त जावा निर्भरताएं हो सकती हैं जो एंड्रॉइड में पैक नहीं की जाती हैं।

मैंने देखा एक और विकल्प एडोब एयर है, लेकिन यह 17 एमबी पेलोड है जो कुछ उपयोगकर्ता शिकायत करते हैं।

ffmpeg और एंड्रॉइड एनडीके के बारे में स्टैक ओवरफ़्लो पर कई अन्य प्रश्न हैं।

परियोजना के साथ शुभकामनाएं।

+1

मैं एडोब एयर के साथ ऐसा कैसे कर सकता हूं? –

+0

@Ilya_Gazman क्षमा करें, मुझे एडोब एयर के साथ कोई अनुभव नहीं है। जब मैं इस विषय पर शोध कर रहा था तो मैं बस इसके कुछ संदर्भों में आया था। –

+0

मैं देखता हूं। मैं ऐसा नहीं करता जो उनके साथ संभव है। मैं किसी भी एयर लाइब्रेरी से परिचित नहीं हूं जो ऐसा कर सकता है। –

4

इसके लिए कोई अंतर्निहित समर्थन नहीं है। आपको या तो कुछ जावा स्रोत कोड मिलना होगा जो आपको चाहिए, या कुछ सी/सी ++ कोड जो आप लाइब्रेरी में बदल सकते हैं और एनडीके के माध्यम से उपयोग कर सकते हैं। या, यदि अंतिम लक्ष्य वीडियो के लिए सर्वर पर होना है, तो छवियों/फ़ोटो अपलोड करें और सर्वर को वीडियो बनाएं।

4

ffmpeg आपका बचाव रेंजर है। आप एंड्रॉइड के लिए एफएफएमपीईजी पोर्ट डाउनलोड कर सकते हैं। अधिक जानकारी के लिए FFmpeg on Android पर सवाल देखें।

बंदरगाह लगभग हर चीज का समर्थन करता है जिसे आपको कभी भी आवश्यकता होगी, प्रारूपों सहित - इनपुट छवि प्रारूप जीआईएफ, जेपीजी, पीएनजी, बीएमपी इत्यादि और आउटपुट वीडियो प्रारूपों को एवीआई, एमपी 4 (कंटेनर) के साथ कई कोडेक्स के साथ।

+8

मेरी सभी सीचिंग में मुझे एंड्रॉइड के लिए ffmpeg पोर्ट नहीं मिला। मुझे लगता है कि आपको ffmpeg, run.config को डाउनलोड करना था (लक्ष्य ओएस के लिए और जो भी कोडेक्स आप चाहते थे) और फिर इसे एक साझा लाइब्रेरी में बनाया गया था जिसे आपको कॉल करने के लिए जेएनआई रैपर लिखना पड़ा था - मानते हुए कि आपको रास्ते में कोई त्रुटि नहीं मिली है। शायद आप इस ffmpeg बंदरगाह के डाउनलोड के लिए एक लिंक साझा करने के लिए पर्याप्त होगा? –

1

आप जेसीओडीसी (http://jcodec.org) नामक एक मुक्त ओपन सोर्स लाइब्रेरी का उपयोग कर सकते हैं जिसमें कुछ लोकप्रिय वीडियो प्रारूपों और कोडेक्स के शुद्ध जावा कार्यान्वयन शामिल हैं, जिनमें शामिल हैं: एच .264 (एवीसी), एमपीईजी 1/2, ऐप्पल प्रोआरएस, जेपीईजी, एमपी 4 (आईएसओ बीएमएफ), एमपीईजी पीएस, एमपीईजी टीएस, Matroska।

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("folder/img%08d.png", i))); 
      encoder.encodeImage(bi); 
     } 
     encoder.finish(); 
    } 
} 
+8

हम दुर्भाग्य से एंड्रॉइड पर BufferedImage का उपयोग नहीं कर सकते हैं। एंड्रॉइड के पास java.awt तक पहुंच नहीं है। *। – BVB

+0

@Stanislav एंड्रॉइड के लिए BufferedImage का उपयोग करने के बजाय किसी भी समाधान? – Ehsan

+0

@ user2204093 यह कोड स्निपेट पुराना है। जेसीओडीसी में अब एंड्रॉइड पोर्ट –

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