`

java调用ffmpeg执行视频转换

    博客分类:
  • JAVA
 
阅读更多
用java小例题说明更直观:(可以直接编译运行)
环境我在windows平台下测试的。。。
需要在e:\下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4个文件。
 
还要在e:\input下放各种文件名为a的以下各种视频文件;还要e:\output;java程序执行后能得到一个a.flv的已转换的文件。
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个文件是为文件格式(wmv9,rm,rmvb等)
转换为avi(ffmpeg能解析的)格式准备的;再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。
 
java文件的内容如下:
import java.io.File;
import java.util.List;
public class ConvertVideo {
 
 private final static String PATH = "c:\\test\\a.mpg";
 public static void main(String[] args) {
        if(!checkfile(PATH)){
         System.out.println(PATH+" is not file");
         return;
        }       
  if (process()) {                 
            System.out.println("ok");
        }
 }
 
 private static boolean process() {       
  int type = checkContentType();
        boolean status = false;
        if (type==0) {
            status = processFLV(PATH);// 直接将文件转为flv文件           
        } else if (type==1) {
            String avifilepath = processAVI(type);
            if (avifilepath == null)
                return false;// avi文件没有得到
            status = processFLV(avifilepath);// 将avi转为flv
        }
        return status;
    }
    private static 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 static boolean checkfile(String path){
     File file=new File(path);
     if(!file.isFile()){
      return false;
     }
     return true;
    }
//  对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
    private static String processAVI(int type) {
        List<String> commend=new java.util.ArrayList<String>();
        commend.add("e:\\mencoder");
        commend.add(PATH);
        commend.add("-oac");
        commend.add("lavc");
        commend.add("-lavcopts");
        commend.add("acodec=mp3:abitrate=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("c:\\home\\a.avi");
       
        try{
         ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            builder.start();
            return "c:\\home\\a.avi";
        }catch(Exception e){
         e.printStackTrace();
         return null;
        }
    }
//  ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
    private static boolean processFLV(String oldfilepath) {
     
      if(!checkfile(PATH)){
          System.out.println(oldfilepath+" is not file");
          return false;
         }     
       
        List<String> commend=new java.util.ArrayList<String>();
        commend.add("e:\\ffmpeg");
        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("c:\\home\\a.flv");
        try {
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            builder.start();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
 
}
 
怎么进行转换成功并没有看到a.flv文件呢?

你把commend.add("mp3");改为commend.add("libmp3lame");就好了

ffmpeg.exe

<script type="text/javascript"></script>
  ffmpeg.exe是一个源于Linux的工具软件,是FLV视频转换器,可以轻易地实现FLV向其它格式avi、asf、 mpeg的转换或者将其它格式转换为flv。
参数
      ffmpeg.exe -i F:\闪客之家\闪客之歌.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\11.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 'test.jpg'
  对已有flv抓图:
  ffmpeg -i "test.flv" -y -f image2 -ss 8 -t 0.001 -s 350x240 'test.jpg'
  -ss后跟的时间单位为秒
  Ffmpeg转换命令
  ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500
  -ab 24 -f 3gp test.3gp
  或者
  ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp
  ffmpeg参数设定解说
  -bitexact 使用标准比特率
  -vcodec xvid 使用xvid压缩
  -s 320x240 指定分辨率
  -r 29.97 桢速率(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
  画面部分,选其一
  -b <比特率> 指定压缩比特率,似乎ffmpeg是自动VBR的,指定了就大概是平均比特率,比如768,1500这样的
  就是原来默认项目中有的
  -qscale <数值> 以<数值>质量为基础的VBR,取值0.01-255,约小质量越好
  -qmin <数值> 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
  -sameq 使用和源同样的质量
  声音部分
  -acodec aac 设定声音编码
  -ac <数值> 设定声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质
  的DVDrip就可以用2
  -ar <采样率> 设定声音采样率,PSP只认24000
  -ab <比特率> 设定声音比特率,前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换
  君默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上
  -vol <百分比> 设定音量,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍
  这样,要得到一个高画质音质低容量的MP4的话,首先画面最好不要用固定比特率,而用VBR参数让程序自己去
  判断,而音质参数可以在原来的基础上提升一点,听起来要舒服很多,也不会太大(看情况调整
  例子:ffmpeg -y -i "1.avi" -title "Test" -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 "1.***"
  解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行。不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的cores子目录)。
  参数:
  -y(覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了)
  -i "1.avi"(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)
  -title "Test"(在PSP中显示的影片的标题)
  -vcodec xvid(使用XVID编码压缩视频,不能改的)
  -s 368x208(输出的分辨率为368x208,注意片源一定要是16:9的不然会变形)
  -r 29.97(帧数,一般就用这个吧)
  -b 1500(视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高)
  -acodec aac(音频编码用AAC)
  -ac 2(声道数1或2)
  -ar 24000(声音的采样频率,好像PSP只能支持24000Hz)
  -ab 128(音频数据流量,一般选择32、64、96、128)
  -vol 200(200%的音量,自己改)
  -f psp(输出psp专用格式)
  -muxvb 768(好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了)
  "1.***"(输出文件名,也可以加路径改文件名)
  机器强劲的话,可以多开几个批处理文件,让它们并行处理。
  E:\ffmpeg.exe -i I:\1.wmv -b 360 -r 25 -s 320x240 -hq -deinterlace -ab 56 -ar 22050 -ac 1 D:\2.flv

mencoder和ffmpeg分割合并视频

1. mencoder

       (1)mencoder分割视频命令           

  1. miko@bogon:~/Videos> mencoder -ss 1:00  -endpos 3:00 -oac pcm -ovc copy orgin.mp4 -o 1.mp4  

            选项说明:

 

 

 

                          -ss  1:00                指定视频分割开始的时间

                          -endpos 3:00        指定视频分割结束的时间(自分割开始的时间)

                          -oac                        指定用哪个音频编码库

                          -ovc                        指定用哪个视频编码库

                          -o                            指定输出文件名

                  备注:具体参数参考mencoder手册。

            另一种方法:

              mencoder  "/home/guo/Videos/hp/hp.avi" -o "/home/guo/Videos/hp/outfile.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=5000:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050 -ss 30:30 -endpos 00:10


               特别注意:

         在用上述命令分割视频的时候出现了两个比较大的问题,目前还不知道怎么解决。

                                   1   在分割的时候,分割后的视频开始时会出现丢帧;

                                   2   两挨着分割的视频会有一小截重复。


        (2)mencoder合并视频     

  1. miko@bogon:~/Videos> mencoder 1.mp4 2.mp4 -oac pcm -ovc copy  -o ok.mp4  

            这个命令是把1.mp4和2.mp4两个视频合并到一起。

 


2. ffmpeg

          (1)分割视频命令               

  1. miko@bogon:~/Videos> ffmpeg -ss 0 -t 10 -vcodec copy -acodec copy -i orgin.mp4 1.mp4  
                  选项介绍:

                              -ss                   截取视频的开始时间 单位为秒

                              -t                      截取视频的时长,单位为秒

                              -vcodec           视频编码

                              -acodec           音频编码

                              -i                        输入文件


            (2)视频合并命令

                         合并的命令目前还不知道,以后补上。



分享到:
评论
1 楼 love_jun1314 2013-10-11  
怎么进行转换成功并没有看到a.flv文件呢?

你把commend.add("mp3");改为commend.add("libmp3lame");就好了

试过 还是没有啊 麻烦看下

相关推荐

Global site tag (gtag.js) - Google Analytics