使用FFmpeg进行视频解析上传视频数据

package com.greathiit.videoupload.ffmpeg;import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class VideoFFmpeg {public static void main(String[] args) {String path="E:\\视频批量上传项目\\视频";String timeLength = getVideoTime("E:\\视频批量上传项目\\视频\\aa.mp4","D:\\learn\\FFmpeg\\ffmpeg-N-102841-g041267b558-win64-lgpl-shared\\bin\\ffmpeg.exe");if(timeLength.length()>0){//字符串截取timeLength =timeLength.substring(0,timeLength.indexOf("."));}System.out.println("视频时长:"+timeLength);traverseFolder1(path);}/***获取视频时间* @param video_path  视频路径* @param ffmpeg_path ffmpeg安装路径* @return*/public static String getVideoTime(String video_path, String ffmpeg_path) {List<String> commands = new java.util.ArrayList<String>();commands.add(ffmpeg_path);commands.add("-i");commands.add(video_path);System.out.println("命令行:"+ffmpeg_path+" -i "+video_path);try {ProcessBuilder builder = new ProcessBuilder();builder.command(commands);final Process p = builder.start();//从输入流中读取视频信息BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));StringBuffer sb = new StringBuffer();String line = "";while ((line = br.readLine()) != null) {sb.append(line);}br.close();//从视频信息中解析时长String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";Pattern pattern = Pattern.compile(regexDuration);Matcher m = pattern.matcher(sb.toString());if (m.find()) {System.out.println(video_path+",视频时长:"+m.group(1)+", 开始时间:"+m.group(2)+",比特率:"+m.group(3)+"kb/s");return m.group(1);}} catch (Exception e) {e.printStackTrace();}return "";}public static void traverseFolder1(String path) {int fileNum = 0, folderNum = 0;File file = new File(path);if (file.exists()) {LinkedList<File> list = new LinkedList<File>();File[] files = file.listFiles();for (File file2 : files) {if (file2.isDirectory()) {System.out.println("文件夹:" + file2.getAbsolutePath());list.add(file2);folderNum++;} else {System.out.println("文件:" + file2.getAbsolutePath());fileNum++;}}File temp_file;while (!list.isEmpty()) {temp_file = list.removeFirst();files = temp_file.listFiles();for (File file2 : files) {if (file2.isDirectory()) {System.out.println("文件夹:" + file2.getAbsolutePath());list.add(file2);folderNum++;} else {System.out.println("文件:" + file2.getAbsolutePath());fileNum++;}}}} else {System.out.println("文件不存在!");}System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);}}

使用ffmpeg来获取文件的时长

https://www.cnblogs.com/firstdream/p/7676732.html : 遍历文件夹中的目录和文件

https://www.jb51.net/article/122711.htm :文件名称修改

遇到问题: 在视频修改的时候由于遍历文件目录和文件名称的时候A层目录修改了到遍历A下一层目录或者文件的时候由于保存在List集合中的绝对路径并没有发生变化就会出现文件找不到的问题。例如:

第一次修改的目录:F:\BaiduNetdiskDownload\mksz355 - 编程必备基础 计算机组成原理+操作系统+计算机网络(更多IT教程 微信352852792)==》F:\BaiduNetdiskDownload\mksz355 - 编程必备基础 计算机组成原理+操作系统+计算机网络

第遍历下一层目录:F:\BaiduNetdiskDownload\mksz355 - 编程必备基础 计算机组成原理+操作系统+计算机网络**(更多IT教程 微信352852792)**\第1章 编程必备基础:计算机组成原理、操作系统、计算机网络(更多IT教程 微信352852792) 此时加黑部分文字已经被第一次修改这时如果执行文件修改就会出现文件找不到的异常

解决办法: 使用回调函数当第一次进行修改后跳出循环重新遍历保存到List集合中如果上一次没有做修改则继续循环

具体逻辑代码如下:

package com.greathiit.videoupload.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.greathiit.videoupload.entity.Course;
import com.greathiit.videoupload.entity.Lesson;
import com.greathiit.videoupload.entity.Section;
import com.greathiit.videoupload.mapper.CourseMapper;
import com.greathiit.videoupload.service.ICourseService;
import com.greathiit.videoupload.service.ILessonService;
import com.greathiit.videoupload.service.ISectionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** <p>*  服务实现类* </p>** @author wtong* @since 2022-04-13*/
@Service
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements ICourseService {private   String NO="no";@Autowiredprivate ILessonService lessonService;@Autowiredprivate ISectionService statisticsService;@Overridepublic void saveCourse(String path) {//            String timeLength = getVideoTime("E:\\视频批量上传项目\\视频\\aa.mp4","D:\\learn\\FFmpeg\\ffmpeg-N-102841-g041267b558-win64-lgpl-shared\\bin\\ffmpeg.exe");
//            if(timeLength.length()>0){//字符串截取
//                timeLength =timeLength.substring(0,timeLength.indexOf("."));
//            }
//            System.out.println("视频时长:"+timeLength);traverseFolder1(path);}private  void dataEntry(List<String> stringList) {//        System.out.println(stringList.get(4));System.out.println(stringList);Course course = new Course();course.setTitle(stringList.get(0));course.setDescription("<p>"+stringList.get(0)+"<br>></p>");course.setLanguage("chinese");course.setCategoryId(4);course.setSubCategoryId(3);course.setSection("[]");course.setRequirements("[]");course.setLevel("beginner");course.setUserId(85);course.setDateAdded(1623999600);course.setIsAdmin(0);course.setStatus("active");course.setMetaKeywords(stringList.get(0));course.setIsFreeCourse(1);
//        //保存章节QueryWrapper<Course> queryWrapper=new QueryWrapper<>();queryWrapper.lambda().eq(Course::getTitle,course.getTitle());
//        this.saveOrUpdate(course,queryWrapper);Section section=new Section();section.setTitle(stringList.get(1));section.setCourseId(417);try {section.setOrder(Integer.parseInt(section.getTitle().substring(1,3)));}catch (NumberFormatException e){section.setOrder(Integer.parseInt(section.getTitle().substring(1,2)));}QueryWrapper<Section> sectionQueryWrapper=new QueryWrapper<>();sectionQueryWrapper.lambda().eq(Section::getTitle,section.getTitle());
//        statisticsService.saveOrUpdate(section,sectionQueryWrapper);Lesson lesson = new Lesson();lesson.setTitle(stringList.get(2));lesson.setDuration(stringList.get(3));lesson.setVideoUrl(stringList.get(6).replace("F:\\BaiduNetdiskDownload",""));lesson.setVideoUrlForMobileApplication(stringList.get(6).replace("F:\\BaiduNetdiskDownload",""));Long dateAdded = System.currentTimeMillis();
//        String s = dateAdded.toString();
//        Integer sp = Integer.parseInt(s);
//        lesson.setDateAdded(sp);lesson.setLessonType("video");lesson.setAttachmentType("url");try {lesson.setOrder(Integer.parseInt(lesson.getTitle().substring(2,4)));}catch (NumberFormatException e){lesson.setOrder(Integer.parseInt(lesson.getTitle().substring(2,3)));}lesson.setVideoType("Vimeo");lesson.setVideoTypeForMobileApplication("html5");Course one = this.getOne(queryWrapper);lesson.setCourseId(one.getId());Section one1 = statisticsService.getOne(sectionQueryWrapper);lesson.setSectionId(one1.getId());lesson.setVideoTypeForMobileApplication(stringList.get(6).replace("F:\\BaiduNetdiskDownload",""));QueryWrapper<Lesson> queryWrapperlqueryWrap=new QueryWrapper<>();queryWrapperlqueryWrap.lambda().eq(Lesson::getTitle,lesson.getTitle());lessonService.saveOrUpdate(lesson,queryWrapperlqueryWrap);System.out.println(lesson.toString());}//    public static void main(String[] args) {//        String path="F:\\BaiduNetdiskDownload\\mksz355 - 编程必备基础 计算机组成原理+操作系统+计算机网络";
            String timeLength = getVideoTime("E:\\视频批量上传项目\\视频\\aa.mp4","D:\\learn\\FFmpeg\\ffmpeg-N-102841-g041267b558-win64-lgpl-shared\\bin\\ffmpeg.exe");
            if(timeLength.length()>0){//字符串截取
                timeLength =timeLength.substring(0,timeLength.indexOf("."));
            }
            System.out.println("视频时长:"+timeLength);
//        traverseFolder1(path);
//
//
//    }/***获取视频时间* @param video_path  视频路径* @param ffmpeg_path ffmpeg安装路径* @return*/public  String getVideoTime(String video_path, String ffmpeg_path) {//将命令行拼接到list集合中List<String> commands = new java.util.ArrayList<String>();commands.add(ffmpeg_path);commands.add("-i");commands.add(video_path);
//            System.out.println("命令行:"+ffmpeg_path+" -i "+video_path);try {ProcessBuilder builder = new ProcessBuilder();builder.command(commands);final Process p = builder.start();//从输入流中读取视频信息BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));StringBuffer sb = new StringBuffer();String line = "";while ((line = br.readLine()) != null) {sb.append(line);}br.close();//从视频信息中解析时长String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";Pattern pattern = Pattern.compile(regexDuration);Matcher m = pattern.matcher(sb.toString());if (m.find()) {List<String > re=replace(video_path);
//                    System.out.println(re.toString());System.out.println(video_path+",视频时长:"+m.group(1)+", 开始时间:"+m.group(2)+",比特率:"+m.group(3)+"kb/s" );re.add(m.group(1));re.add(m.group(2));re.add(m.group(3));re.add(video_path);dataEntry(re);return m.group(1);}} catch (Exception e) {e.printStackTrace();}return "";}/*** 字符串分割* @param video_path 需要分割的绝对路径* @return 返回分割好的数据列表*/private  List<String> replace(String video_path) {String replace = video_path.replace("F:\\BaiduNetdiskDownload\\mksz355 - ", "");Character a=92;String am=a.toString();System.out.println(replace);System.out.println("");String[] split1 = replace.split("\\\\");int ac=split1.length;System.out.println(ac);String course = split1[0];//课程名称String chapter = split1[1];//章节String blues = split1[2];String[] split2 = blues.split("\\.");blues = split2[0]; //集数List<String> list=new ArrayList<>();list.add(course);list.add(chapter);list.add(blues);return list;}public  void traverseFolder1(String path) {int fileNum = 0, folderNum = 0;File file = new File(path);LinkedList<File> rnameList = new LinkedList<>();if (file.exists()) {LinkedList<File> list = new LinkedList<File>();File[] files = file.listFiles();for (File file2 : files) {if (file2.isDirectory()) {//                    System.out.println("文件夹:" + file2.getAbsolutePath());list.add(file2);rnameList.add(file2);folderNum++;} else {//                    System.out.println("文件1:" + file2.getAbsolutePath());rnameList.add(file2);fileNum++;}}File temp_file;while (!list.isEmpty()) {temp_file = list.removeFirst();files = temp_file.listFiles();for (File file2 : files) {rnameList.add(file2);if (file2.isDirectory()) {//                        System.out.println("文件夹:" + file2.getAbsolutePath());list.add(file2);folderNum++;} else {//                        System.out.println("文件2:" + file2.getAbsolutePath());fileNum++;}}}} else {System.out.println("文件不存在!");}System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);int msize = 0;for (File file1 : rnameList) {String absolutePath = file1.getAbsolutePath();String timeLength = getVideoTime(absolutePath,"D:\\learn\\FFmpeg\\ffmpeg-N-102841-g041267b558-win64-lgpl-shared\\bin\\ffmpeg.exe");if(timeLength.length()>0){//字符串截取timeLength =timeLength.substring(0,timeLength.indexOf("."));}
//            System.out.println("视频时长:"+timeLength+"path"+absolutePath);
//            String result = rName(file1);
//            if(!result.equals(NO)){//                traverseFolder1( path);
//                break;
//
//            }msize++;}}private  String rName(File file2) {String absolutePath = file2.getAbsolutePath();String[] split = absolutePath.split(File.pathSeparator);String s = split[split.length - 1];String replace = s.replace("(更多IT教程 微信352852792)", "");if(s.equals(replace)){return NO;}File file1 = new File(replace);if(file2.renameTo(file1)){System.out.println("修改成功");}else {System.out.println("修改失败");}return replace;}
}

数据录入成功后的效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eE1EckoD-1650615602204)(C:\Users\29701\AppData\Roaming\Typora\typora-user-images\1649984062864.png)]

最后还有一个就是前期构建项目的时候遇到的小问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qadBEruP-1650615602206)(C:\Users\29701\AppData\Roaming\Typora\typora-user-images\1649984159309.png)]

