当前位置:网站首页 > Java教程 > 正文

java文件转视频教程



本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取、码率压缩、分辨率转换等功能;

之前在网上浏览了一大圈Java使用FFmpeg处理音视频的文章,大多都讲的比较简单,楼主在实操过程中踩了很多坑也填了很多坑,希望这份详细的踩坑&填坑指南能帮助到大家;

点我了解

在使用Java调用FFmpeg处理音视频之前,需要先安装FFmpeg,安装方法分为两种:

  • 引入封装了FFmpeg的开源框架
  • 在系统中手动安装FFmpeg

JAVE.jar(官网点我) 是一个封装了FFmpeg的Java框架,在项目中能直接调用它的API来处理音视频文件;

优点:使用方便,直接在项目中引入JAVE.jar即可处理媒体文件,且开发完成后可以随工程一起打包发布,不需要在目标运行环境内手动安装FFmpeg相关的类库

缺点:JAVE.jar最后一次更新是2009年,其封装的FFmpeg版本是09年或更早前的版本,比较老旧,无法使用一些新特性
(当然也可以看看有没有其他比较新的封装了FFmpeg的框架)

Maven坐标如下:

 

在运行环境中手动安装FFmpeg稍微有一些麻烦,可以百度 windows/mac安装FFmpeg 这样的关键字,根据网上的安装教程将FFmpeg安装到系统中;

懒人链接:Windows安装教程 Mac安装教程

优点:可以直接调用FFmpeg的相关API处理音视频,FFmpeg版本可控

缺点:手动安装较为麻烦,开发环境与目标运行环境都需要先安装好FFmpeg

使用JAVE.jar进行开发与直接使用FFmpeg开发的代码有一些不同,这里以直接使用FFmpeg进行开发的代码进行讲解(开发环境MacOS);(使用JAVE的代码、直接使用FFmpeg的代码都会附在文末供大家下载参考)

通过类及其依赖的类,你将可以实现:

  • 解析源视频的基本信息,包括视频格式、时长、码率等;
  • 解析音频、图片的基本信息;
  • 将源视频转换成不同分辨率、不同码率、带或不带音频的新视频;
  • 抽取源视频中指定时间点的帧画面,来生成一张静态图;
  • 抽取源视频中指定时间段的帧画面,来生成一个GIF动态图;
  • 截取源视频中的一段来形成一个新视频;
  • 抽取源视频中的音频信息,生成单独的MP3文件;
  • 对音视频等媒体文件执行自定义的FFmpeg命令;

是整个解析程序中的核心类,封装了各种常用的解析方法供外部调用;

定义了多媒体数据共有的一些属性, 都继承自,分别定义了视频、音频、图片数据相关的一些属性;

在抽取视频帧数、制作GIF动态图的时候会使用到;

定义了三种常用的FFmpeg压缩视频时使用到的crf值,定义了FFmpeg压缩视频时常用的几种压缩速率值;

有关crf、preset的延伸阅读点我

3.2.1 使用前需要注意的几点

  1. 指定正确的FFmpeg程序执行路径

    MacOS安装好FFmpeg后,可以在控制台中通过命令获取FFmpeg程序的执行路径,在调用MediaUtil.java前先通过其 setFFmpegPath() 方法设置好FFmpeg程序在系统中的执行路径,然后才能顺利调用到FFmpeg去解析音视频;

    Windows系统下该路径理论上应设置为:FFmpeg可执行程序在系统中的绝对路径(实际情况有待大家补充)
  2. 指定解析音视频信息时需要的正则表达式

    因项目需要解析后缀格式为 .MP4 .WMV .AAC 的视频和音频文件,所以我研究了JAVE.jar底层调用FFmpeg时的解析逻辑后,在MediaUtil.java中设置好了匹配这三种格式的正则表达式供解析时使用(参考程序中的 这三个表达式值);

    注意:如果你需要解析其他后缀格式如 .MKV .MP3 这样的媒体文件时,你很可能需要根据实际情况修改 这三个正则表达式的值,否则可能无法解析出正确的信息;
  3. 程序中的很多默认值你可以根据实际需要修改,比如视频帧抽取的默认宽度或高度值、时长等等;

3.2.2 MediaUtil.java代码

 

3.2.3 踩坑&填坑

  1. 在Linux等服务器上部署Java程序进行视频压缩时,多注意一下运行账号的权限问题,有时候可能是由于运行程序没有足够的文件操作权限,导致压缩过程失败;
  2. 第一版程序上线后,偶尔会出现这样的问题:

    调用MediaUtil.java进行视频压缩过程中,整个程序突然“卡住”,后台也没有日志再打印出来,此时整个压缩过程还没有完成,像是线程突然阻塞住了;

    经过多番查找,发现Java调用FFmpeg时,实际是在JVM里产生一个子进程来执行压缩过程,这个子进程与JVM建立三个通道链接(包括标准输入、标准输出、标准错误流),在压缩过程中,实际会不停地向标准输出和错误流中写入信息;

    因为本地系统对标准输出及错误流提供的缓冲区大小有限,当写入标准输出和错误流的信息填满缓冲区时,执行压缩的进程就会阻塞住;

    所以在压缩过程中,需要单独创建两个线程不停读取标准输出及错误流中的信息,防止整个压缩进程阻塞;(参考中的 executeCommand() 方法中的 和 这两个内部类实例的操作)

因项目最后部署在CentOS服务器上,需提前在服务器上安装好FFmpeg程序,这过程中也踩了不少坑,针对此写了另一篇总结文章,参考这里 点我哦

这里提供两种版本的源码供大家下载参考:

  • 引入封装了FFmpeg的开源框架Jave.jar的版本 点我下载
  • 在系统中手动安装FFmpeg的版本 点我下载

有问题可以在评论区留言,欢迎大家一起交流讨论 _ ~

  • 上一篇: java编织教程
  • 下一篇: java ngix教程
  • 版权声明


    相关文章:

  • java编织教程2025-02-28 10:42:05
  • 主题教程java2025-02-28 10:42:05
  • java诸葛教程视频2025-02-28 10:42:05
  • java视频教程eclipse2025-02-28 10:42:05
  • java soap教程2025-02-28 10:42:05
  • java ngix教程2025-02-28 10:42:05
  • c转java教程2025-02-28 10:42:05
  • java buffer教程2025-02-28 10:42:05
  • java教程窗口2025-02-28 10:42:05
  • java240教程2025-02-28 10:42:05