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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。