- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 jcodec 将缓冲图像编码为 h264 电影。只是我无法在任何地方找到示例代码。
过去有人用过这个库吗?我没有看到任何文档,甚至库附带的 javadoc 也没有包含任何使用信息。如果您看过示例或可以提供见解,请告诉我。
提前致谢
最佳答案
JCodec 不支持 H.264 的编码。但是,您可以将 JNA 与 x264 库或 ffmpeg 一起使用。如果您选择这条路线,此线程可能会帮助您开始:How does one encode a series of images into H264 using the x264 C API? .
[更新] 从版本 0.1.0 开始,JCodec 支持 H.264 编码,这里有一个简单的类,您可以使用它来将图像序列转换为 MP4 容器中的 H.264 视频:
public class SequenceEncoder {
private SeekableByteChannel ch;
private Picture toEncode;
private RgbToYuv420 transform;
private H264Encoder encoder;
private ArrayList<ByteBuffer> spsList;
private ArrayList<ByteBuffer> 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<ByteBuffer>();
ppsList = new ArrayList<ByteBuffer>();
}
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();
}
}
[UPDATE 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;
}
关于java - jcodec - 有人看过这个库的文档吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969423/
我很难在 Jcodec 中获得正确的持续时间和准确的帧率。 我的情况是我有一个显示位图数组的应用程序,其中用户可以更改其帧速率,如 1fps、5fps、32fps,我所做的只是 1000/fps。所以
我正在尝试使用 jcodec 将缓冲图像编码为 h264 电影。只是我无法在任何地方找到示例代码。 过去有人用过这个库吗?我没有看到任何文档,甚至库附带的 javadoc 也没有包含任何使用信息。如果
我是 JCodec 的新手,但我正在尝试将 JCodec 图片转换为 BufferedImage。不幸的是,在 JCodec 中这样做的方法已被弃用,除了那些将图片转换为 Picture8Bit 的方
我正在尝试使用 JCodec 将一系列图像转换为 Java SE 桌面应用程序内的视频。我尝试过的几种方法都导致了 Windows Media Player 无法播放的视频。 我不清楚这是编解码器问题
我需要将多个图像(其中我有完整的路径)编码成android上某个FPS的视频。 试验: How to create a video from an array of images in Android
我需要从图像创建视频,我看过 jcodec,我认为这就是我需要的: http://jcodec.org/ 如何将 jcodec 添加到我的项目中?我看到有一个适用于android的版本。如果我错了请纠
过去 2 天我一直在尝试解决这个问题,但没有成功。我是 android 编程的初学者,我在我的项目中需要将一些图像转换为视频。我发现我可以为此使用 jcodec,但我无法安装它。如果有人可以告诉我如何
当我尝试使用 JCodec 将单个位图转换为 10 秒长的视频时 - 有时我会得到一个奇怪的结果,通常是颜色失真 - 或者在结果视频上绘制一条黑色对角线。这是我使用的代码(我调试了它,问题出现在那里)
我有一组图像,我想将幻灯片生成为视频文件。我正在使用 jcodec。当我对帧进行编码时,是否可以指定该帧必须显示一定时间(例如 1 秒)? 最佳答案 是的,可以指定帧的时间。在 https://git
我正在使用 JCODEC创建我的屏幕 Activity 的视频。我不想使用 android NDK,因为我想在 JAVA 中使用它。我正在运行一个 for 循环来使用 SequenceEncoder
我有一个使用 jcodec 生成的 MP4 文件。 然后我就有了一个使用 Android 的 MediaCodec 生成的 AAC 文件。 我想将它们混合到一个文件中,并且由于我不想将我的 Andro
我正在研究如何使用 Java 从图像创建 mp4 视频。经过几天的研究,我知道 JCodec 可以做到(http://jcodec.org/)。这是我在 Android make animated v
我在使用 MediaRecorder 和 Jcodec 在 Android 上编写 mp4 文件时遇到了一些麻烦,这是我的代码 public class SequenceEncoder { p
我正在尝试能够从 MPEG、MPEG-TS 和 MPEG-PS 文件以及实时流(网络/UDP/RTP 流)中挑选出帧(视频和元数据)。我正在研究使用 JCODEC 来执行此操作,我开始尝试使用 Fra
我想知道如何使用 jCodec 从 UDP 实时流中获取和解码 H.264 帧。我看到了如何从文件中获取它的示例,但我需要从实时流中获取它。我有接收直播流数据包的应用程序,但我需要知道如何解码数据包并
有没有人设法使用 Jcodec 保存 rtsp 视频流 (h264 mpeg) ? 你能举个例子吗? 在 Android 设备上保存 rtsp 流的任何其他方法也会有很大帮助。 请不要包含任何需要特定
我是一名优秀的程序员,十分优秀!