当前位置: 首页 > news >正文

ffmpeg实现视频播放 ----------- Javacv

什么是Javacv和FFmpeg?
Javacv是一个专门为Java开发人员提供的计算机视觉库,它基于FFmpeg和Opencv库,提供了许多用于处理图
像、视频和音频的功能。FFmpeg是一个开源的音视频处理工具集,它提供了用于编码、解码、转换和播放音视频
文件的库和工具。

实现视频播放的步骤
要实现音视频同步播放,我们需要完成以下几个步骤
 1.加载音视频文件
 2.解码音视频流
 3.同步音视频播放
 4.染音视频数据

运行项目需要先导入pom依赖:

<properties><javacpp.version>1.5.5</javacpp.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--        javaCV依赖--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>${javacpp.version}</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>${javacpp.version}</version></dependency></dependencies>

1.加载音视频文件
首先,我们需要加载音视频文件。使用Javacv的FFmpegFrameGrabber类可以轻松地加载音视频文件。

​
String filePath = "path/to/video.mp4";
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath);
grabber.start();​

 2.解码音视频流
加载音视频文件后,我们需要解码音视频流。使用Javacv的Frame类可以轻松地解码音视频流。

​
Frame frame = nu11;
while ((frame = grabber.grabFrame()) != nul1) {//处理解码后的音视频数据
}​

 3.同步音视频播放
在解码音视频流之后,我们需要确保音频和视频能够同步播放。通常情况下,音频和视频的时间截是不一致的,我们可以通过比较音频和视频的时间戳来判断两者之间的差异,并进行相应的调整。

​long audioPts = frame.timestamp;long videoPts = //从视频中获取时间long ptsDiff = audioPts - videoPts;if (ptsDiff > 0) {//音频时间较大,视频播放较慢,需要进行快进处理} else if (ptsDiff < 0) {//视频时间戳较大,音频播放较慢,需要进行快进处理} else {//音频和视频时间戳一致,正常播放}​

 4.染音视频数据
最后,我们需要将解码后的音视频数据染到屏幕上。使用Javacv的CanvasFrame类可以创建一个窗口,并将音频和视频数据染到窗口上。

​CanvasFrame canvasFrame = new CanvasFrame("Video Player");canvasFrame.setcanvasSize(grabber.getImageWidth,grabber.getImageHeight());while((frame = grabber.grabFrame()) != nul1) {canvasFrame.showImage(frame);}​

  完整示例代码
下面是一个完整的示例代码,演示如何使用Javacv和FFmpeg实现音视频同步播放:

import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;public class VideoPlayer {public static void main(String[] args) {String filePath = "d:/test/yq.mp4";FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath);try {grabber.start();CanvasFrame canvasFrame = new CanvasFrame("video Player");canvasFrame.setCanvasSize(grabber.getImageWidth(), grabber.getImageHeight());Frame frame = null;while ((frame = grabber.grabFrame()) != null) {canvasFrame.showImage(frame);}canvasFrame.dispose();grabber.stop();} catch (FrameGrabber.Exception e) {e.printStackTrace();}}}

运行效果:

                              感谢大家的阅读,觉得有所帮助的朋友点点关注点点赞! 

相关文章:

ffmpeg实现视频播放 ----------- Javacv

什么是Javacv和FFmpeg&#xff1f; Javacv是一个专门为Java开发人员提供的计算机视觉库&#xff0c;它基于FFmpeg和Opencv库&#xff0c;提供了许多用于处理图 像、视频和音频的功能。FFmpeg是一个开源的音视频处理工具集&#xff0c;它提供了用于编码、解码、转换和播放音视频…...

解决更新Android Studio后下载Gradle超时

随着Android Studio的更新&#xff0c;所需要的最低Gradle版本也在变化&#xff0c;这时候构建项目的时候就需要先下载所需的Gradle发行版。对于Gradle构建项目&#xff0c;我们已经知道项目使用的Gradle是在根项目的gradle/wrapper/gradle-wrapper.properties文件中定义的&…...

智能合约漏洞类型

Are We There Yet? Unraveling the State-of-the-Art Smart Contract Fuzzers | Proceedings of the IEEE/ACM 46th International Conference on Software Engineering...

6.7.31 使用端到端训练的基于 EfficientNet 的卷积网络在双视图乳房 X 线摄影中进行乳腺癌诊断

最好的技术之一进行了两次迁移学习:第一种是使用在自然图像上训练的模型来创建“块分类器”,对子图像进行分类;第二种是使用块分类器扫描整个乳房 X 光检查并创建“单视图全图像分类器”。建议进行第三次迁移学习,以获得一个“双视图分类器”,以使用两个乳房 X 光检查视图…...

访问方法(反射)

文章目录 前言一、访问成员方法的方法二、Method类 1.常用方法2.实操展示总结 前言 为了实现在某类中随时可以调用其他类的方法&#xff0c;java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法&#xff0c;利用Methoc对象可以操纵相应的方法…...

探索Excel的隐藏功能:如何求和以zzz开头的列

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 步骤一&#xff1a;定位"zzz"开头的列 需要找到所有以"zzz"开头的列。在Excel中&#xff0c;你可以通过以下几种方法来实现&#xff1a; 手动查找&#xff1a;滚动查看列标题&#xff0c;找到…...

