Java如何解码H264格式视频流中的图片,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联建站专注于企业成都营销网站建设、网站重做改版、阿克苏网站定制设计、自适应品牌网站建设、HTML5建站、商城网站开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为阿克苏等各大城市提供网站开发制作服务。引入依赖
需要注意这两个包之间的版本有一个对应关系,如果版本不对应可能会出问题
解码过程
实现的一个简单功能是:
从Socket获取视频输入流(H264格式)获取视频流中的帧把每一帧转换成 BufferedImage
package com.amwalle.walle.raspi.camera;import org.bytedeco.javacv.FFmpegFrameGrabber;import org.bytedeco.javacv.Frame;import org.bytedeco.javacv.Java2DFrameConverter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.InputStream;import java.net.Socket;public class CameraHandler implements Runnable { private static final Logger logger = LoggerFactory.getLogger(CameraHandler.class); private final String LOCK = "LOCK"; private Socket cameraSocket; private static BufferedImage bufferedImage; CameraHandler(Socket socket) throws IOException { this.cameraSocket = socket; } String getLock() { return LOCK; } @Override public void run() { try { InputStream cameraStream = cameraSocket.getInputStream(); FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(cameraStream); frameGrabber.setFrameRate(30); frameGrabber.setFormat("h364"); frameGrabber.setVideoBitrate(15); frameGrabber.setVideoOption("preset", "ultrafast"); frameGrabber.setNumBuffers(25000000); frameGrabber.start(); Frame frame = frameGrabber.grab(); Java2DFrameConverter converter = new Java2DFrameConverter(); while (frame != null) { BufferedImage bufferedImage = converter.convert(frame); setBufferedImage(bufferedImage); synchronized (LOCK) { LOCK.notifyAll(); } frame = frameGrabber.grab(); } } catch (IOException e) { logger.info("Video handle error, exit ..."); logger.info(e.getMessage()); } } private void setBufferedImage(BufferedImage image) { bufferedImage = image; } BufferedImage getBufferedImage() { return bufferedImage; }}
看完上述内容,你们掌握Java如何解码H264格式视频流中的图片的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!