mapper路径和上边的mapper路径冲突,spring容器前期构建的时候找不到mapper包下的bean解决办法修改为maqqer

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1d20n1P-1650615602206)(C:\Users\29701\AppData\Roaming\Typora\typora-user-images\1649984317865.png)]

lace);
if(file2.renameTo(file1)){
System.out.println(“修改成功”);
}else {
System.out.println(“修改失败”);
}
return replace;
}
}


数据录入成功后的效果[外链图片转存中...(img-eE1EckoD-1650615602204)]最后还有一个就是前期构建项目的时候遇到的小问题:[外链图片转存中...(img-qadBEruP-1650615602206)]mapper路径和上边的mapper路径冲突,spring容器前期构建的时候找不到mapper包下的bean解决办法修改为maqqer[外链图片转存中...(img-i1d20n1P-1650615602206)]mysql关键字加``解决进行视频批量处理因为视频缺少h264加入h264生成新的文件后缀多.mp4

function recursive_list_dir(){
for file_or_dir in ls $1
do
if [ -d 1"/"1"/"1"/"file_or_dir ]
then
recursive_list_dir 1"/"1"/"1"/"file_or_dir
else
file=1"/"1"/"1"/"file_or_dir

            if  [ "${file##*.}" = "mp4" ]thenaa="${file##*/}"if   [ "${aa##*.}" = "mp4.mp4" ]thenecho "ii"elsedocker run -it --name app_ffmpeg  -v $PWD:/tmp/workdir  jrottenberg/ffmpeg -i ${file:3} -vcodec h264 ${file:3}.mp4docker rm -f app_ffmpegfififi
done

}
recursive_list_dir $1

