详解java调用ffmpeg转换视频格式为flv

注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面

这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv,格式!经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能!

格式转换主要原理就是先用java调用ffmpeg的exe文件!

但是有些格式是ffmpeg不能处理的比如rmvb,这样的可以先调用mencoder先把格式转换为avi再进行转换为flv!

我主要写3个类:分别为Conver.java

ConverBegin.Java  ConverVideo.java

Conver.java   代码如下:

package org.Conver;

import java.awt.BorderLayout;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

@SuppressWarnings("serial")

public class Conver extends JFrame{

public static JTextArea OutShowLog;

public Conver() {

setTitle("FLV转换");

setSize(500, 400);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

OutShowLog = new JTextArea();

JScrollPane OutPane = newJScrollPane(OutShowLog);

add(OutPane,BorderLayout.CENTER);

setVisible(true);

}

public static void main(String args[]) {

new Conver();

ConverBegin cb = new ConverBegin();

cb.start();

}

}

ConverBegin.java  代码如下:

package org.Conver;

import java.io.File;

public class ConverBegin extends Thread{

String[] ff;

public void run(){

while (true) {

String folderpath ="other/";

//String path = null;

File f = newFile(folderpath);

if (f.isDirectory()) {

ff = f.list();

int i =0;

while (i< ff.length) {

new ConverVideo(folderpath+ff[i]).beginConver();

i++;

}

Conver.OutShowLog.append("---------------总共转换了"+ff.length+"-----------视频------------");

ff =null;

}

f = null;

try {

Thread.sleep(10000);

} catch (InterruptedExceptione) {

//如果失败重启线程

this.start();

}

}

}

}

ConverBegin.java 代码如下

package org.Conver;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.util.Date;

import java.util.List;

