背景

项目中有一个需求,要获取前端上传过来的视频的时长、分辨率等信息。网上查了下,java后端基本上都是用的jave获取视频信息,jave的官网在此。

不过网上的教程都是获取本地视频的信息,jave提供的功能也不支持获取网络视频的信息。那要怎么搞咧?

首先看下jave的原理,jave使用FFmpeg处理多媒体文件。

jave将FFmpeg的可执行文件放到了jar包里面,在运行的时候将FFmpeg可执行文件拷贝到操作系统的临时文件夹中,并通过命令行来调用FFmpeg。这里面包含了windows的可执行文件和linux的可执行文件。jave源码包结构如下图:

所以现在就要看FFmpeg是否支持通过网络URL获取视频信息,FFmpeg官网在此,可以查看到FFmpeg是支持网络URL的。我们打开cmd,cd到FFmpeg所在目录,执行如下命令

ffmpeg.exe -i http://vd3.bdstatic.com/mda-jk060vvmi12xmdc9/mda-jk060vvmi12xmdc9.mp4

发现是可以获取到视频信息的,红框是视频信息

那么我们就需要改源码了,源码在文章的最后面,可以直接使用。

方案

修改Encoder.java这个类,增加一个方法如下:

public MultimediaInfo getInfo(String httpUrl) throws InputFormatException,EncoderException {// 将开头的https替换成http,ffmpeg获取https视频会报错httpUrl = httpUrl.replaceAll("^https", "http");FFMPEGExecutor ffmpeg = locator.createExecutor();ffmpeg.addArgument("-i");ffmpeg.addArgument(httpUrl);try {ffmpeg.execute();} catch (IOException e) {throw new EncoderException(e);}try {RBufferedReader reader = new RBufferedReader(new InputStreamReader(ffmpeg.getErrorStream()));return parseMultimediaInfo(httpUrl, reader);} finally {ffmpeg.destroy();}
}

此处有个坑,这个FFmpeg不支持https的URL,需将https替换成http,使用https的视频url会报错no such file or directory

然后将原有的getInfo方法修改如下:

public MultimediaInfo getInfo(File source) throws InputFormatException,EncoderException {return getInfo(source.getAbsolutePath());
}