java使用ffmpeg进行视频处理相关推荐

  1. ffmpeg入门及java操作ffmpeg对视频进行处理

    一.ffmpeg 1.简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非 ...

  2. Java通过FFMPEG获取视频时长

    2019独角兽企业重金招聘Python工程师标准>>> Java通过FFMPEG获取视频时长 详见https://www.yz1618.cn/view/19 转载于:https:// ...

  3. mysql+视频文件转成流_详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:W ...

  4. Java调用ffmpeg进行视频.H264抽帧,并保存为图片

    Java调用ffmpeg进行视频.H264抽帧,并保存为图片 1. 需求 2. 解决 3. 源码 参考 1. 需求 对视频 D:\data\01-test.H264进行抽帧并保存为图片,图片命名为1. ...

  5. Java使用FFmpeg处理视频文件指南

    https://www.cnblogs.com/Dreamer-1/p/10394011.html Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文 ...

  6. Java使用FFmpeg处理视频文件的方法教程

    这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...

  7. Java+Windows+ffmpeg实现视频转换

    旧文,源地址见这里. 最近由于项目需要,研究了一下如何用Java实现视频转换,"着实"废了点心思,整理整理,写出给自己备忘下. 思路 由于之前没有没法过相关功能的经验,一开始来真不 ...

  8. Java操作ffmpeg为视频添加音乐

    最近学习仿抖音微信小程序遇到一个坑,视频中使用以下语句为视频添加背景音乐 ffmpeg.exe -i input.mp4 -i 音乐.mp3 -t 7 -y 新视频.mp4 发现并不管用. 自己将其改 ...

  9. Java调用FFmpeg实现视频录制

    FFmpeg是一个很好用的开源的视频处理工具,网上也有一些java调用FFmpeg的方法,然而这些文章大部分都有一个共同的特点,就是用java去调用FFmpeg去做视频处理,几乎没有去做录制视频和音频 ...

  10. java操作ffmpeg为视频添加背景音乐

    最近学习仿抖音微信小程序遇到一个坑,视频中使用以下语句为视频添加背景音乐 ffmpeg.exe -i input.mp4 -i 音乐.mp3 -t 7 -y 新视频.mp4 ,然而我怎么尝试都不行,上 ...

