首页 > 编程语言 >ffmpeg实现视频播放 ----------- Javacv

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

时间:2024-06-13 22:30:22浏览次数:25  
标签:视频 ffmpeg frame 音视频 ----------- grabber org 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,frame,音视频,-----------,grabber,org,Javacv,播放
From: https://blog.csdn.net/xuezhe5212/article/details/139637937

相关文章

  • Windows系统 搭建 FFmpeg运行环境
    一、下载FFMPEG进入FFMPEG官网下载界面http://www.ffmpeg.org/download.html;选择Windows平台的"WindowsbuildsbyBtbN"下载选项,然后会跳转到GitHub的Release发布版本界面https://github.com/BtbN/FFmpeg-Builds/releases;在GitHub界面下载最近的......
  • ffmpeg推送音视频流、拉取音视频流 —— Windows
    一、压缩视频文件例如将input.mp4转码成output.avi。在Windows下,打开cmd,执行:ffmpeg-iinput.mp4output.aviffmpeg-iinput.mp4output.avi有很多参数可以指定,见ffmpeg官网。例如:ffmpeg-iinput.mp4-c:vlibx264-presetultrafast-b:v6000koutput.avi 其中,......
  • Teamcenter AWC aw-chart自定义图表
    1.从服务器获取数据:exportconstqueryChartsData=function(data){// returnnewPromise(function(resolve){//  setTimeout(function(){    varURL_service=get_URL_service()+"reports/get_workflow_datas";//    eventBus.publish("pro......
  • 发布中文文档类资源仓库-ChineseDocumentPDF
    引言今天中午,排队打饭间隙,刷到新闻,说是:360AILAB-NLP团队开源了中文论文、研报文档场景的轻量化版式分析模型360LayoutAnalysis。面向中文论文及研报两个场景的轻量化版式分析模型已经开源:Github地址:https://github.com/360AILAB-NLP/360LayoutAnalysis,模型权重huggingface地......
  • 微信小程序-uniapp-切换tab时数据列表如何切换?
    如图: 这里有两个tab,要保证每次切换后列表保持不变,就必须在运行时要有两个持久化的数据源,每个tab是一个列表,让我们来设计一下这样的数据结构。首先我们的数据结构是这样的: 体现在vue的data是这样的: 正好对应tab的索引,当tab改变时,tab会回调索引:  模版中则......
  • kubernetes-外部数据库服务映射至集群内-Service与Endpoints的关系
    创建yaml文件配置数据库信息kind:ServiceapiVersion:v1metadata:name:mysql-svcnamespace:ops-systemspec:type:ClusterIP #Kubernetes将为此服务随机分配一个集群内部的IP地址ClusterIP类型的服务只能在集群内部访问,提供了一个内部访问的固定IP地址,不对......
  • javascript - 文件上传
    最简单的文件上传接口@ControllerpublicclassExcelCtrl{@ResponseBody@RequestMapping(value="upload",method=RequestMethod.POST)publicResultimportExcel(@RequestParamMultipartFilefile,HttpServletResponseresponse)throwsIOExceptio......
  • javascript - 面向对象
    要是直接百度,如何在javascript中创建一个对象,你能找到一堆这样的文章:《js创建对象的n种方式》、《闭包的n种写法》……咱们不参加考试,不要记那么多,整那么多写法,代码还不好维护。就例举几个,在实际项目开发过程中,比较好的代码写法。兼容语法1如果想兼容旧的浏览器,可以采......
  • 算法 - 搜索算法
    本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS。搜索相关题目BFSDFS#搜索相关题目深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此。#BFS广度优先搜索的搜索过程有点像一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个......
  • 学习日志-C51-串口通信
    学习日志-C51-串口通信串口控制LED灯亮灭1.常见通信串口比较分类1:单工:只能由甲向乙传输信号,一根传输线。半双工:数据可以在双方传输,但同一时刻只能单方传输,发送数据的同时不能接收数据,一根传输线。全双工:数据可以在双方传输,发送数据的同时也能接收数据,需两根传输线。......