1.简介
    FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转档、流功能。

2.下载
    源代码 git://git.libav.org/libav.git
    Windows编译版 http://ffmpeg.zeranoe.com/builds/
    下载最新版(lastest),可以下载static的build。用到压缩包里的bin文件夹里的ffmpeg.exe。

3.ffmpeg基本命令:
    FFmpeg命令很多,如果你是在windows下开发的话,打开命令行,先进入你下载的FFmpeg.exe目录(cd……),输入ffmpeg -h即可查看各种命令。
下面就说说我们会用到的命令

格式转换 (将file.avi 转换成output.flv)
ffmpeg -i  file.avi   output.flv

现在有个视频video.avi,有个音频 audio.mp3,将其合并成output.avi
两个命令                     ( video2.avi 是中间文件 ,用完可删)
ffmpeg -i video.avi -vcodec copy -an video2.avi  
ffmpeg -i video2.avi -i audio.mp3 -vcodec copy -acodec copy output.avi
 -i 表示输入文件
  -vcodec copy 表示 force video codec ('copy' to copy stream) 这个不知怎么译 ,估计是直接copy
  -acodec copy   这个说的应该是音频了   跟上面一样
-an : 表示  disable audio  估计是audio no 之类的缩写   表示去掉video.avi 原有的音频

方法2 好像可以直接指定两个输入文件 ,
ffmpeg -i /tmp/a.wav -i /tmp/a.avi /tmp/a.avi 两个文件 的顺序很重
 
 
4.ffmpeg和java的结合
转自:http://blog.csdn.net/jimzhai/article/details/7853005
 
Java代码  收藏代码
import java.io.File; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 
 
public class ConvertVideo { 
  
    private final static String PATH = "c:\\ffmpeg\\input\\c.mp4"; 
  
    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) { 
            System.out.println("直接将文件转为flv文件"); 
            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 ArrayList<String>(); 
        commend.add("c:\\ffmpeg\\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:\\ffmpeg\\output\\a.avi"); 
        try {  
            ProcessBuilder builder = new ProcessBuilder(); 
            builder.command(commend);  
            builder.start();  
            return "c:\\ffmpeg\\output\\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; 
        }  
          
        // 文件命名  
        Calendar c = Calendar.getInstance();  
        String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000); 
        List<String> commend = new ArrayList<String>(); 
        commend.add("c:\\ffmpeg\\ffmpeg"); 
        commend.add("-i"); 
        commend.add(oldfilepath);  
        commend.add("-ab"); 
        commend.add("56"); 
        commend.add("-ar"); 
        commend.add("22050"); 
        commend.add("-qscale"); 
        commend.add("8"); 
        commend.add("-r"); 
        commend.add("15"); 
        commend.add("-s"); 
        commend.add("600x500"); 
        commend.add("c:\\ffmpeg\\output\\a.flv"); 
  
        try {  
            Runtime runtime = Runtime.getRuntime();  
            Process proce = null; 
            String cmd = ""; 
            String cut = "     c:\\ffmpeg\\ffmpeg.exe   -i   " 
                    + oldfilepath  
                    + "   -y   -f   image2   -ss   8   -t   0.001   -s   600x500   c:\\ffmpeg\\output\\" 
                    + "a.jpg"; 
            String cutCmd = cmd + cut;  
            proce = runtime.exec(cutCmd);  
            ProcessBuilder builder = new ProcessBuilder(commend); 
             builder.command(commend);  
            builder.start();  
  
            return true; 
        } catch (Exception e) { 
            e.printStackTrace();  
            return false; 
        }  
    }  
}

[置顶] ffmpg简介以及用它实现音频视频合并(java)的更多相关文章

  1. wordpress调用置顶文章sticky_posts的三种方法

    有时我们在开发wordpress时需要调用置顶文章sticky_posts,怎么调用呢?几种写法,有用到query_post的,有用到WP_Query,也有用到is_sticky(),下面随ytkah ...

  2. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  3. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  4. winform窗体置顶

    winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...

  5. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  6. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  7. Qt中让Qwidget置顶的方法

    一般来是说窗体置顶和取消只要        setWindowFlags(Qt::WindowStaysOnTopHint);        setWindowFlags(Qt::Widget); 要 ...

  8. js之滚动置顶效果

    0.js获取高度 ? 1 2 3 4 5 6 document.all   // 只有ie认识   document.body.clientHeight              // 文档的高,屏幕 ...

  9. Javascript笔记----实现Page页面右下角置顶按钮.

    从用博客开始,发现博客园中很多博友的博客中在Page右下角都有个图标,不论屏幕怎么拉伸,都始终停留在右下角.点击后页面置顶.后面想想写一个Demo来实现这种效果吧. 一. 图标右下角固定. 1.SS ...

随机推荐

  1. 循环灯控制器,该控制器控制红、绿、黄三个发光管循环发亮(VHDL语言)

    设计一个循环灯控制器,该控制器控制红.绿.黄三个发光管循环发亮.要求红发光管亮2秒,绿发光管亮3秒,黄发光管亮1秒.(假设外部提供频率为1MHz的方波信号) library ieee; use iee ...

  2. 怎么提高ArcGIS for Desktop10.x的性能

    Esri新公布了一篇提高ArcGIS for Desktop10.x的性能的文章.大家能够关注一下 http://support.esri.com/en/knowledgebase/techartic ...

  3. python web

    [root@xen202 wbk]# python -m SimpleHTTPServerServing HTTP on 0.0.0.0 port 8000 ...

  4. 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器

    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...

  5. 解决ScrollView中的ListView无法显示全

    问题描述: ListView加入到ScrollView中之后,发现只能显示其中一条,具体原因得看一下源代码.现在先贴一下方案 (转自:http://blog.csdn.net/hitlion2008/ ...

  6. [Network]Wireless and Mobile

    Wireless 1 Introduction 1.1 Elements 1. Wireless Hosts Wireless does not mean mobility. 2. Base Stat ...

  7. poj1459(最大流)

    传送门:Power Network 题意:在一个网络图中有n个点,其中有np个发电站,nc个用户,m条电线;每个发电站,用户,和电线都对应有一个最大的电流;让求出该网络中最大的电流. 分析:最大流裸题 ...

  8. UVA 639 (13.08.25)

     Don't Get Rooked  In chess, the rook is a piece that can move any number of squaresvertically or ho ...

  9. Enum实现单例模式

    package com.wjy.effective; public enum Singleton { INSTANCE; private int numa; private int numb; pub ...

  10. poj2096(概率dp)

    题目连接:http://poj.org/problem?id=2096 题意:一个程序有m个子系统,要找出n种bug,某人一天找n种bug中的一种,求出他找出n种bug并且每个子系统中都有bug的天数 ...