video编码从Java的图像序列的android

我想编码video序列的图像与Java只在我目前的Android项目。 我的意思是没有任何使用外部工具,如NDK。
还有什么可用的Java库来编码video序列的图像?

Solutions Collecting From Web of "video编码从Java的图像序列的android"

您可以使用称为JCodec( http://jcodec.org )的纯java库。 它包含一个原始的工作H.264(AVC)编码器和function齐全的MP4(ISO BMF)复用器。
这是一个使用低级API的正确的代码示例:

public void imageToMP4(BufferedImage bi) { // A transform to convert RGB to YUV colorspace RgbToYuv420 transform = new RgbToYuv420(0, 0); // A JCodec native picture that would hold source image in YUV colorspace Picture toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420); // Perform conversion transform.transform(AWTUtil.fromBufferedImage(bi), yuv); // Create MP4 muxer MP4Muxer muxer = new MP4Muxer(sink, Brand.MP4); // Add a video track CompressedTrack outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25); // Create H.264 encoder H264Encoder encoder = new H264Encoder(rc); // Allocate a buffer that would hold an encoded frame ByteBuffer _out = ByteBuffer.allocate(ine.getWidth() * ine.getHeight() * 6); // Allocate storage for SPS/PPS, they need to be stored separately in a special place of MP4 file List<ByteBuffer> spsList = new ArrayList<ByteBuffer>(); List<ByteBuffer> ppsList = new ArrayList<ByteBuffer>(); // Encode image into H.264 frame, the result is stored in '_out' buffer ByteBuffer result = encoder.encodeFrame(_out, toEncode); // Based on the frame above form correct MP4 packet H264Utils.encodeMOVPacket(result, spsList, ppsList); // Add packet to video track outTrack.addFrame(new MP4Packet(result, 0, 25, 1, 0, true, null, 0, 0)); // Push saved SPS/PPS to a special storage in MP4 outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList)); // Write MP4 header and finalize recording muxer.writeHeader(); } 

您可以从项目网站或通过Maven下载JCodec库,以便将以下代码片段添加到您的pom.xml中:

 <dependency> <groupId>org.jcodec</groupId> <artifactId>jcodec</artifactId> <version>0.1.3</version> </dependency> 

[更新1] Android用户可以使用下面的东西来将Android位图对象转换为JCodec本机格式:

 public static Picture fromBitmap(Bitmap src) { Picture dst = Picture.create((int)src.getWidth(), (int)src.getHeight(), RGB); fromBitmap(src, dst); return dst; } public static 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; } } }