ffmpeg 下载以及安装步骤

进入官方地址
http://ffmpeg.org/

进入下一步

window 下载


linux 下载



看到上面这个图,下载那个版本看你自己选择
完成之后

window安装

配置环境变量

在cmd 输入ffmpeg 显示下图 就完成了

springboot整合使用

举个例子:
200M的视频,因为太大,网络加载很慢,要等很久。
那么像要播放流畅,那就需要流媒体。
因为视频点播 是流媒体,所以要把视频切成流媒体。
使用ffmpeg 把视频切成m3u8和ts

/*import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;*/
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/*import ws.schild.jave.DefaultFFMPEGLocator;
import ws.schild.jave.EncoderException;
import ws.schild.jave.FFMPEGLocator;
import ws.schild.jave.MultimediaObject;*/import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;/***  mp4转换m3u8工具类*/
@Component
public class ConvertM3U8Util {@Value("${m3u8.ffmpegpath}")private String ffmpegpath; // ffmpeg.exe的目录public boolean convertOss(String folderUrl, String fileName) {if (!checkfile(folderUrl + fileName)) {System.out.println("文件不存在!");return false;}//验证文件后缀String suffix = StringUtils.substringAfter(fileName, ".");String fileFullName = StringUtils.substringBefore(fileName, ".");if (!validFileType(suffix)) {return false;}//return  processM3U8(folderUrl,fileName,fileFullName);return processM3U8(folderUrl, fileName, fileFullName, "1280x720", "10");}/*** 验证上传文件后缀** @param type* @return*/private boolean validFileType(String type) {if ("mp4".equals(type)) {return true;}return false;}/*** 验证是否是文件格式** @param path* @return*/private boolean checkfile(String path) {File file = new File(path);if (!file.isFile()) {return false;} else {return true;}}// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)/*** ffmpeg程序转换m3u8** @param folderUrl* @param fileName* @param fileFullName* @return*/private boolean processM3U8(String folderUrl, String fileName, String fileFullName) {//这里就写入执行语句就可以了List commend = new java.util.ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(folderUrl + fileName);commend.add("-c:v");commend.add("libx264");commend.add("-hls_time");commend.add("20");commend.add("-hls_list_size");commend.add("0");commend.add("-c:a");commend.add("aac");commend.add("-strict");commend.add("-2");commend.add("-f");commend.add("hls");commend.add(folderUrl + fileFullName + ".m3u8");try {ProcessBuilder builder = new ProcessBuilder();//javabuilder.command(commend);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** @param folderUrl* @param fileName* @param fileFullName* @param resolution   分辨率* @param time         每个ts时长* @return*/private boolean processM3U8(String folderUrl, String fileName, String fileFullName, String resolution, String time) {//这里就写入执行语句就可以了List commend = new java.util.ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(folderUrl + fileName);commend.add("-profile:v");commend.add("baseline");commend.add("-level");commend.add("3.0");commend.add("-s");commend.add(resolution);commend.add("-start_number");commend.add("0");commend.add("-hls_time");commend.add(time);commend.add("-hls_list_size");commend.add("0");commend.add("-f");commend.add("hls");commend.add(folderUrl + fileFullName + ".m3u8");try {//javaProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}private boolean processM3U8(String ffmpegpath, String folderUrl, String fileName, String fileFullName, String resolution, String time) {//这里就写入执行语句就可以了List commend = new java.util.ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(folderUrl + fileName);commend.add("-profile:v");commend.add("baseline");commend.add("-level");commend.add("3.0");commend.add("-s");commend.add(resolution);commend.add("-start_number");commend.add("0");commend.add("-hls_time");commend.add(time);commend.add("-hls_list_size");commend.add("0");commend.add("-f");commend.add("hls");commend.add(folderUrl + fileFullName + ".m3u8");try {//javaProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 合理压缩视频** @param folderUrl  目录* @param fileName   文件名* @param newfileUrl 新的存放文件地址* @param resolution* @return*/private boolean reasonableCompression(String folderUrl, String fileName, String newfileUrl, String resolution) {//这里就写入执行语句就可以了//ffmpeg -i d:/123.mp4 -s 1280x720 -c:v libx264  -preset veryfast -crf 28 -c:a copy d:/xin8.mp4List commend = new java.util.ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(folderUrl + fileName);commend.add("-s");commend.add(resolution);commend.add("-c:v");commend.add("libx264");commend.add("-preset");commend.add("veryfast");commend.add("-crf");commend.add("28");commend.add("-c:a");commend.add("copy");commend.add(newfileUrl);try {//javaProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}/**** 合理转换m3u8* @param folderUrl* @param fileName* @param fileFullName* @param resolution* @param time* @return*/private boolean reasonableProcessM3U8(String folderUrl, String fileName, String fileFullName, String resolution, String time) {//这里就写入执行语句就可以了//ffmpeg -i d:/123.mp4 -s 1280x720 -c:v libx264  -preset veryfast -crf 28 -c:a copy d:/xin8.mp4List commend = new ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(folderUrl + fileName);commend.add("-preset");commend.add("veryfast");commend.add("-crf");commend.add("28");commend.add("-s");commend.add(resolution);commend.add("-start_number");commend.add("0");commend.add("-hls_time");commend.add(time);commend.add("-hls_list_size");commend.add("0");commend.add("-hls_segment_filename");commend.add(folderUrl + fileFullName + "-%d.ts");commend.add("-f");commend.add("hls");commend.add(folderUrl + fileFullName + ".m3u8");try {//javaProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 合理取时间某一秒画面为图片** @param folderUrl  目录* @param fileName   文件* @param newfileUrl 新文件地址* @param startTime  起始时间 第几秒* @param resolution 图片分辨率尺寸* @return*/private boolean reasonableImage(String folderUrl, String fileName, String newfileUrl, String startTime, String resolution) {//这里就写入执行语句就可以了//ffmpeg -i d:/123.mp4 -s 1280x720 -c:v libx264  -preset veryfast -crf 28 -c:a copy d:/xin8.mp4List<String> cutpic = new ArrayList<String>();cutpic.add(ffmpegpath);cutpic.add("-i");cutpic.add(folderUrl + fileName); // 同上(指定的文件即可以是转换为flv格式之前的文件,也可以是转换的flv文件)cutpic.add("-y");cutpic.add("-f");cutpic.add("image2");cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间cutpic.add(startTime); // 添加起始时间为第2秒cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间cutpic.add("0.001"); // 添加持续时间为1毫秒cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小cutpic.add(resolution); // 添加截取的图片大小为350*240cutpic.add(newfileUrl); // 添加截取的图片的保存路径try {//javaProcessBuilder builder = new ProcessBuilder();builder.command(cutpic);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}private boolean reasonableProcessM3U8(String ffmpegpath,String folderUrl, String fileName, String fileFullName, String resolution, String time) {//这里就写入执行语句就可以了//ffmpeg -i d:/123.mp4 -s 1280x720 -c:v libx264  -preset veryfast -crf 28 -c:a copy d:/xin8.mp4List commend = new ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(folderUrl + fileName);commend.add("-preset");commend.add("veryfast");commend.add("-crf");commend.add("28");commend.add("-s");commend.add(resolution);commend.add("-start_number");commend.add("0");commend.add("-hls_time");commend.add(time);commend.add("-hls_list_size");commend.add("0");commend.add("-hls_segment_filename");commend.add(folderUrl + fileFullName + "-%d.ts");commend.add("-f");commend.add("hls");commend.add(folderUrl + fileFullName + ".m3u8");try {//javaProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();int i = doWaitFor(p);System.out.println("------>" + i);p.destroy();return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 监听ffmpeg运行过程** @param p* @return*/public int doWaitFor(Process p) {InputStream in = null;InputStream err = null;int exitValue = -1; // returned to caller when p is finishedtry {System.out.println("comeing");in = p.getInputStream();err = p.getErrorStream();boolean finished = false; // Set to true when p is finishedwhile (!finished) {try {while (in.available() > 0) {Character c = new Character((char) in.read());System.out.print(c);}while (err.available() > 0) {Character c = new Character((char) err.read());System.out.print(c);}exitValue = p.exitValue();finished = true;} catch (IllegalThreadStateException e) {Thread.currentThread().sleep(500);}}} catch (Exception e) {System.err.println("doWaitFor();: unexpected exception - "+ e.getMessage());} finally {try {if (in != null) {in.close();}} catch (IOException e) {System.out.println(e.getMessage());}if (err != null) {try {err.close();} catch (IOException e) {System.out.println(e.getMessage());}}}return exitValue;}/*** 获取视频文件时长** @param music* @return*//*private String getVideoTime(File music) {System.out.println("~~~~~~~~~~~~~~~~ 开始获取视频时长 ~~~~~~~~~~~~~~~~~");Encoder encoder = new Encoder();try {MultimediaInfo m = encoder.getInfo(music);long ls = m.getDuration();int time = (int) ls / 1000;int ss = time % 60;int mm = time / 60 % 60;int hh = time / 60 / 60 % 24;String result = "";if (ss != 0) {String HH = hh == 0 ? "" : getTime(hh) + ":";result = HH + getTime(mm) + ":" + getTime(ss);}return result;} catch (Exception e) {e.printStackTrace();}return "00:00";}*//*** 把时间转换成字符串** @param time* @return*/private String getTime(int time) {if (time == 0) {return "00";} else {if (time <= 9) {return "0" + time;} else {return time + "";}}}/*** 获取视频大小** @param source* @return*/private Long readVideoSize(File source) {FileChannel fc = null;Long size = 0L;try {@SuppressWarnings("resource")FileInputStream fis = new FileInputStream(source);fc = fis.getChannel();BigDecimal fileSize = new BigDecimal(fc.size());size = Long.parseLong(fileSize.toString());if (size > 0) {size = Long.parseLong(fileSize.toString());}} catch (IOException e) {e.printStackTrace();} finally {if (null != fc) {try {fc.close();} catch (IOException e) {e.printStackTrace();}}}return size;}public static void main(String[] args) {/*ConvertM3U8Util util = new ConvertM3U8Util();boolean b = util.reasonableProcessM3U8("D:/ffmpeg/bin/ffmpeg.exe", "d:/video/", "xin7.mp4", "xin7","1280x720", "10");System.out.println(b);*//*File file = new File("d:/123.mp4");String videoTime = util.getVideoTime(file);Long videoSize = util.readVideoSize(file);System.out.println(videoTime);System.out.println(videoSize);//解析文件MultimediaObject object = new MultimediaObject(file);ws.schild.jave.MultimediaInfo multimediaInfo = object.getInfo();long duration = multimediaInfo.getDuration();System.out.println(duration / 1000);System.out.println(multimediaInfo.getAudio().getBitRate());System.out.println(multimediaInfo.getFormat());Sys*/}
}