public class ConverVideo {

private Date dt;

private long begintime;

private String PATH;

private String filerealname; // 文件名 不包括扩展名

private Stringfilename; // 包括扩展名

private String videofolder = "other/"; //别的格式视频的目录

private String flvfolder ="flv/"; //flv视频的目录

privateStringffmpegpath="ffmpeg/ffmpeg.exe"; //ffmpeg.exe的目录

privateStringmencoderpath="ffmpeg/mencoder"; //mencoder的目录

privateStringvideoRealPath="flv/"; //截图的视频目录;

privateString imageRealPath ="img/"; //截图的存放目录

//privateString batrealpath="ffmpeg/ffmpeg.bat"; //bat目录

publicConverVideo(){}

public ConverVideo(String path) {

PATH = path;

}

publicString getPATH() {

return PATH;

}

public void setPATH(String path) {

PATH = path;

}

public boolean beginConver(){

File fi = new File(PATH);

filename = fi.getName();

filerealname = filename.substring(0,filename.lastIndexOf("."))

.toLowerCase();

Conver.OutShowLog.append("----接收到文件("+PATH+")需要转换--------------------------");

if (!checkfile(PATH)) {

Conver.OutShowLog.append(PATH+ "文件不存在"+" ");

return false;

}

dt = new Date();

begintime = dt.getTime();

Conver.OutShowLog.append("----开始转文件("+PATH+")--------------------------");

if (process()) {

Date dt2 = new Date();

Conver.OutShowLog.append("转换成功");

long endtime =dt2.getTime();

long timecha = (endtime -begintime);

String totaltime =sumTime(timecha);

Conver.OutShowLog.append("共用了:" + totaltime+" ");

if(processImg()) {

Conver.OutShowLog.append("截图成功了 ");

}else {

Conver.OutShowLog.append("截图不成功了 ");

}

PATH = null;

return true;

}else {

PATH = null;

return false;

}

}

public boolean processImg() {

// System.out.println(newfilename + "->" +newimg);

List commend = new java.util.ArrayList();

commend.add(ffmpegpath);

commend.add("-i");

commend.add(videoRealPath+filerealname+".flv");

commend.add("-y");

commend.add("-f");

commend.add("image2");

commend.add("-ss");

commend.add("38");

commend.add("-t");

commend.add("0.001");

commend.add("-s");

commend.add("320x240");

commend.add(imageRealPath+filerealname+".jpg");

try {

ProcessBuilder builder = new ProcessBuilder();

builder.command(commend);

builder.start();

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

private boolean process() {

int type = checkContentType();

boolean status = false;

if (type == 0) {

// status =processFLV(PATH);// 直接将文件转为flv文件

status =processFLV(PATH);

} else if (type == 1) {

String avifilepath =processAVI(type);

if (avifilepath == null)

returnfalse;

// avi文件没有得到

else {

System.out.println("kaishizhuang");

status =processFLV(avifilepath);// 将avi转为flv

}

}

return status;

}

private int checkContentType() {

String type =PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())

.toLowerCase();

//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

if (type.equals("avi")) {

return 0;

} else if (type.equals("mpg")) {

return 0;

} else if (type.equals("wmv")) {

return 0;

} else if (type.equals("3gp")) {

return 0;

} else if (type.equals("mov")) {

return 0;

} else if (type.equals("mp4")) {

return 0;

} else if (type.equals("asf")) {

return 0;

} else if (type.equals("asx")) {

return 0;

} else if (type.equals("flv")) {

return 0;

}

// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),

// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.

else if (type.equals("wmv9")) {

return 1;

} else if (type.equals("rm")) {

return 1;

} else if (type.equals("rmvb")) {

return 1;

}

return 9;

}

private boolean checkfile(String path) {

File file = new File(path);

if (!file.isFile()) {

return false;

}else {

return true;

}

}

// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.

private String processAVI(int type) {

List commend = new java.util.ArrayList();

commend.add(mencoderpath);

commend.add(PATH);

commend.add("-oac");

commend.add("mp3lame");

commend.add("-lameopts");

commend.add("preset=64");

commend.add("-ovc");

commend.add("xvid");

commend.add("-xvidencopts");

commend.add("bitrate=600");

commend.add("-of");

commend.add("avi");

commend.add("-o");

commend.add(videofolder + filerealname +".avi");

// 命令类型:mencoder 1.rmvb -oac mp3lame -lameoptspreset=64 -ovc xvid

// -xvidencopts bitrate=600 -of avi -ormvb.avi

try {

ProcessBuilder builder = newProcessBuilder();

builder.command(commend);

Process p =builder.start();

doWaitFor(p);

return videofolder +filerealname + ".avi";

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

private boolean processFLV(String oldfilepath) {

if (!checkfile(PATH)) {

System.out.println(oldfilepath+ " is not file");

return false;

}

List commend = new java.util.ArrayList();

commend.add(ffmpegpath);

commend.add("-i");

commend.add(oldfilepath);

commend.add("-ab");

commend.add("64");

commend.add("-acodec");

commend.add("mp3");

commend.add("-ac");

commend.add("2");

commend.add("-ar");

commend.add("22050");

commend.add("-b");

commend.add("230");

commend.add("-r");

commend.add("24");

commend.add("-y");

commend.add(flvfolder + filerealname +".flv");

try {

ProcessBuilder builder = newProcessBuilder();

String cmd =commend.toString();

builder.command(commend);

//builder.redirectErrorStream(true);

Process p =builder.start();

doWaitFor(p);

p.destroy();

deleteFile(oldfilepath);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

public int doWaitFor(Process p)

{

InputStream in = null;

InputStream err=null;

int exitValue = -1; // returned to caller when pis finished

try {

System.out.println("comeing");

in = p.getInputStream();

err =p.getErrorStream();

boolean finished = false; //Set to true when p is finished

while (!finished) {

try {

while (in.available() > 0) {

// Print the output of our system call

Character c = new Character((char) in.read());

System.out.print(c);

}

while (err.available() > 0) {

// Print the output of our system call

Character c = new Character((char) err.read());

System.out.print(c);

}

// Ask the process for its exitValue. If the process

// is not finished, an IllegalThreadStateException

// is thrown. If it is finished, we fall through and

// the variable finished is set to true.

exitValue = p.exitValue();

finished = true;

} catch(IllegalThreadStateException e) {

// Process is not finished yet;

// Sleep a little to save on CPU cycles

Thread.currentThread().sleep(500);

}

}

} catch (Exception e) {

// unexpected exception! printit out for debugging...

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 completion status to caller

return exitValue;

}

public void deleteFile(String filepath) {

File file = new File(filepath);

if (PATH.equals(filepath)) {

if (file.delete()) {

System.out.println("文件" + filepath + "已删除");

}

} else {

if (file.delete()) {

System.out.println("文件" + filepath + "已删除 ");

}

File filedelete2 = newFile(PATH);

if (filedelete2.delete()){

System.out.println("文件" + PATH + "已删除");

}

}

}

public String sumTime(long ms) {

int ss = 1000;

long mi = ss * 60;

long hh = mi * 60;

long dd = hh * 24;

long day = ms / dd;

long hour = (ms - day * dd) / hh;

long minute = (ms - day * dd - hour * hh) /mi;

long second = (ms - day * dd - hour * hh -minute * mi) / ss;

long milliSecond = ms - day * dd - hour * hh -minute * mi - second

* ss;

String strDay = day < 10 ? "0" +day + "天" : "" + day + "天";

String strHour = hour < 10 ? "0"+ hour + "小时" : "" + hour + "小时";

String strMinute = minute < 10 ?"0" + minute + "分" : "" + minute + "分";

String strSecond = second < 10 ?"0" + second + "秒" : "" + second + "秒";

String strMilliSecond = milliSecond< 10 ? "0" + milliSecond : ""

+milliSecond;

strMilliSecond = milliSecond <100 ? "0" + strMilliSecond + "毫秒" : ""

+strMilliSecond + " 毫秒";

return strDay + " " + strHour + ":" + strMinute+ ":" + strSecond + " "

+strMilliSecond;

}

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

mysql+视频文件转成流_详解java调用ffmpeg转换视频格式为flv相关推荐

  1. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  2. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  3. mysql+视频文件转成流_视频文件自动转rtsp流

    最近碰到一个项目需要用到 rtsp 视频流做测试, 由于真实环境的 摄像头 并不能满足需求,故尝试了一下用本地视频文件转换成rtsp视频流做测试,记录一下~ 采用方案: Docker + EasyDa ...

  4. string转成对象_详解Java I/O流(五),对象序列化

    对象序列化 什么是序列化和反序列化呢? 序列化就是将对象转成字节序列的过程,反序列化就是将字节序列重组成对象的过程. 在这里插入图片描述 为什么要有对象序列化机制 程序中的对象,其实是存在有内存中,当 ...

  5. java flv转mp3_Java调用ffmpeg转换视频格式为flv的示例详解

    这篇文章主要介绍了 详解java调用ffmpeg转换视频格式为flv的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下 详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在L ...

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

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

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

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

  8. java访问本地文件_详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相 ...

  9. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

最新文章

  1. android 内核 netlink 上报,Network Daemon(Android Netd)架构和源码分析
  2. poj 3071 Football(概率dp)
  3. windows隐藏python运行时的终端
  4. 输出26个英文字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
  5. 深入理解SVM之对偶问题
  6. 复制字符串 _strdup _wcsdup _mbsdup
  7. 同步与异步、异步与回调
  8. 3806. 最小化字符串-AcWing题库
  9. 一周学会linux实战 下载 pdf_UOS可用的pdf编辑工具
  10. RiruEdxposed学习研究(四)Magisk(面具)源码下载编译详细实战教程
  11. 一脸懵逼搭建Zookeeper分布式集群
  12. memcached介绍与作用和它的工作原理
  13. 如何自建微信外卖平台_本地外面平台怎么起步,如何自建微信外卖平台
  14. Java理论题(2)——简答题
  15. MT3: 多任务多轨音频转录
  16. 全国计算机一级等级分布,计算机一级考试分布
  17. IntellJ IDEA 基础之 常用快捷键的简单整理
  18. 优粉吧-微信大号推广微信公众平台大号直发转发自媒体推广
  19. 硬盘数据迁移软件哪款好用?强烈推荐它!
  20. 联想笔记本进入BIOS开启Intel VT-x

热门文章

  1. 分享一个冰雪复古辅助多开脚本
  2. 世界排名前五位的女程序员
  3. Unity3D热更新技术点——ToLua(上)
  4. 书法人生-纷繁芜杂真的是生活的真相吗?
  5. 单片机18b20c语言程序,单片机c语言ds18b20程序
  6. 走着瞧Anbsp;Talenbsp;ofnbsp;Twonbsp;Donkeysnbsp;(200…
  7. html屏幕缩小图片不失真,html图片失真怎么办
  8. Junit Test a getter
  9. 正则表达式-验证QQ号
  10. Linux中常用的英文总结