Java解析视频FPS(帧率)、分辨率信息

devtools/2024/11/25 18:20:12/

以下分别介绍使用 Python 和 Java 解析视频的 FPS(帧率)和分辨率信息的方法:

Java 解析视频 FPS 和分辨率信息

在 Java 中,可以使用Xuggle库来处理视频并获取相关信息,不过需要先添加相应的依赖到项目中(例如在 Maven 项目中添加如下依赖):

<dependency><groupId>xuggle</groupId><artifactId>xuggle-xuggler</artifactId><version>5.4</version>
</dependency>

以下是示例代码:

java">import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IPacket;
import com.xuggle.xuggler.IPixelFormat;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;
import com.xuggle.xuggler.IVideoPicture;
import com.xuggle.xuggler.video.ConverterFactory;
import com.xuggle.xuggler.video.IConverter;public class VideoInfoParser {public static void getVideoInfo(String videoPath) {IContainer container = IContainer.make();if (container.open(videoPath, IContainer.Type.READ, null) < 0) {System.err.println("无法打开视频文件");return;}int numStreams = container.getNumStreams();for (int i = 0; i < numStreams; i++) {IStream stream = container.getStream(i);IStreamCoder coder = stream.getStreamCoder();if (coder.getCodecType() == IStreamCoder.CodecType.CODEC_TYPE_VIDEO) {// 获取帧率(FPS)double fps = coder.getFrameRate().getDouble();// 获取视频宽度(分辨率的一部分)int width = coder.getWidth();// 获取视频高度(分辨率的一部分)int height = coder.getHeight();System.out.println("视频帧率(FPS): " + fps);System.out.println("视频分辨率: " + width + "x" + height);}}container.close();}public static void main(String[] args) {String videoPath = "your_video_file_path.mp4";  // 替换为实际的视频文件路径getVideoInfo(videoPath);}
}

在上述 Java 代码中:

  1. 首先通过IContainer.make()创建一个视频容器对象,尝试使用container.open方法打开指定路径的视频文件,如果返回值小于 0 则表示打开失败,会输出错误提示并返回。
  2. 接着遍历视频容器中的所有流(stream),找到视频流(通过判断coder.getCodecType()是否为CODEC_TYPE_VIDEO来确定)。
  3. 对于视频流,使用coder.getFrameRate().getDouble()获取帧率信息,通过coder.getWidth()coder.getHeight()分别获取视频的宽度和高度(即分辨率信息),最后打印输出,完成后使用container.close()关闭视频容器。

另外,Java 中也可以使用JavaCV库来实现类似功能,添加依赖(以 Maven 项目为例)如下:

<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.8</version>
</dependency>

示例代码:

java">import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;public class VideoInfoParserWithJavaCV {public static void getVideoInfo(String videoPath) {try {FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);grabber.start();// 获取帧率(FPS)double fps = grabber.getFrameRate();// 获取视频宽度(分辨率的一部分)int width = grabber.getImageWidth();// 获取视频高度(分辨率的一部分)int height = grabber.getImageHeight();System.out.println("视频帧率(FPS): " + fps);System.out.println("视频分辨率: " + width + "x" + height);grabber.stop();grabber.release();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {String videoPath = "your_video_file_path.mp4";  // 替换为实际的视频文件路径getVideoInfo(videoPath);}
}

这段代码利用FFmpegFrameGrabber类来抓取视频帧,启动后通过grabber.getFrameRate()获取帧率,通过grabber.getImageWidth()grabber.getImageHeight()获取视频的宽度和高度(分辨率信息),最后记得停止并释放资源,避免资源泄露。


http://www.ppmy.cn/devtools/136903.html

相关文章

openCV与eigen两种方法---旋转向量转旋转矩阵

#include <Eigen/Dense> #include <opencv2/core/eigen.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() {// opencv 旋转向量cv::Vec3d rvec(1.0, 2.0, 3.0);cv::Mat rotation_matrix;cv::Rodrigues(rvec, rotati…

ESP8266 STA模式TCP服务器 电脑手机网络调试助手

STA模式TCP服务器和手机电脑网络调试助手多连接

CSS —— 子绝父相

相对定位&#xff1a;占位&#xff1b;不脱标 绝对定位&#xff1a;不占位&#xff1b;脱标 希望子元素相对于父元素定位&#xff0c;又不希望父元素脱标&#xff08;父元素占位&#xff09; 子级是 绝对定位&#xff0c;不会占有位置&#xff0c; 可以放到父盒子里面的任何一…

pyqt6、pyside6加载ui方法及路径总结

pyqt6、pyside6加载ui方法及路径总结 说明一、加载ui二、路径 说明 本教程适用于python3.11.X&#xff0c;pyqt6、pyside6.加载ui在一个项目中根目录及子目录的运用 一、加载ui pyqt6加载ui from PyQt6 import uic uic.loadUi(ui路径[str])#代码中添加加入这个代码就能加载…

C#之WPF的C1FlexGrid空间的行加载事件和列事件变更处理动态加载的枚举值

列变更&#xff0c;EnumDataItemStackClassTypeList数据源是枚举配置&#xff0c;实时查询到VM缓存的&#xff0c;如果是定义的枚举就不用这个麻烦了&#xff0c;直接在对象里面获取枚举值匹配&#xff0c;即 public string ApplyStatusName { get { retur…

pytorch经典训练流程

文章目录 [toc]1. **经典训练流程和任务&#xff1a;监督学习****1.1 什么是监督学习&#xff1f;****1.2 为什么要设计训练流程&#xff1f;****1.3 怎么设计训练流程&#xff1f;****代码示例&#xff1a;监督学习的典型流程** 2. **超参数设置****2.1 什么是超参数&#xff…

Scala全文单词统计

一&#xff1a;方法 package test5 import java.io.PrintWriter import scala.io.Source //可变的Map import scala.collection.mutable object test5_1 {def main(args: Array[String]): Unit { //1.读入文件val content Source.fromFile("1.txt").mkString // …

贪心算法(2)

目录 K次取反后最大化的数组和 题解&#xff1a; 代码&#xff1a; 按身高排序&#xff08;田忌赛马的预备&#xff09; 题解&#xff1a; 代码&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 优势洗牌&#xff08;田忌赛马&#xff09; 题解&#xff1a; 代…