• 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. }

    运行效果:

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

  • 相关阅读:
    C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.3 其他运算符
    vue打包文件过大、Vue打包压缩
    edge 浏览器插件 demo --chatGpt
    Postgresql实验系列(3)最简脏读插件
    BIM如何通过3D开发工具HOOPS实现WEB轻量化?
    ES6 入门教程 8 函数的扩展 8.2 rest 参数 & 8.3 严格模式
    Django开发之初识篇
    身份证实名认证API接口,选择的时候应该注意什么?
    【单片机毕业设计】【mcuclub-jj-052】基于单片机的电脑散热底座的设计
    【网络安全 --- 工具安装】Centos 7 详细安装过程及xshell,FTP等工具的安装(提供资源)
  • 原文地址:https://blog.csdn.net/xuezhe5212/article/details/139637937