Android make animated video from list of images

后端 未结 2 945
天涯浪人
天涯浪人 2020-11-28 08:14

I want to make animated video from list of images by applying transition animation between two images. I found many similar questions on SO like,

Android Screen capt

2条回答
  •  青春惊慌失措
    2020-11-28 08:52

    Android do not support for AWT's BufferedBitmap nor AWTUtil, that is for Java SE. Currently the solution with SequenceEncoder has been integrated into jcodec's Android version. You can use it from package org.jcodec.api.SequenceEncoder.

    Here is the solution for generating MP4 file from series of Bitmaps using jcodec:

    try {
        File file = this.GetSDPathToFile("", "output.mp4");
        SequenceEncoder encoder = new SequenceEncoder(file);
    
        // only 5 frames in total
        for (int i = 1; i <= 5; i++) {
            // getting bitmap from drawable path
            int bitmapResId = this.getResources().getIdentifier("image" + i, "drawable", this.getPackageName());
            Bitmap bitmap = this.getBitmapFromResources(this.getResources(), bitmapResId);
            encoder.encodeNativeFrame(this.fromBitmap(bitmap));
        }
        encoder.finish();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    // get full SD path
    File GetSDPathToFile(String filePatho, String fileName) {
        File extBaseDir = Environment.getExternalStorageDirectory();
        if (filePatho == null || filePatho.length() == 0 || filePatho.charAt(0) != '/')
            filePatho = "/" + filePatho;
        makeDirectory(filePatho);
        File file = new File(extBaseDir.getAbsoluteFile() + filePatho);
        return new File(file.getAbsolutePath() + "/" + fileName);// file;
    }
    
    // convert from Bitmap to Picture (jcodec native structure)
    public Picture fromBitmap(Bitmap src) {
        Picture dst = Picture.create((int)src.getWidth(), (int)src.getHeight(), ColorSpace.RGB);
        fromBitmap(src, dst);
        return dst;
    }
    
    public void fromBitmap(Bitmap src, Picture dst) {
        int[] dstData = dst.getPlaneData(0);
        int[] packed = new int[src.getWidth() * src.getHeight()];
    
        src.getPixels(packed, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight());
    
        for (int i = 0, srcOff = 0, dstOff = 0; i < src.getHeight(); i++) {
            for (int j = 0; j < src.getWidth(); j++, srcOff++, dstOff += 3) {
                int rgb = packed[srcOff];
                dstData[dstOff]     = (rgb >> 16) & 0xff;
                dstData[dstOff + 1] = (rgb >> 8) & 0xff;
                dstData[dstOff + 2] = rgb & 0xff;
            }
        }
    }
    

    In case you need to change the fps, you may customize the SequenceEncoder.

提交回复
热议问题