java检验mp4文件完整性的一个方法:使用ffmpeg

news/2024/5/20 21:07:35/文章来源:https://blog.csdn.net/Powerful_Green/article/details/128047717

问题引入

最近笔者在写一个多线程下载视频文件的程序,打算让这个程序在我的空闲服务器上运行,但是几轮测试之后发现,有时候会存在下载的视频文件不完整的情况,这就导致了有些文件无法正常播放

问题排查

经过一周的排查后,排除了多线程下载代码部分的问题,已经确定是对方的资源服务器有时会抽风,导致获取到的数据并不是正确的数据,所以就导致了视频文件中部分内容错误,所以解决方法也很简单,就是在文件下载完成后,对文件完整性进行检验,如果文件无法正常播放就重新下载

mp4完整性检验

笔者在网上找了很久的方法,最终找到最有效的方法就是使用ffmpeg这个工具来帮助我们完成视频完整性的检验
参考这篇文章,使用指令
ffmpeg -i your_file.mp4 -v error -map 0:1 -f null -
如果有输出,就说明文件有错误,否则文件就是完整的

安装ffmpeg

首先需要在服务器上安装ffmpeg
在 https://johnvansickle.com/ffmpeg/ 链接中找到linux版本的ffmpeg编译完成的包
使用wget下载到服务器上
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
再通过tar命令解压
tar -xvf ffmpeg-release-amd64-static.tar.xz
把文件复制到/opt目录下
mv ffmpeg-release-amd64-static /opt/
最后添加PATH环境变量,用vim打开/etc/profile,添加如下内容
export PATH=$PATH:/opt/ffmpeg-5.1.1-amd64-static/
再在控制台中执行一次这条指令,使得PATH环境变量的更改立刻生效
最后测试一下,输入
ffmpeg
有输出
在这里插入图片描述
说明安装成功

java实现

java实现就是简单的使用Runtime来执行linux指令即可
但要注意,有一个坑,就是当文件路径有空格时,就只能使用String数组的方式来调用Runtime的exec
这里为了普适性,就采用String数组的方式来调用exec
具体代码如下

