2
A
回答
0
我沒有看到糟糕的java解決方案,但您可以嘗試xuggler與它的ffmpeg修整器。
2
JCodec(http://jcodec.org)是你在找什麼。它是一個開源的純Java視頻編解碼器庫。它目前不支持AVI,但恕我直言MP4格式更適合H.264。
在你決定去與JCodec情況下,這裏有一個樣本類,你可以使用:
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();
}
}
相關問題
- 1. 使用Java編碼H264視頻
- 2. 從JAVA的h264編碼視頻獲取SPS和PPS
- 3. 解碼h264視頻
- 4. 使用bufferedimages將視頻編碼成h264?
- 5. H264編碼視頻流的ffmpeg C++
- 6. 如何將視頻編碼爲h264?
- 7. CISCO H264將圖像序列圖像編碼爲H264
- 8. 如何解碼從yuv444p幀編碼的h264視頻?
- 9. 將視頻幀編碼爲PNG時的綠色圖像
- 10. Java編碼視頻
- 11. Media Foundation攝像頭視頻H264編碼/解碼在播放時產生僞影
- 12. FFMpeg將RGB圖像編碼爲H264
- 13. 如何從Android系列圖像創建h264視頻
- 14. 如何用H264編解碼器編寫mp4視頻文件?
- 15. 將PNG圖像轉換爲視頻
- 16. png圖像文件到視頻(無損)
- 17. Java - h.264視頻編碼
- 18. 解碼iphone中的h264視頻
- 19. 使用libavcodec解碼H264視頻,C
- 20. FFmpeg解碼H264視頻太慢
- 21. 使用Microsoft DTV-DVD視頻解碼器播放H264視頻
- 22. 當使用avcodec/H264編碼實況視頻時
- 23. 設置H264實時視頻編碼的關鍵幀間隔
- 24. 切割mp4 h264視頻文件無需重新編碼
- 25. 視頻聊天實現與h264編碼器
- 26. C/C++ H264或ON VP6開源視頻編碼器
- 27. 將RTP視頻流(H264編解碼器)寫入mp4文件
- 28. 使用鳴從PNG圖像創建一個FLV視頻
- 29. 如何使用ffmpeg從png圖像創建視頻
- 30. 從編碼圖像和視頻中提取DCT係數
爲什麼不推薦使用SequenceEncoder,而不是粘貼文件的內容?無論如何,看起來jcodec 1.6有一些問題:編碼bufferedimages的短序列不會產生將播放的視頻,儘管它似乎獲得了正確的分辨率並顯示了預覽圖像。 – Chris 2014-08-19 20:41:55