Java处理视频文件,生成打标视频

2023-10-21 07:01

本文主要是介绍Java处理视频文件,生成打标视频,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import org.apache.commons.lang3.StringUtils;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;/*** @author Mr.superbeyone* @project * @className FfmpegUtil2* @description* @date 2023-10-20 15:15**/public class FfmpegUtil2 {private static Logger logger = LoggerFactory.getLogger(FfmpegUtil2.class);/*** 生成标注后的视频文件** @param srcVideoPath 源视频文件路径* @param frameRate    跳帧请求RPC的步数* @param extName      生成的文件扩展名 如: mp4  flv* @return 标注后的视频文件路径*/public static String generateTagVideo(String srcVideoPath, int frameRate, String extName) {return generateTagVideo(srcVideoPath, null, frameRate, extName);}public static String generateTagVideo(String srcVideoPath, String targetVideoPath, int frameRate, String extName) {long start = System.currentTimeMillis();//视频文件路径File srcVideoFile = new File(srcVideoPath);if (!srcVideoFile.exists() || !srcVideoFile.isFile()) {logger.info("generateTagVideo srcVideoPath is not video file {}", srcVideoPath);return "";}if (StringUtils.isBlank(targetVideoPath)) {targetVideoPath = srcVideoFile.getParentFile() + File.separator + StringUtils.substringBeforeLast(srcVideoFile.getName(), ".") + "_tag." + extName;}String targetVideo = doGenerateTagVideo(srcVideoPath, targetVideoPath, frameRate, extName);logger.info("generateTagVideo 耗时 {}", (System.currentTimeMillis() - start));logger.info("generateTagVideo srcVideo {} targetVideo {}", srcVideoPath, targetVideo);return targetVideo;}public static String doGenerateTagVideo(String srcVideoPath, String targetVideoPath, int frameRate, String extName) {FFmpegFrameGrabber grabber = null;FFmpegFrameRecorder recorder = null;try {grabber = FFmpegFrameGrabber.createDefault(new File(srcVideoPath));grabber.setFormat(StringUtils.substringAfterLast(srcVideoPath, ".").toLowerCase());grabber.start();int imageHeight = grabber.getImageHeight();int imageWidth = grabber.getImageWidth();recorder = FFmpegFrameRecorder.createDefault(new File(targetVideoPath), imageWidth, imageHeight);recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);recorder.setFormat(extName);recorder.setVideoBitrate(10000);//数值越大,存储空间越大recorder.setVideoOption("preset", "ultrafast");//究极快recorder.start();Java2DFrameConverter converter = new Java2DFrameConverter();int index = 0, x = 0, y = 0, width = 0, height = 0;Frame frame;while ((frame = grabber.grabImage()) != null) {if (null == frame.image) {continue;}index++;BufferedImage image = converter.getBufferedImage(frame);if (frameRate > 0 && index % frameRate == 0) {Map<String, Integer> location = rpcFindLocation(image);x = location.get("x");y = location.get("y");width = location.get("w");height = location.get("h");}Graphics graphics = image.getGraphics();graphics.setColor(Color.RED);graphics.drawRect(x, y, width, height);Frame drawFrame = converter.convert(image);recorder.record(drawFrame);}recorder.close();grabber.close();} catch (Exception e) {logger.error("doGenerateTagVideo exception ", e);} finally {if (grabber != null) {try {grabber.close();} catch (Exception ex) {logger.error("close grabber error", ex);}}if (recorder != null) {try {recorder.close();} catch (Exception ex) {logger.error("close recorder error", ex);}}}return targetVideoPath;}/*** 对图片文件RPC调用** @param image 图片文件* @return x, y, w, h*/private static Map<String, Integer> rpcFindLocation(BufferedImage image) {Map<String, Integer> location = new HashMap<>(8);Random random = new Random();location.put("x", 800 + random.nextInt(100));location.put("y", 750 + random.nextInt(50));location.put("w", 50 + random.nextInt(10));location.put("h", 50 + random.nextInt(10));return location;}public static void main(String[] args) {long start = System.currentTimeMillis();String srcPath = "D:\\WorkSpace\\video\\src\\b.mp4";String destPath = "D:\\WorkSpace\\video\\src\\test\\" + System.currentTimeMillis() + ".flv";generateTagVideo(srcPath, destPath, 10, "flv");System.out.println(destPath + "耗时\t" + (System.currentTimeMillis() - start) + "毫秒");}
}

参考

这篇关于Java处理视频文件,生成打标视频的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/252732

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory