使用bufferedimages将video编码为h264?

我试图将一大堆bufferedimages(由我的应用程序在运行中创建的预先保存的图像)转换为使用java的video,并希望有一个可以帮助完成该过程的库。

我已经探索了许多不同的选项,例如jcodec(没有关于如何使用它的文档)。 Xuggler(由于与jdk5及其相关库的兼容性问题,无法使其运行)。 还有一些文档很差的其他图书馆。

我正在尝试找到一个我可以使用的库,它使用java来(1)通过逐帧写入bufferedimages来创建h264video,并且(2)有文档,这样我才能真正弄清楚如何使用dam的东西。

关于我应该研究什么的任何想法?

如果纯粹的java源代码存在于某个可以实现这一点的地方,我会非常有兴趣看到它。 因为我很想知道这个人是如何实现这个function的,以及我如何使用它!

提前致谢…

以下是使用JCodec的方法:

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

jcodec now(jcodec-0.1.9.jar)包括SequenceEncoder ,它直接允许将BufferedImage写入video流。

我花了一些时间修复这个新类的默认导入到Eclipse中。 删除第一个导入后,尝试(如上所述,我找不到一些类)使用Stanislav的代码创建我自己的代码并重新导入我发现错误:

 import org.jcodec.api.awt.SequenceEncoder; //import org.jcodec.api.SequenceEncoder; 

第二个是完全弃用的,没有文档指导我到后者。

相应的方法是:

 private void saveClip(Trajectory traj) { //See www.tutorialspoint.com/androi/android_audio_capture.htm //for audio cap ideas. SequenceEncoder enc; try { enc = new SequenceEncoder(new File("C:/Users/WHOAMI/today.mp4")); for (int i = 0; i < BUFF_COUNT; ++i) { BufferedImage image = buffdFramToBuffdImage(frameBuff.get(i)); enc.encodeImage(image); } enc.finish(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }