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. GitHub上项目配置和导入eclispe的问题解决

    在github上下载的工程文件导入的时候总是遇到各种各样的问题,昨天晚上瞎忙一晚上查资料没搞定.早上找高手请教了一下,一起弄了好一会终于解决了,这里记录一下方法解决的具体方法步骤. 本方法适用于离线导 ...

  2. spring异常记录-----java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

    今天在练习怎样SSH中进行单元測试的时候出现下列异常: SEVERE: Exception starting filter Struts2 java.lang.NoClassDefFoundError ...

  3. Git权威指南学习笔记(二)Git暂存区

    例如以下图所看到的: 左側为工作区,是我们的工作文件夹. 右側为版本号库,当中: index标记的是暂存区(stage),所处文件夹为.git/index,记录了文件的状态和变更信息. master标 ...

  4. C语言中输入输出重定,freopen()妙用。

    使用的理由(范围):如果输入数据很庞大,需要一次又一次的重新输入和调试时可采用本函数. freopen ()函数: 1.格式 FILE * freopen ( const char * filenam ...

  5. jquery clone方法

    引用自http://www.w3school.com.cn/tiy/t.asp?f=jquery_manipulation_clone <html> <head> <sc ...

  6. [Android学习笔记]PopupWindow的使用

    什么时候使用PopupWindow? 当业务需求的交互形式需要在当前页弹出一个简单可选项UI与用户进行交互时,可使用PopupWindow完成此功能开发 Android Dev API Doc Pop ...

  7. gcc入门

    gcc入门 1. 什么是gcc gcc的全称是GUN Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除 ...

  8. Cocos2dx 3.x创建Layer的步骤

    创建 1.新建类文件.注意文件夹为Classes下.否则文件不能正常找到. 2.改动预编译头.如用VS,默觉得#pragma once,为了兼容,改为#ifndef | #define | #endi ...

  9. Hdu 4738【求无向图的桥】.cpp

    题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...

  10. Android 开源框架Universal-Image-Loader全然解析(二)--- 图片缓存策略具体解释

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...