当前位置: 首页 > 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();}}}

运行效果:

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

相关文章:

  • WebGL开发时尚设计系统
  • 一文讲清:生产报工系统的功能、报价以及如何选择
  • zerotier自建moon方法
  • Less的简单总结
  • bugku---misc---ping
  • 第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
  • Accelerate之大模型显存计算
  • 防止连续点击按钮,多次调用接口
  • 俄语演讲开场白,柯桥外贸俄语培训
  • 提升易用性,OceanBase生态管控产品的“从小到大”
  • 第六章:C++之设计模式(一)
  • mysql什么时候不需要建立索引
  • WPF Frame 简单页面切换示例
  • 最短路:spfa算法
  • 分治与递归
  • [数据结构]链表的实现在PHP中
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • JavaScript的使用你知道几种?(上)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js如何打印object对象
  • Laravel Telescope:优雅的应用调试工具
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vue组件定义
  • 阿里云购买磁盘后挂载
  • 从输入URL到页面加载发生了什么
  • 番外篇1:在Windows环境下安装JDK
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 三栏布局总结
  • 项目管理碎碎念系列之一:干系人管理
  • 学习Vue.js的五个小例子
  • 一个项目push到多个远程Git仓库
  • 阿里云ACE认证之理解CDN技术
  • ​【已解决】npm install​卡主不动的情况
  • #大学#套接字
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)(1.13) SiK无线电高级配置(六)
  • (js)循环条件满足时终止循环
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (补)B+树一些思想
  • (层次遍历)104. 二叉树的最大深度
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)为C# Windows服务添加安装程序
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ../depcomp: line 571: exec: g++: not found
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Core与存储过程(一)
  • .NET Project Open Day(2011.11.13)
  • .net web项目 调用webService
  • .NET 依赖注入和配置系统