git:切换到指定的commit

背景 今天合并人家代码的时候&#xff0c;报冲突了&#xff0c;然后解决完冲突以后&#xff0c;发现有个冲突干错了&#xff0c;但是都已经commit了&#xff0c;所以我就想那就回到这次merge之前的我的分支的commit 解决过程 取消合并 我先查了能否直接取消合并&#xff0c…...

js之事件监听以及相关案例

这里写目录标题 一级目录二级目录三级目录 Web APIs02一、事件监听1.定义2.调用语法3.事件监听三要素4.事件监听版本 二、事件类型随机点名之事件监听版本案例要求大致思路先获取dom对象理解程序运行 完整代码 一级目录 二级目录 三级目录 Web APIs02 一、事件监听 1.定义…...

pip 安装出现 ERROR: Command errored out with exit status 1: 问题解决

使用pip 安装第三方库&#xff0c;前面在升级pip&#xff08;使用python.exe -m pip install --upgrade pip&#xff09;也出现如下错误&#xff1a; ERROR: Command errored out with exit status 1: command: d:\python_3_7_6\python.exe C:\Users\xxxXXXXoooOOOO\AppData…...

图的遍历介绍

概念 特点 无论是进行哪种遍历&#xff0c;均需要通过设置辅助数组标记顶点是否被访问来避免重复访问&#xff01;&#xff01;&#xff01;&#xff01; 类型 深度优先遍历 可以实现一次遍历访问一个连通图中的所有顶点&#xff0c;只要连通就能继续向下访问。 因此&#x…...

实验二、网络属性设置《计算机网络》

精神状态 be like&#xff1a;边写边崩溃&#xff0c;越写越得劲儿。 目录 一、实验目的&#xff1a; 二、实验内容 三、实验步骤&#xff1a; 四、实验小结 一、实验目的&#xff1a; 掌握 IP 地址、子网掩码等网络属性的设置。 二、实验内容 预备知识&#xff1a; 1、…...

【Python数据魔术】:揭秘类型奥秘,赋能代码创造

文章目录 &#x1f680;一.运算符&#x1f308;1. 算术运算符&#x1f308;2. 身份运算符&#x1f308;3. 成员运算符⭐4. 增量运算符⭐5. 比较运算符⭐6. 逻辑运算符 &#x1f680;二.可变与不可变&#x1f680;三.字符串转义&#x1f680;四.编码与解码&#x1f4a5;1. 基础使…...

Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds+

Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds 加载一张宽高约100px多些的小图&#xff0c;是一张相当小的正常图片&#xff0c;loading Bitmap from RESOURCE_DISK_CACHE竟然耗时达到惊人的3秒左右&#xff01;&#xff08;打开Glide调试…...

微调技术:人工智能领域的神奇钥匙

在人工智能的浪潮中&#xff0c;深度学习技术凭借其强大的数据处理和学习能力&#xff0c;已成为推动科技进步的重要引擎。然而&#xff0c;深度学习模型的训练往往需要大量的数据和计算资源&#xff0c;这在某些特定场景下成为了限制其发展的瓶颈。为了解决这个问题&#xff0…...

MyBatis 参数上的处理的细节内容

1. MyBatis 参数上的处理的细节内容 文章目录 1. MyBatis 参数上的处理的细节内容2. MyBatis 参数上的处理3. 准备工作4. 单个(一个)参数4.1 单个(一个)简单类型作为参数4.2 单个(一个) Map集合 作为参数4.3 单个(一个) 实体类POJO作为参数 5. 多个参数5.1 Param注解(命名参数)…...

水帘降温水温

不同环境下的水帘啊&#xff0c;使用水温是不一样的&#xff0c;夏天使用水疗的水有两种&#xff0c;一个是常温的循环水&#xff0c;20~26左右&#xff0c;另外一个呢&#xff0c;就是深井水&#xff0c;重点是啥呢&#xff1f;就是无论我们用哪一种&#xff0c;能够把温度降到…...

kafka如何保证消息不丢失

Kafka发送消息是异步发送的&#xff0c;所以我们不知道消息是否发送成功&#xff0c;所以会可能造成消息丢失。而且Kafka架构是由生产者-服务器端-消费者三种组成部分构成的。要保证消息不丢失&#xff0c;那么主要有三种解决方法。 生产者(producer)端处理 生产者默认发送消息…...

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8)

流媒体学习之路(WebRTC)——音频NackTracker优化思路&#xff08;8&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实…...

Java基础面试重点-2

21. JVM是如何处理异常&#xff08;大概流程&#xff09;&#xff1f; 如果发生异常&#xff0c;方法会创建一个异常对象&#xff08;包括&#xff1a;异常名称、异常描述以及异常发生时应用程序的状态&#xff09;&#xff0c;并转交给JVM。创建异常对象&#xff0c;并转交给…...

【活动文章】通用大模型VS垂直大模型,你更青睐哪一方

垂直大模型和通用大模型各有其特定的应用场景和优势。垂直大模型专注于特定领域&#xff0c;提供深度的专业知识和技能&#xff0c;而通用大模型则具备广泛的适用性和强大的泛化能力。以下是一些垂直大模型和通用大模型的例子&#xff1a; 垂直大模型 BERT-Financial&#xf…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...