Java解码H264格式视频流中的图片
本文实例为大家分享了Java解码H264格式视频流中的图片,供大家参考,具体内容如下
引入依赖
org.bytedeco javacv 1.4.3 org.bytedeco.javacpp-presets ffmpeg-platform 4.0.2-1.4.3
需要注意这两个包之间的版本有一个对应关系,如果版本不对应可能会出问题
解码过程
实现的一个简单功能是:
- 从Socket获取视频输入流(H264格式)
- 获取视频流中的帧
- 把每一帧转换成BufferedImage
packagecom.amwalle.walle.raspi.camera;
importorg.bytedeco.javacv.FFmpegFrameGrabber;
importorg.bytedeco.javacv.Frame;
importorg.bytedeco.javacv.Java2DFrameConverter;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.io.InputStream;
importjava.net.Socket;
publicclassCameraHandlerimplementsRunnable{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(CameraHandler.class);
privatefinalStringLOCK="LOCK";
privateSocketcameraSocket;
privatestaticBufferedImagebufferedImage;
CameraHandler(Socketsocket)throwsIOException{
this.cameraSocket=socket;
}
StringgetLock(){
returnLOCK;
}
@Override
publicvoidrun(){
try{
InputStreamcameraStream=cameraSocket.getInputStream();
FFmpegFrameGrabberframeGrabber=newFFmpegFrameGrabber(cameraStream);
frameGrabber.setFrameRate(30);
frameGrabber.setFormat("h264");
frameGrabber.setVideoBitrate(15);
frameGrabber.setVideoOption("preset","ultrafast");
frameGrabber.setNumBuffers(25000000);
frameGrabber.start();
Frameframe=frameGrabber.grab();
Java2DFrameConverterconverter=newJava2DFrameConverter();
while(frame!=null){
BufferedImagebufferedImage=converter.convert(frame);
setBufferedImage(bufferedImage);
synchronized(LOCK){
LOCK.notifyAll();
}
frame=frameGrabber.grab();
}
}catch(IOExceptione){
logger.info("Videohandleerror,exit...");
logger.info(e.getMessage());
}
}
privatevoidsetBufferedImage(BufferedImageimage){
bufferedImage=image;
}
BufferedImagegetBufferedImage(){
returnbufferedImage;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。