注释掉parseMultimediaInfo方法的这两行,原因是这篇文章后面替换成新版的FFmpeg,解析的文本内容格式不一样,需要调整下。

} else if (step == 1) {Matcher m = p2.matcher(line);if (m.matches()) {long hours = Integer.parseInt(m.group(1));long minutes = Integer.parseInt(m.group(2));long seconds = Integer.parseInt(m.group(3));long dec = Integer.parseInt(m.group(4));long duration = (dec * 100L) + (seconds * 1000L)+ (minutes * 60L * 1000L)+ (hours * 60L * 60L * 1000L);info.setDuration(duration);step++;}/* else {step = 3;}*/
} else if (step == 2) {

使用方式如下:

Encoder encoder = new Encoder();
MultimediaInfo info = encoder.getInfo(sourceUrl);
log.info("ffmpeg解析结果:" + JSONObject.toJSONString(info));
long duration = info.getDuration();
log.info("视频时长:" + duration);

然后将代码打成jar包,放入工程里的resources的lib目录下,pom增加如下

<dependency><groupId>com.baqi</groupId><artifactId>jave</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/myJave-1.0.0.jar</systemPath>
</dependency>

然后因为是SpringBoot项目编译后的路径问题,引入本地包时,还需要在编译插件增加一个配置

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- 包含本地jar --><configuration><includeSystemScope>true</includeSystemScope></configuration>
</plugin>

将项目发布到linux服务器上运行时,又遇到另一个坑,发现运行时会报错,获取不了视频时长和分辨率等信息。把项目中的linux版本的可执行FFmpeg文件拷贝到linux服务器上,执行

./ffmpeg -i http://vd3.bdstatic.com/mda-jk060vvmi12xmdc9/mda-jk060vvmi12xmdc9.mp4

会报错 I/O error occured

也许是系统不兼容吧,我们公司的服务器是CentOS 7.2版。然后去FFmpeg官网下载linux的可执行文件放入jar包,替换掉原有的linux可执行文件。我下载的是amd64版,下载地址在此。

搞完之后,终于可以通过网络URL获取视频信息了,而且FFmpeg效率很快。

结语

源码传到git了,下载地址在此,里面包含了上面的改动和最新的linux版的FFmpeg,可以下载后打成jar包放入项目中使用。

java通过视频URL获取视频时长,无需下载视频,修复jave在linux上的bug相关推荐

  1. java获取视频时长_Java获取视频的大小、时长

    前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...

  2. js 获取视频,者音频时长

    js 获取视频,者音频时长 let fileUrl = URL.createObjectURL(file) let audioElement = new Audio(fileUrl) let time ...

  3. html javascript 音频、视频、 mp3 、mp4 的播放、暂停、重新播放、获取音频时长、视频自动全屏播放

    html javascript 音频.视频. mp3 .mp4 的播放.暂停.重新播放.获取音频时长 视频 https://www.bilibili.com/video/BV1WE411o7Ft?fr ...

  4. 【短视频SDK】合成时长和文件大小对比数据---给参数设置提供参考.

    本文之前我们已经有一篇文章针对现在短视频SDK暴露的参数有一个基本解析:----->传送门:对焦模式.裁剪模式.视频质量.分辨率.视频比例.帧率.关键帧间隔等参数解析.做好一个短视频SDK的核心 ...

  5. java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...

    安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...

  6. linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。

    安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...

  7. android根据音乐路径获取音乐时长,采样率等

    android根据音乐路径获取音乐时长,采样率等 git路径为:https://github.com/zhangliangming/HPAudio Gradle 1.root build.gradle ...

  8. python 获取mp3时长(时间长度)

    python 获取mp3时长(时间长度) 第一种方法 import librosa import time def get_mp3_duration(audio_path):""& ...

  9. android获取小程序音频时长,最新微信小程序获取音频时长与实时获取播放进度...

    #微信小程序获取音频时长与实时获取播放进度 在小程序官方文档中 audio 注意:1.6.0 版本开始,该组件不再维护.建议使用能力更强的 wx.createInnerAudioContext 接口 ...

最新文章

  1. c3074 无法使用带圆括号的_助力带分类简介
  2. Struts2框架的学习遇到的问题
  3. python统计并输出文件的行数_python实用统计文件行数 类似wc命令
  4. 计算机故障报告怎么写,计算机这样的诊断报告是否正常
  5. matlab程序和程序文件
  6. 我提出辞职,老板竟然让我做选择题(转)
  7. Linux——进程控制(总结)
  8. “staticMetaObject”: 不是“****”的成员
  9. 人工智能在视频应用领域的探索
  10. java 命令读取参数_如何读取/处理命令行参数?
  11. Android_内存泄露
  12. 国自然和毕业论文的流程图用这个格式导入Word可无限放大
  13. Kubernetes 小白学习笔记(13)--k8s集群路线-init流程
  14. IP地址(Internet Protocol Address),即互联网协议地址
  15. 【辅助开发】游戏辅助开发全流程-golang
  16. 版本管理工具Git记录
  17. 计算机命令提示符的使用,命令提示符(电脑系统命令提示符的打开方法)
  18. linux配置vsftp红帽子,linux红帽子VSFTPD的配置.doc
  19. 输入两个正整数m和n,求其最大公约数及最小公倍数
  20. nox模拟器(安卓5.1)adb连接

热门文章

  1. 经典的十种排序算法 C语言版
  2. Vue过滤器的传参使用及案例
  3. 弘辽科技:拼多多免费流量怎么去做?如何获取?
  4. 达利食品:成于“山寨“,困于“山寨“
  5. 分布式之一行代码解决缓存击穿问题
  6. C17500铍钴铜棒C17500铍钴铜锻件C17500圆饼
  7. 图的搜索算法 BFS
  8. Java去除字符串中的空格以及特殊符号
  9. 高新技术企业上市要达到的条件
  10. 怎么借助Camtasia给电脑游戏录屏