注意:

页面代码:

<!DOCTYPE html>
<html lang="en">
<head><link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet"><script src="https://unpkg.com/video.js/dist/video.js"></script><script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
</head>
<body>
<video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto"data-setup='{}'><source type="application/x-mpegURL" src="http://localhost/ud/48214823-466d-4914-a1ef-9e5a3e097303/123.m3u8"><!-- video.js给的示例 --><!--<source src="http://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8" type="application/x-mpegURL">-->
</video>
<script src="//cdn.bootcss.com/video.js/7.0.0-alpha.1/video.min.js"></script>
</body>
</html>

注意:

是你使用ffmpeg 切成m3u8 ,你要指向这个地址。相等于 localhost/ud/123.mp4.

在使用ffmpeg 切片的时候,最终会切成这样子。

ffmpeg下载安装,以及springboot 整合视频点播学习相关推荐

  1. SpringBoot整合Shiro学习(上)

    SpringBoot整合Shiro(上) 基于[编程不良人]2020最新版Shiro教程,整合SpringBoot项目实战教程 哔哩哔哩链接:https://www.bilibili.com/vide ...

  2. 【题目】了解ffmpeg以及FFmpeg下载安装教程

    [时间]2018.09.15 [题目]了解ffmpeg以及FFmpeg下载安装教程 [参考链接]https://blog.csdn.net/yang725614/article/details/796 ...

  3. Swagger的安装以及SpringBoot整合Swagger2实现SwaggerAPI文档测试

    前言 本篇博客是本人在网上学习Swagger所产出的个人笔记.主要内容有: 1.Swagger的安装 2.Swagger的介绍 3.Swagger2中常用的注解 4.快速上手案例 准备工作:Swagg ...

  4. Kafka精品教学(入门,安装,Springboot整合Kafka)

    ps:本文是博主结合视频和博客学习之后,自己实验总结编写的,如果侵权请联系删除. 要学习kafka首先要了解什么是消息队列,因为Kafka 是一个分布式的基于发布 / 订阅模式的消息队列(Messag ...

  5. 10分钟解决Redis安装和Springboot整合

    1.Redis安装 for Windows https://github.com/microsoftarchive/redis/releases 下载完成后双击安装,一直下一步 然后打开Redis安装 ...

  6. datax安装 及 springboot整合 datax

    换了新工作,Java出身的我,弄点大数据的活. datax安装 环境要求 1.jdk1.8 2.python 源码地址:https://github.com/alibaba/DataX 这里我下载的是 ...

  7. ffmpeg下载安装的步骤

    这篇文章主要介绍了在Windows上安装FFmpeg程序的图文方法,需要的朋友可以参考下 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流 ...

  8. kafka 安装使用 /springboot整合kafka /消息投递机制以及存储策略 /副本处理机制

    一.背景 1.基本信息 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流 ...

  9. FFmpeg下载安装教程

    介绍 FFmpeg下载地址 第一步 点击下载 第二步 解压后是这样的 第三步 配置环境变量 第四步 检验是否安装成功 win+r输入cmd打开命令框 输入 ffmpeg –version ,若显示的跟 ...

最新文章

  1. java去除字符串的html标签
  2. 非静态方法可以访问Java中的静态变量/方法吗?
  3. 那些没有兴趣花必要的C++时间
  4. 0-1背包问题详解(DP分支限界回溯三种方法)
  5. 如何选择高速存储、查询数据库
  6. 03MyBatis的事务管理和缓存机制
  7. Linux突然断电后文件丢失的问题
  8. 在pcb放置坐标标注_PCB拼板上的那颗美人痣
  9. JavaScript 高级程序设计(第3版)
  10. 华为vlan简单配置
  11. ios 代理和委托的区别
  12. 在EXCEL中生成服从三角分布随机数的方法
  13. OJDBC驱动版本区别 [ojdbc14.jar,ojdbc5.jar跟ojdbc6.jar的区别]
  14. 计算机图形图像处理专业知识,计算机图形图像处理专业技术的突破研究
  15. 嵌入式linux ASoC架构声卡驱动开发
  16. web 微信与基于node的微信机器人实现
  17. R | RColorBrewer颜色设置
  18. 人事不干人事,这算什么事
  19. excel自动汇总数据怎么做?
  20. oracle 拼接clob,把string拼接成clob类型

热门文章

  1. 小程序 设置小程序打开聊天中的素材
  2. webstorm或phpstorm配置CSS或JS压缩
  3. 模型包装,答辩吹牛方法论!
  4. 你要怎样知足,才会有点幸福
  5. h5 上 删除 交互_iH5高级教程:H5交互进阶,擦一擦效果
  6. 祝朋友生日前程似锦的句子:愿未来锦上添花
  7. 太阳能光伏发电和路灯应用系统的详细计算
  8. OpenCV——图像连通域
  9. 一种获得深度睡眠的方法
  10. win10刚安装linux黑屏,win10 + Ubuntu18.04 双系统,UEFI+GPT,从win10切换到Ubuntu时黑屏问题...