jcodec – 有没有人看过这个库的文档?

我正在尝试使用jcodec将bufferedimages编码为h264电影。 只有我无法在任何地方找到示例代码。

过去有没有人使用过这个图书馆? 我没有看到任何文档,即使库附带的javadoc也没有包含使用信息。 如果您已经看过示例,或者可以提供见解,请告诉我们。

http://jcodec.org/

提前致谢

JCodec不支持H.264编码。 但是,您可以将JNA与x264库或ffmpeg一起使用。 如果您选择此路线,此线程可以帮助您开始: 如何使用x264 C API将一系列图像编码为H264? 。

[更新]从版本0.1.0开始,JCodec支持H.264编码,这是一个简单的类,您可以使用它将您的图像序列转换为MP4容器中的H.264video:

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); } 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("folder/img%08d.png", i))); encoder.encodeImage(bi); } encoder.finish(); } } 

[更新1]使用此代码将交错的YUV 4:2:0字节数组转换为JCodec图片:

 byte[] input = ... Picture output = Picture.create(width, height, ColorSpace.YUV420); int[] d0 = output.getData()[0], d1 = output.getData()[1], d2 = output.getData()[2]; for(int i = 0, j0 = 0, j1 = 0, j2 = 0; i < input.length; i += 6, j0 += 4, ++j1 , ++j2) { d0[j0 ] = input[i ] & 0xff; d0[j0 + 1] = input[i + 1] & 0xff; d0[j0 + 2] = input[i + 2] & 0xff; d0[j0 + 3] = input[i + 3] & 0xff; d1[j1 ] = input[i + 4] & 0xff; d2[j2 ] = input[i + 5] & 0xff; }