2012-09-11 56 views
8

Tôi biết đây là một câu hỏi cũ và tôi đã nghiên cứu rất nhiều qua điều này nhưng có vẻ như không có giải pháp thích hợp. Có một số cách để làm như vậy mà tôi đã nhìn thấy như:Chuyển đổi chuỗi hình ảnh thành tệp video android java

  • Sử dụng FFmpeg (nhưng nó phụ thuộc vào mã nguồn gốc nên không phải là một lựa chọn cho tôi)

  • Xuggler API (cùng lý do như trên)

Im tìm kiếm giải pháp hoặc thậm chí gợi ý mà có thể chuyển đổi nhiều hình ảnh (drawables hoặc bitmap hoặc bất cứ điều gì) vào một tập tin video có thể được phát lại trong một chiếc điện thoại android. Im bị mắc kẹt ở đây trong 3 ngày rồi và vội vã tìm một giải pháp.

Tôi cũng đang tìm giải pháp thay thế cho vấn đề của mình thay vì chuyển đổi hình ảnh thành video, có thể chụp và ghi lại màn hình điện thoại android, ngoài màn hình trong ứng dụng của tôi không? (xin vui lòng, không sử dụng cáp USB để cắm vào máy tính hoặc một cái gì đó như thế. Tôi đã thấy rất nhiều những người khi tôi nghiên cứu, đó không phải là những gì tôi đang tìm kiếm).

Mọi trợ giúp sẽ đánh giá cao và xin lỗi về tiếng Anh của tôi, đó không phải là tiếng mẹ đẻ của tôi.

+0

Xin chào user1059287, Bạn có câu trả lời cho điều này không? Tôi cũng đang tìm kiếm như vậy. –

Trả lời

5

Bạn có thể sử dụng một java tinh khiết thư viện mã nguồn mở gọi JCodec (http://jcodec.org), lớp dưới đây giải thích chuyển đổi như chuỗi các hình ảnh vào MP4 clip (H.264) sử dụng JCodec thấp cấp API:

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); 
    } 
} 

Sau đó, bạn có thể sử dụng nó như thế này:

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

bạn thêm tệp hình ảnh vào đâu? – ralphgabb

+0

This - outTrack.addFrame (new MP4Packet (kết quả, frameNo, 25, 1, frameNo, true, null, frameNo, 0)); mất nhiều thời gian @Stanislav Vitvitskyy – NarendraJi

+1

BufferedImage không thể được sử dụng trên Android. –

Các vấn đề liên quan