`

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");就好了

试过 还是没有啊 麻烦看下

相关推荐

    用java程序调用ffmpeg执行视频文件格式转换flv

    在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...

    java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长

    java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长。主要参考http://blog.sina.com.cn/s/blog_a5116c670102wiwj.html 的代码方式。步骤: 1.研究java如何调用外部程序 2.研究ffmpeg转换视频格式的...

    java调用视频转换工具ffmpeg.zip

    Java调用视频转换工具FFmpeg是一项常见的任务,特别是在多媒体处理和流媒体服务中。FFmpeg是一个强大的跨平台命令行工具,用于转换、流化、编辑和处理音频和视频文件。在Java应用程序中集成FFmpeg,可以实现灵活的...

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

    Java调用FFmpeg转换视频格式为...总之,Java调用FFmpeg转换视频格式是一项常见任务,涉及到系统进程调用、第三方库的使用,以及对FFmpeg命令和参数的理解。通过合理的编程实践,我们可以构建稳定、高效的视频处理功能。

    java调用ffmpeg 添加水印转换视频

    java调用ffmpeg添加水印并且转换视频,代码中并没有判断哪些格式支持,那些不支持,mpg,mp4,avi,wmv基本都可以(传入格式),转换为flv avi mp4起码都没问题,其它的没事过ffmpeg是开源的支持的挺多的 补充:时间算错了,...

    java 调用 ffmpeg 进行视频转换以及截图.rar

    这个压缩包文件"java 调用 ffmpeg 进行视频转换以及截图.rar"显然提供了一个解决方案,让我们能够在Java环境中利用`ffmpeg`的功能。 首先,让我们详细了解一下如何在Java中调用`ffmpeg`。这通常涉及到使用Java的`...

    java用ffmpeg截取视频图片

    Java 使用 FFmpeg 截取视频图片是一个常见的任务,它涉及到多媒体处理、命令行操作和跨平台编程。FFmpeg 是一个强大的开源工具集,用于处理音频和视频文件,包括编码、解码、转码、流处理等功能。在 Java 中,我们...

    java调用ffmpeg实现视频转换的方法

    下面的Java代码示例展示了如何通过Java调用FFmpeg执行视频转换任务: ```java import java.io.File; import java.util.List; public class ConvertVideo { private final static String PATH = "c:\\test\\a.mpg...

    windows下java调用ffmpeg视频处理环境搭建

    在Windows环境下,使用Java调用FFmpeg进行视频处理是一项常见的任务,尤其在开发涉及多媒体处理的应用时。FFmpeg是一款强大的跨平台的音频和视频处理工具,而Java则是一种广泛使用的编程语言,它提供了丰富的库来与...

    Java利用FFmpeg解析视频,截图,获取视频播放时间

    Java使用FFmpeg解析视频、截图和获取播放时间的实践是一个重要的技术主题,尤其在多媒体处理领域。FFmpeg是一个强大的开源工具集,包含了多种用于处理音频和视频的工具,如ffprobe、ffmpeg等。在Java中集成FFmpeg,...

    java利用ffmpeg获取视频缩略图

    在Java中使用ffmpeg,通常会通过调用系统命令或者使用第三方库如`Xuggle`或`ffmpeg-java`来实现。在这个项目中,开发者选择了一个简洁的方法,仅通过一个类和二十多行代码就实现了功能,这使得代码易于理解和维护。 ...

    最简单的java调用FFmpeg转换视频格式为FLV的方法

    最简单的java调用FFmpeg转换视频格式为FLV的方法,在win下调用命令提示符。

    windows下java调用ffmpeg视频处理源码

    6. **环境搭建**:配合"windows下java调用ffmpeg视频处理环境搭建",这部分可能包括如何在Windows系统上安装FFmpeg,设置环境变量,以及如何确保Java程序能正确找到并执行FFmpeg的可执行文件。 7. **错误处理和日志...

    java web ffmpeg memcoder视频转换为flash

    压缩包内的`java调用视频转换工具ffmpeg.doc`应该包含了如何在Java代码中使用FFmpeg的具体示例。通常需要编写一个Java工具类,封装FFmpeg的命令行调用,包括设置输入输出路径、编码参数等。 4. 使用说明文档:`java...

    java中使用FFMpeg获取视频时长

    在Java中使用FFmpeg获取视频时长,首先需要安装FFmpeg命令行工具,并将其添加到系统的PATH环境变量中,以便Java程序可以调用。此外,还需要引入一个Java的FFmpeg绑定库,例如`ffmpeg-java`或`fluent-ffmpeg`,这些库...

    java+ffmpeg视频、音频转码

    通过以上分析,我们可以看出这个项目的核心是利用Java调用FFmpeg实现视频和音频的转码功能,涉及到多媒体处理、文件操作、系统调用等多个方面。对于开发者来说,理解FFmpeg的工作原理以及如何在Java中有效地利用它是...

    java封装ffmpeg截取视频图片

    本文将详细介绍如何在Java中使用封装的FFmpeg库进行视频截图、视频剪辑和视频转换,并讨论其支持的编码类型以及在Windows和Linux平台上的应用。 首先,我们要了解Java封装FFmpeg的基本原理。通常,这涉及到使用JNI...

    java 调用视频转换工具ffmpeg

    总的来说,Java调用FFmpeg是一个常用的技术手段,可以帮助开发者在Java应用程序中实现丰富的音视频处理功能。需要注意的是,由于FFmpeg的命令行语法较为复杂,因此在实际使用中,理解其参数和选项至关重要,同时也要...

    java ffmpeg视频转换

    在提供的文件列表中,"java调用ffmpeg转换视频错误 - ITeye问答.htm"可能是关于一个具体的错误案例或讨论。通常,这类问题可能涉及编码解码器不匹配、输入输出文件格式不支持、内存分配问题、命令语法错误等。通过...

    ffmpeg压缩java实例

    在百度AI和腾讯AI的活体验证场景中,高质量、低大小的视频文件是必要的,因此使用FFmpeg进行视频压缩就显得尤为重要。 首先,我们需要理解FFmpeg的基本工作原理。FFmpeg支持多种编码格式,如H.264、VP9等,通过调整...

Global site tag (gtag.js) - Google Analytics