어딘가에 png 파일 세트를 .avi 파일로 변환 할 수있는 자유롭게 사용할 수있는 jar 파일이 있습니까?png 이미지에서 h264 비디오 인코딩하기 ... JAVA
구식 JMF가 필요없는 java와 호환되는 코덱을 찾고 있습니다.
감사합니다.
어딘가에 png 파일 세트를 .avi 파일로 변환 할 수있는 자유롭게 사용할 수있는 jar 파일이 있습니까?png 이미지에서 h264 비디오 인코딩하기 ... JAVA
구식 JMF가 필요없는 java와 호환되는 코덱을 찾고 있습니다.
감사합니다.
가난한 자바 솔루션을 보지 못했지만 xfractor로 시도해 볼 수 있습니다.
JCodec (http://jcodec.org)입니다. 그것은 오픈 소스 순수 자바 비디오 코덱 라이브러리입니다. 현재로서는 AVI를 지원하지 않지만 IMHO 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();
}
}
은 왜 그냥 SequenceEncoder를 사용하는 것이 아니라 파일의 내용을 붙여 넣는 것이 좋습니다 당신이 JCodec로 이동하기로 결정 경우
, 여기에 샘플 클래스를 사용할 수있어? 어쨌든, jcodec 1.6에는 몇 가지 문제가있는 것으로 보입니다. 버퍼링 된 이미지의 짧은 시퀀스를 인코딩해도 재생할 비디오가 생성되지 않지만 해상도를 올바르게 얻고 미리보기 이미지를 표시하는 것처럼 보입니다. – Chris