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


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

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

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

    1. 1.5.5
    2. org.springframework.boot
    3. spring-boot-starter
    4. org.projectlombok
    5. lombok
    6. true
    7. org.springframework.boot
    8. spring-boot-starter-test
    9. test
    10. org.bytedeco
    11. javacv
    12. ${javacpp.version}
    13. org.bytedeco
    14. javacv-platform
    15. ${javacpp.version}

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

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

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

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

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

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

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

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

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

    1. import org.bytedeco.javacv.CanvasFrame;
    2. import org.bytedeco.javacv.FFmpegFrameGrabber;
    3. import org.bytedeco.javacv.Frame;
    4. import org.bytedeco.javacv.FrameGrabber;
    5. public class VideoPlayer {
    6. public static void main(String[] args) {
    7. String filePath = "d:/test/yq.mp4";
    8. FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath);
    9. try {
    10. grabber.start();
    11. CanvasFrame canvasFrame = new CanvasFrame("video Player");
    12. canvasFrame.setCanvasSize(grabber.getImageWidth(), grabber.getImageHeight());
    13. Frame frame = null;
    14. while ((frame = grabber.grabFrame()) != null) {
    15. canvasFrame.showImage(frame);
    16. }
    17. canvasFrame.dispose();
    18. grabber.stop();
    19. } catch (FrameGrabber.Exception e) {
    20. e.printStackTrace();
    21. }
    22. }
    23. }

    运行效果:

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

  • 相关阅读:
    UE5实战篇二(对话系统1):导语
    js刷题常用基础函数&常用快捷键
    如何入门 AI:从初学者到人工智能专家的完整指南
    spring-boot---validation,参数校验,分组,嵌套,各种类型
    14:00面试,14:06就出来了,问的问题有点变态。。。
    利用python来打印九九乘法表
    快鲸scrm管理系统:六大功能实现企业营收更大化
    打开Outlook报错修复
    容器化实践:优化DevOps环境下的容器交付流程
    Ubuntu系统设置
  • 原文地址:https://blog.csdn.net/xuezhe5212/article/details/139637937