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
  • asp之家 软件编程 m.aspxhome.com