Java解码H264格式视频流中的图片
作者:weixin_42534940 时间:2023-11-24 23:58:24
本文实例为大家分享了Java解码H264格式视频流中的图片,供大家参考,具体内容如下
引入依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.0.2-1.4.3</version>
</dependency>
需要注意这两个包之间的版本有一个对应关系,如果版本不对应可能会出问题
解码过程
实现的一个简单功能是:
从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("h264");
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;
}
}
来源:https://blog.csdn.net/weixin_42534940/article/details/87711310
标签:java,解码,视频流
0
投稿
猜你喜欢
Java使用FFmpeg处理视频文件的方法教程
2022-05-12 20:46:21
Java基于ArrayList实现群主发红包功能
2022-04-06 20:34:09
android编程之xml文件读取和写入方法
2022-08-23 05:47:48
Android获取和读取短信验证码的实现方法
2021-09-06 07:29:17
Java设计模式之装饰模式详解
2022-09-27 05:55:32
关于springboot响应式编程整合webFlux的问题
2023-12-07 07:25:55
Java实现inputstream流的复制代码实例
2021-08-30 11:52:11
关于Mybatis插入对象时空值的处理
2023-08-28 21:58:00
Android控件设置宽高比的方法
2023-02-14 09:30:04
springmvc的文件保存方法详解
2023-06-12 00:33:43
Android 编程下字库的使用及注意事项
2021-09-23 13:37:59
SpringBoot中多环境配置和@Profile注解示例详解
2023-11-29 05:39:04
C#把dll分别放在指定的文件夹的方法步骤
2022-08-19 10:03:51
SpringMVC实现上传下载文件
2022-11-10 03:18:14
c#调用vc写的ocx控件示例
2021-09-26 19:34:00
Android内存泄漏的轻松解决方法
2023-08-27 01:51:30
Android开发之绘制平面上的多边形功能分析
2023-12-13 13:31:57
mybatis拦截器与分页插件实例教程
2021-11-16 15:41:48
Go Java算法最大单词长度乘积示例详解
2022-09-27 18:16:19
C#套接字(Socket)通信之UDP组播详解
2022-06-11 05:49:52