public static boolean checkMP4L2(String filePath){String[] cmd={"ffmpeg","-v","error","-i",filePath,"-map","0:1","-f","null","-"};//下面注释了的这一行,在绝对路径中包含空格时会导致检测失败,会提示文件不存在
//        String command="ffmpeg -v error -i "+filePath.replaceAll(" ","\" \"")+" -map 0:1 -f null -";try {Process process=Runtime.getRuntime().exec(cmd);InputStream is=process.getErrorStream();BufferedReader br=new BufferedReader(new InputStreamReader(is));String line=br.readLine();if(line==null)return true;log.trace("L2 check error message "+line+"  (for "+filePath+")");return false;}catch (Exception e){log.error("Failed to do l2 check for "+filePath,e);return false;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_37175.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了

由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。 时间片 多任务…

Java23种设计模式之第三弹-工厂模式

说起工厂,我们第一反应是制作什么东西的吧~。在现实生活中,工厂 , 就是用于生成一些特定事物的厂商。 回到我们此处说的工厂模式上,什么是工厂模式呢 , 顾名思义,就是生成我们的对象的类就会称成为工厂。 …

关于BigInteger和BigDecimal

BigInteger BigInteger类是用于解决整形类型(含基本数据类型及对应的包装类,)无法表示特别大的数字及运算的问题,即使是占用字节数最多的整形long,能表示的范围也是有限的.理论上,你可以使用BigInteger表示任意整数基于java8中BigInteger的构造方法. BigDecimal的构造方法2 …

[附源码]计算机毕业设计JAVA汽车租赁系统

[附源码]计算机毕业设计JAVA汽车租赁系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis M…

傻白入门芯片设计,芯片键合(Die Bonding)(四)

一、键合( Bonding) 作为半导体制造的后工序,封装工艺包含背面研磨(Back Grinding)、划片(Dicing)、芯片键合(Die Bonding)、引线键合(Wire Bonding)及成型(Molding)等步骤。这些工艺的顺序可根据封装技术的变化进行调整、相互结合或合并。芯片键合(die bonding)工…

Linux之分区【详细总结】

目录分区介绍分区查看指令lsblk ![请添加图片描述](https://img-blog.csdnimg.cn/d7ea5468d719433ea6ee4ab0eb145770.png)lsblk -f挂载案例分五部分组成 虚拟机添加硬盘 分区 格式化 挂载 设置自动挂载虚拟机增加硬盘查看整个系统磁盘情况查询查看整个目录磁盘占用情况磁盘情况…

cpu设计和实现(协处理器hi和lo)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多同学可能不了解mips处理器,如果个人想补充一点mips cpu的知识,可以找些书籍资料来读一下,比如《See Mips R…

Gradle学习笔记之第一个Gradle项目

文章目录前言创建gradle项目gradle目录结构gradle常用命令修改maven仓库地址启用init.gradle的方法关于gradle仓库gradle包装器前言 Gradle是Android构建的基本工具,因此作为Android研发,有必要系统地学一学Gradle,环境windows就可以。 创建…

微服务介绍微服务环境搭建

一、微服务介绍 从互联网早起到现在,系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构--->微服务架构,当然还有悄然兴起的Service Mesh(服务网格化)。 微服务架构 微服务架构在某种程度上是面向…

使用 Next.js 搭建 Monorepo 组件库文档

文章为稀土掘金技术社区首发签约文章,14 天内禁止转载,14 天后未获授权禁止转载,侵权必究! 阅读本文你将: 使用 pnpm 搭建一个 Monorepo 组件库使用 Next.js 开发一个组件库文档changesets 来管理包的 version 和生成…

java 同步锁synchronized 解决线程共享数据重复操作问题

我们先来写一个买票程序 我们先创建一个包 在包下创建两个类 customException 线程类 负责编写抢票的主要逻辑 参考代码如下 public class customException implements Runnable {private int tickets 100;public void run () {while (tickets > 0){if(tickets > 0) {…

学生个人博客网页设计作品 学生个人网页模板 个人网页制作 HTML学生个人网站作业设计

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

vue js实现文件上传压缩优化处理

vue js实现文件上传压缩优化处理 两种方法 : 第1种是借助canvas的封装的文件压缩上传第2种(扩展方法)使用compressorjs第三方插件实现 目录 vue js实现文件上传压缩优化处理 借助canvas的封装的文件压缩上传 1.新建imgUpload.js 2.全局引…

大屏图表,ECharts 从“熟练”到入门

📖阅读本文,你将 了解 配置驱动 的思想理解 Echarts 基本概念了解 graphic 和 动画基本玩法。了解 Echarts 基底组件的封装的思路 一、不是标题党!Echarts,简历上人均 “熟练”? 公司最近在招外包,而因为…

一文带你深入理解【Java基础】· 枚举类

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

什么,程序员被绑架写博客?抱歉,我是自愿的

大家好,我是校长。昨天晚上刷知乎的时候,看到这么一个问题,都让我有点怀旧了,你看,年纪大了之后,人确实容易怀旧。什么问题呢?就是这个:为什么很多程序员(也可能不是&…

bug探索之路:List<Map>get取出元素却是String?

一、bug初现峥嵘 有一说一我定义的List<Map>对吧&#xff0c;我get(0)取出的元素也应该是Map类型没问题吧。不行&#xff0c;编译器告诉我&#xff0c;java.lang.String cannot be cast to java.util.Map。 这个意思就是说&#xff0c;你这个就是String类型&#xff0c;…

挂耳式蓝牙耳机性价比推荐,盘点五款性能高的耳机分享

众所周知&#xff0c;骨传导耳机之所以能够受到人们的喜欢&#xff0c;是因为其佩戴不需入耳&#xff0c;尤其是针对于运动爱好者来说&#xff0c;在户外运动的时候不但可以听见音乐&#xff0c;还可以听见外界的声音&#xff0c;进一步的将危险系数拉低&#xff0c;其次也是因…

为啥这么人选择iPhone

01.听音乐&#xff08;10元/月&#xff09; 歌曲很全 多个终端支持 果子自带的Music app 在那个设备都可以使用&#xff0c; 包括MacBook Pro,iPhone&#xff0c;iPad&#xff0c;iwatch等 02.周边配件方便购买 03.遇到问题好解决 04.使用稳定&#xff0c;不会有广告&#x…

[Redis]-四种部署方式

森格 | 2022年11月 本文是对Redis部署方式的学习&#xff0c;主要学习基本原理&#xff0c;以及几种方式的优缺点。 一、部署方式概况 对于Redis的安装部署主要可以分为单机版、主从同步、Sentinel哨兵、Cluster集群部署四种方式&#xff0c;下面一起看下几种方式的优缺点。 二…