Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert image sequence to video file android java

I know this is an old question and I have researched a lot through this but seems like there are no proper solutions. There are some ways to do so which I have already seen such as:

  • Using FFmpeg (but it depends on the native code so not an option for me)

  • Xuggler API (same reason as above)

Im looking for solutions or even suggestions which can convert multiple images (drawables or bitmaps or whatever it is) into to a video file which can be playback in an android phone. Im stuck at this for 3 days already and rushing to find a solution.

Im also looking for an alternative solution for my problem which is instead of convert images into video, is it possible to capture and record the android phone screen, actually apart of the screen in my application? ( please, not using the USB cable to plug into the computer or something like that. I have seen alot of those when I researched, that's not what I'm looking for).

Any helps would be appreciate and sorry about my English, it is not my native one.

like image 800
user1059287 Avatar asked Sep 11 '12 08:09

user1059287


1 Answers

You can use a pure java open source library called JCodec ( http://jcodec.org ), the class below demonstrates converting as sequence of images into MP4 clip ( H.264 ) using JCodec low level 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);
    }
}

Then you can use it like this:

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();
}
like image 122
Stanislav Vitvitskyy Avatar answered Oct 15 '22 13:10

Stanislav Vitvitskyy