最新文章

  1. IDEA 快捷键 (长期更新)
  2. javascript简单应用
  3. 青龙羊毛——内容改版
  4. 麻烦的.text字段
  5. VTK:PolyData之PointLocatorVisualization
  6. 【mybatis】插入操作更新id
  7. 主创仅2人,题材是大型3D战争,这款游戏竟然“超逼真”?
  8. Java命令行界面(第7部分):JCommander
  9. 《你的灯亮着吗》 读书笔记三
  10. 共享代码库,为何总被程序员弃用?
  11. 【转载】美国煤层气发展史
  12. 已知 XYZ+YZZ=532,其中,X、Y、Z 为数字,编程求出 X、Y 和 Z 的值
  13. Handing Incomplete Heterogeneous Data using VAEs
  14. 数据安全--3--数据安全5A之授权
  15. sql网上书店项目的实现
  16. oracle查看表空间物理路径,oracle查看表空间物理文件的名称,路径及大小
  17. Python 用turtle库画八卦
  18. PyTorch - GAN与WGAN及其实战
  19. ROS noetic rosrun tf view_frames 报错
  20. 万里汇WorldFirst个人和企业帐户注册教程(送$25+1%提现费)

热门文章

  1. android studio报错:ClassLoader referenced unknown path: /data/app/xxxx-1/lib/arm64
  2. ST 电机库 电机位置环7天冲刺开发
  3. Java学完哪些内容能够出去找工作
  4. 在Java中基于mysql驱动包连接MySQL数据库
  5. python中调用R语言包
  6. 机器学习PCA——实验报告
  7. LED流水灯部分代码
  8. JavaWeb——新闻管理系统(Jsp+Servlet)
  9. 串口通信USART的波特率误差计算GD32、STM32
  10. java2实用教程第五版耿祥义电子版_Java2实用教程(第5版)答案_耿祥义