• [置顶] ffmpg简介以及用它实现音频视频合并(java)


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

     
    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; 
            }  
        }  

     

  • 相关阅读:
    导入excel
    aspx页面调用发送邮件验证码(结合前两篇)
    随机生成数字(ashx文件,调用上篇所写发送邮件代码)
    C#邮箱发送验证码
    linq查询一个字段的总和
    随部分div增高总的div也随着增高
    视图显示库存余量
    利用存储过程把两个表的数据插入到一个新表中(存储过程中写两个游标)
    使用kindeditor文本编辑器
    MSSQLServer 2016 安装遇到的问题
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3174415.html
Copyright © 2020-2023  润新知