JAVACV实现视频流转视频文件和视频截取

news/2024/11/25 21:36:25/

MAVEN 依赖

  <!-- mac 平台报错 https://gitee.com/52jian/EasyMedia/issues/I5ZMMR--><!-- 媒体只用到以下两个,javacv、ffmpeg --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.7</version></dependency><!--全平台的ffmpeg--><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg-platform</artifactId><version>5.0-1.5.7</version></dependency><!-- hutool工具包 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.3</version></dependency>

JavaCvUtil

package com.zj.util;import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.springframework.util.StopWatch;import java.io.IOException;/*** @author 小布* @version 1.0.0* @className JavaCvUtil.java* @createTime 2023年08月19日 11:10:00*/
@Slf4j
public class JavaCvUtil {/*** convertFileByApi*借助JavaCV和ffmpeg的api* @param sourcePath       sourcePath 可以是流地址或者文件地址* @param fileFullPathName fileFullPathName* @param duration         duration 录制时长 只针对视频流录制* @return java.lang.String* @author xiaobu* @date 2023/8/21 9:40*/public static String convertStream2FileByApi(String sourcePath, String fileFullPathName, int duration) {long beginTime = System.currentTimeMillis();FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(sourcePath);Frame capturedFrame = null;FFmpegFrameRecorder recorder = null;try {frameGrabber.start();frameGrabber.getLengthInTime();//获取video得类型 如MP4等String videoType = fileFullPathName.substring(fileFullPathName.lastIndexOf(".") + 1);recorder = new FFmpegFrameRecorder(fileFullPathName, frameGrabber.getImageWidth(), frameGrabber.getImageHeight(), frameGrabber.getAudioChannels());recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat(videoType);recorder.setFrameRate(frameGrabber.getFrameRate());recorder.setVideoBitrate(frameGrabber.getVideoBitrate());recorder.setAudioBitrate(192000);recorder.setAudioOptions(frameGrabber.getAudioOptions());recorder.setAudioQuality(0);recorder.setSampleRate(44100);recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.start();while (true) {try {capturedFrame = frameGrabber.grabFrame();if (capturedFrame == null) {System.out.println("!!! Failed cvQueryFrame");break;}recorder.record(capturedFrame);long nowTime = System.currentTimeMillis();long costTime = nowTime - beginTime;//duration S自动断开if (costTime >= duration * 1000L) {log.info("【convertFileByApi】::costTime ==> 【{}】", costTime);break;}} catch (Exception e) {e.printStackTrace();}}recorder.stop();recorder.release();frameGrabber.stop();frameGrabber.release();recorder.close();frameGrabber.close();} catch (Exception e) {e.printStackTrace();}//返回转码后视频文件名称return fileFullPathName;//返回转码后视频全路径//return fileFullPathName;}/*** convertFile2FileByApi** @author 小布* @date 2023/8/21 13:33* @param sourcePath sourcePath* @param fileFullPathName fileFullPathName* @param duration duration 录制时长(z)* @return java.lang.String*/public static String convertFile2FileByApi(String sourcePath, String fileFullPathName, int duration) {long beginTime = System.currentTimeMillis();FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(sourcePath);Frame capturedFrame = null;FFmpegFrameRecorder recorder = null;try {frameGrabber.start();frameGrabber.setTimestamp(20 * 1000000);// 视频的时长 微秒long lengthInTime = frameGrabber.getLengthInTime();String format = String.format("视频长度:%s(S)",  lengthInTime / 1000 / 1000);System.out.println(format);//获取video得类型 如MP4等String videoType = fileFullPathName.substring(fileFullPathName.lastIndexOf(".") + 1);recorder = new FFmpegFrameRecorder(fileFullPathName, frameGrabber.getImageWidth(), frameGrabber.getImageHeight(), frameGrabber.getAudioChannels());recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat(videoType);recorder.setFrameRate(frameGrabber.getFrameRate());recorder.setVideoBitrate(frameGrabber.getVideoBitrate());recorder.setAudioBitrate(192000);recorder.setAudioOptions(frameGrabber.getAudioOptions());// Highest qualityrecorder.setAudioQuality(0);recorder.setSampleRate(44100);recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.start();int count = 0;while (true) {try {capturedFrame = frameGrabber.grabFrame();if (capturedFrame == null) {log.error("【convertFile2FileByApi】::【!!! Failed cvQueryFrame】");break;}count++;if (count > 1000) {break;}recorder.record(capturedFrame);long nowTime = System.currentTimeMillis();long costTime = nowTime - beginTime;//duration S自动断开if (costTime >= duration * 1000L) {log.info("【convertFileByApi】::costTime ==> 【{}】", costTime);break;}} catch (Exception e) {e.printStackTrace();}}recorder.stop();recorder.release();frameGrabber.stop();frameGrabber.release();recorder.close();frameGrabber.close();} catch (Exception e) {e.printStackTrace();}//返回转码后视频文件名称return fileFullPathName;//返回转码后视频全路径//return fileFullPathName;}/*** 基于JavaCV跨平台调用ffmpeg命令* duration 录制时长为多少秒的视频*/public static String convertByCommand(String sourcePath, String destPath, String duration) {StopWatch stopWatch = new StopWatch();stopWatch.start("开始执行基于JavaCV跨平台调用ffmpeg命令录制视频");try {String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);ProcessBuilder pb = new ProcessBuilder(ffmpeg, "-i", sourcePath, "-vcodec", "h264", destPath);if (StrUtil.isNotBlank(duration)) {pb = new ProcessBuilder(ffmpeg, "-i", sourcePath, "-vcodec", "h264", "-t", duration, destPath);}pb.inheritIO().start().waitFor();} catch (InterruptedException | IOException e) {e.printStackTrace();}stopWatch.stop();log.info("【convertByFfmpegCommand】::stopWatch.getTotalTimeSeconds() ==> 【{}】", stopWatch.getTotalTimeSeconds());return destPath;}}

JAVACV 版本说明
JAVACV 基于JavaCV跨平台执行ffmpeg命令
JavaCV入门


http://www.ppmy.cn/news/1050334.html

相关文章

zookeeper详细介绍

ZooKeeper是一个开源的分布式协调服务,具有以下一些关键特点: 数据模型 ZooKeeper的数据模型采用层次化的多叉树形结构,每个节点称为znode,类似于文件系统中的文件和目录。每个znode可以存储数据和控制信息。一致性保证 ZooKeeper通过ZAB协议,实现分布式环境下数据的强一致性,…

SecureCRT 密码破解(JAVA 版)

适用版本: SecureCRT 7.3.3 之后的版本 - Password V2 算法 参考文章: how-does-SecureCRT-encrypt-password内网常用工具密码AES-256-CBC加密Java实现SHA256算法 全部代码: import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameter…

5.6.webrtc三大线程

那今天呢&#xff1f;我们来介绍一下web rtc的三大线程&#xff0c;那为什么要介绍这三大线程呢&#xff1f;最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢&#xff1f;我们就知道其他线程与它们之间是怎样关系&#xf…

【LeetCode-经典面试150题-day11】

目录 128.最长连续序列 228.汇总区间 56.合并区间 57.插入区间 452.用最少数量的箭引爆气球 128.最长连续序列 题意&#xff1a; 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并…

linux的http服务

Web通信基本概念 基于B/S&#xff08;Browser/Server&#xff09;架构的网页服务 服务端提供网页 浏览器下载并显示网页 Hyper Text Markup Lanuage,超文本标记语言 Hyper Text Transfer Protocol&#xff0c;超文本传输协议 虚拟机A&#xff1a;构建基本的Web服务 [root…

HTML <svg> 标签

实例 画一个圆: <svg width="100" height="100"><circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" /> </svg>页面下方有更多 TIY 实例。…

用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

Byzer-Notebook 是专门为 SQL 而研发的一款 Web Notebook。他的第一公民是 SQL&#xff0c;而 Jupyter 则是是以 Python 为第一公民的。 随着 Byzer 引擎对大模型能力的支持日渐完善&#xff0c; Byzer-Notebook 也在不自觉中变得更加强大。我和小伙伴在聊天的过程中才发现他已…

基于PaddlePaddle实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…