2012-09-11 36 views
8

我知道這是一個老問題,我已經通過這個研究了很多,但好像有沒有合適的解決方案。有一些方法可以做到這一點,我已經看到如:轉換圖像序列的視頻文件的Android的Java

  • 使用FFmpeg的(但它依賴於本機代碼,因此不適合我的選擇)

  • Xuggler API(同樣的理由,以上)

進出口尋找解決方案,甚至可以多張圖片(可繪製或位圖或不管它是什麼)轉換爲與它可以播放在Android手機的視頻文件的建議。我已經堅持了3天,並急於找到解決方案。

林也在尋找我的問題的另一種解決方案是不是將圖像轉換成視頻,是可以捕捉和記錄的Android手機屏幕,其實除了在我的應用程序的屏幕? (請不要使用USB電纜插入計算機或類似的東西,當我研究時,我已經看到了很多這樣的東西,這不是我正在尋找的東西)。

任何幫助會感激和我的英語很抱歉,這不是我的母語之一。

+0

嗨user1059287,你有這個答案嗎?我也在尋找同樣的東西。 –

回答

5

可以使用稱爲JCodec(http://jcodec.org)純Java開源庫,類下面說明使用JCodec低電平API轉換爲圖像的序列插入到MP4剪輯(H.264):

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(新MP4Packet(結果,frameNo,25,1,frameNo,真實,空,frameNo,0));花了很多時間@Stanislav Vitvitskyy – NarendraJi

+1

BufferedImage無法在Android上使用。 –

相關問題