视频转图片序列 java,将图像序列转换为视频文件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.

解决方案

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 spsList;

private ArrayList 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();

ppsList = new ArrayList();

}

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

}

你可能感兴趣的:(视频转图片序列,java)