问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用JAVA调用ffmpeg实现将各种视频格式转为flv时,怎样做出简单操作的界面...

发布网友 发布时间:2022-04-23 22:05

我来回答

3个回答

懂视网 时间:2022-04-16 05:01

详解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处理视频文件的方法教程
  • Java使用ffmpeg和mencoder实现视频转码
  • java调用ffmpeg实现转换视频
  • Java+Windows+ffmpeg实现视频转换功能
  • Java实现对视频进行截图的方法【附ffmpeg下载】
  • Javacv使用ffmpeg实现音视频同步播放
  • java调用ffmpeg实现视频转换的方法
  • Java通过调用FFMPEG获取视频时长
  • 热心网友 时间:2022-04-16 02:09

    源代码肯定不会贴给你的,思路可以说下!
    首先,你在后台把各格式的相互转换函数写好比如,rm2flv,wav2flv,自己去掉人家的借口,找下demo代码。
    然后,做一个表单网页,能上传源文件到服务器,点击上传提交任务
    最后,上传完毕,判断文件格式(后缀),然后调用对应的函数进行转换,转换完毕后,可以给出转换信息,如文件大小,转换时间,转换后文件url地址等
    完毕!

    热心网友 时间:2022-04-16 03:27

    http://blog.csdn.net/l1028386804/article/details/44889781
    利用ffmpeg.exe实现视频转换flv

    可以的,在java代码中调用ffmpeg.exe程序,同时将需要进行格式转换的原视频文件和输出的视频文件地址当作参数进行设置就OK了。我在C#中实现过的。最简单且常用的ffmpeg命令行使用方式:ffmpeg.exe -i inputfilename.mpg outputfilename.flv (输出文件格式通过后缀名来指定,同时必须指定输出文件名,因...

    在Java中怎样把所有的视频都转换成flv格式

    解决方案一: java调用ffmpeg执行视频转换 ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式;mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(w...

    使用JAVA调用ffmpeg组件进行视频转换时不成功

    FFMPEG没有java可以直接调用的API,网上那些基本上是通过调用cmd命令来实现转换的。这种方法很容易出错,效率低而且也不容易调试。最好的办法是让提供商提供flv格式的文件。如果不行你只有测试一下直接用FFMPEG的图形界面转看结果如何,然后尝试更换参数,视频文件和FFMPEG版本。

    如何使用ffmpeg.exe转换flv格式、截图

    ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv 使用-ss参数 作用(time_off set the start time offset),可以从指定时间点开始转换任务。如:转换文件格式的同时抓缩微图:ffmpeg -i "test.avi" -y -f image2 -ss 8 -t 0.001 -s 350x240 'tes...

    怎么样用MediaCoder将其他格式视频正常转码为flv?

    容器换成mp4,混流器选择mp4box,转出来的mp4用ffmpeg重新封装成flv ffmpeg重新封装的命令:ffmpeg -i "?" -vcodec copy -acodec copy "?"前一个问号改成输入的mp4文件的完整路径,后一个问号改成输出文件的文件名,只要输出文件的扩展名是flv,就可以让ffmpeg把视频重新封装成flv了 ...

    如何使用ffmpeg将1080P的mpg文件转换为720P的flv文件

    百度页面搜索:视频转换大师专业版 可以把任意格式转换为FLV等格式的万能软件 万能转换软件--为视频格式文件转换提供了终极解决方案,它能够读取各种视频和音频文件,并且将他们快速转换为流行的媒体文件格式。拥有非常漂亮友好的界面. 它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, ...

    ffmpeg实现媒体流解码

    音频解码:同样的方法,通过avcodec_find_decoder和avcodec_open2找到并启动音频解码器。解码过程:这部分涉及ffmpeg的解码核心,根据音频和视频流的特性,进行实际的解码操作。输出存储:音频和视频数据的存储需要特定技巧,包括选择合适的格式(如YUV420或YUV422)以及存储方法。完整源码已在文章ffmpeg实现音...

    如何利用ffmpeg拉RTSP流转推RTMP服务器?

    ffmpeg通过-vcodec copy 和 -acodec copy 保持视频和音频的原始质量,-f flv指定输出格式为Flash Video(FLV),这对于RTMP服务器的兼容至关重要。要成功实现RTSP到RTMP的转换,确保两点至关重要:一是rtsp地址的准确性,二是ffmpeg版本的兼容性。对于EasyDSS这样的平台,其官方技术博客通常会提供详细的...

    求将视频转换成清晰度高的flv的方法,不求视频变小

    晚上好,这个用mediacoder就可以了,默认用视频2500kbps,h264,二次编码(2pass),最慢,ffmpeg,分辨率1280*720,音频256kbps,nero-aac,ffmpeg,立体声即可,如果不求视频体积变小,大可把码率往上提到4000kbps甚至8000kbps峰值,最后在混流封装选择ffmpeg,flv封装就可以了,这个清晰度已经可以达到常见动画的raw格式...

    我想用ffmpeg命令行转换一个视频文件,视、音频编码格式不变,只是将画...

    在你的转码命令里面添加上-vf rotate=PI/2或者-vf rotate=3*PI/2,例如 ffmpeg -i E:\ffmpeg\test.mp4 -y -vf rotate=PI/2 E:\ffmpeg\dest1.mp4

    怎么把视频转成flv格式的 视频怎么转换flv格式 pr如何导出flv视频格式 如何播放flv格式的视频 flv格式视频怎么下载 flv视频格式下载 视频格式flv是什么意思 flv格式视频是什么 flv格式视频播放
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    qzzn 如何升为科长 谁能给个qzzn论坛的邀请注册号啊 谁能给我一个qzzn 论坛会员账号? QZZN 论坛注册 qzzn论坛为什么不能注册了 魔兽真三改键如何设置改好? 真三高手的改键方式 2012 安徽省庐江县各所高中今年的中考预计录取分数线 庐江县一中二中三中招多少新生 庐江中考639分能上二中吗2011年 在Java中怎样把所有的视频都转换成flv格式 麻烦高手给姓张的女孩子起名字。 使用JAVA调用ffmpeg组件进行视频转换时不成功 给姓张起名女孩好听一点的 张姓女孩儿,取名意旨在于“比男孩子优秀或者超过男孩” 在哪看自己淘宝店的网址 为什么我进淘宝店铺看不到首页了? 家用的电脑显示器多少尺寸的合适? 成都地铁17号线彭镇福田村有站吗? 成都有几条地铁线路? 成都地铁金星站是几号线 成都地铁17号线有阳公桥站吗? 成都地铁17号线踏水桥和厂北路口是一个站吗 成都地铁17号线所有站点 成都地铁17号线二期的具体站点有哪些? 成都有地铁吗? 成都地铁17号线二期的具体站点有哪些 成都地铁白佛桥站没有BcD出口? 成都在建的一条地铁线路,设多少个站点?一期工程何时通车? 成都地铁17号线,我在红星路二段如何去乘? 姓张女孩子起名 ffmpeg 转换视频的参数,我不太明白,如果转换时还要生成一张缩略图该怎么写啊。 java怎么处理视频转码 Java利用ffmpeg对视频逐帧保存,截取的帧太多近万张,如何设置帧间隔大些,使一定时间内的帧数变少 java 有什么好用的视频转码工具,需要将视频转成MP4 格式 java使用ffmpeg进行视频截图,不成功,程序也没报错! 如何将ffmpeg部署到服务器里,让其自动切片成m3u8文件 怎么用java读取ffmpeg输出流 ffmpeg 把avi转换flv怎么是0kb java实现网站视频的上传与播放求解,该怎么处理 如何在php中实现ffmpeg视频转码 JAVA编写的播放器,怎么才能支持RMVB、FLV等其他格式的影片? 如何使用java对视频进行编码和解码 java如何截取视频的帧,生成一个图片 股市中成交量多少才算正常 上证指数中,一般日交易额达到多少个亿才算正常? 一只股票每天成交量为多少?就叫成交低迷、活跃!(按流通盘计算) 成交量怎么看?多少才算是正常的? 股票的成交量一般多大是个比较合理的范围? 股市的成交量怎么算的