这篇文章主要介绍了 详解java调用ffmpeg转换视频格式为flv的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
详解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; } }
以上是Java调用ffmpeg转换视频格式为flv的示例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

新兴技术对Java的平台独立性既有威胁也有增强。1)云计算和容器化技术如Docker增强了Java的平台独立性,但需要优化以适应不同云环境。2)WebAssembly通过GraalVM编译Java代码,扩展了其平台独立性,但需与其他语言竞争性能。

不同JVM实现都能提供平台独立性,但表现略有不同。1.OracleHotSpot和OpenJDKJVM在平台独立性上表现相似,但OpenJDK可能需额外配置。2.IBMJ9JVM在特定操作系统上表现优化。3.GraalVM支持多语言,需额外配置。4.AzulZingJVM需特定平台调整。

平台独立性通过在多种操作系统上运行同一套代码,降低开发成本和缩短开发时间。具体表现为:1.减少开发时间,只需维护一套代码;2.降低维护成本,统一测试流程;3.快速迭代和团队协作,简化部署过程。

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

要解决Java应用程序中的平台特定问题,可以采取以下步骤:1.使用Java的System类查看系统属性以了解运行环境。2.利用File类或java.nio.file包处理文件路径。3.根据操作系统条件加载本地库。4.使用VisualVM或JProfiler优化跨平台性能。5.通过Docker容器化确保测试环境与生产环境一致。6.利用GitHubActions在多个平台上进行自动化测试。这些方法有助于有效地解决Java应用程序中的平台特定问题。

类加载器通过统一的类文件格式、动态加载、双亲委派模型和平台无关的字节码,确保Java程序在不同平台上的一致性和兼容性,实现平台独立性。

Java编译器生成的代码是平台无关的,但最终执行的代码是平台特定的。1.Java源代码编译成平台无关的字节码。2.JVM将字节码转换为特定平台的机器码,确保跨平台运行但性能可能不同。

多线程在现代编程中重要,因为它能提高程序的响应性和资源利用率,并处理复杂的并发任务。JVM通过线程映射、调度机制和同步锁机制,在不同操作系统上确保多线程的一致性和高效性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1
好用且免费的代码编辑器

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),