windows下使用ffmpeg进行视频转换和截图。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下使用ffmpeg进行视频转换和截图。相关的知识,希望对你有一定的参考价值。

  1. author:fanfq(xiaoban)

Email:fangqing.fan#gmail.com
link:http://fanfq.iteye.com/admin/blogs/655569

changelog:

有很多朋友发邮件问我关于ffmpeg视频转码的相关问题,我也尝试了帮助他们去解决这些问题,由于个人精力有限就blog上总结一下大家所遇到的一些问题。

以下代码只要是使用的我的包是肯定没有问题的,但是至限于*-》flv,因为不同格式的视频转码所对应的参数也是不一样的,想要达到效果教好的视频的话就得修改这些参数,但是我们有一个通用的方式,只要是ffmpeg支持的视频的话。使用 ffmpeg -i form.** to.** 就可以了,但是这只局限与测试。

windows环境测试
一.磨刀不误砍柴工
1.ffmpeg下载地址:https://ffmpeg.zeranoe.com/builds/,下载解压如下图所示:

在C:盘下创建一个文件夹C:\\ffmpeg\\,然后将上面截图的内容复制进去。

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格式的视频文件。。。

视频格式转换:

  1.   1 import java.io.File;
      2 import java.util.ArrayList;
      3 import java.util.Calendar;
      4 import java.util.List;
      5 
      6 public class Test {
      7     private final static String PATH = "c:\\\\ffmpeg\\\\input\\\\c.mp4";
      8 
      9     public static void main(String[] args) {
     10         if (!checkfile(PATH)) {
     11             System.out.println(PATH + " is not file");
     12             return;
     13         }
     14         if (process()) {
     15             System.out.println("ok");
     16         }
     17     }
     18 
     19     private static boolean process() {
     20         int type = checkContentType();
     21         boolean status = false;
     22         if (type == 0) {
     23             System.out.println("直接将文件转为flv文件");
     24             status = processFLV(PATH);// 直接将文件转为flv文件
     25         } else if (type == 1) {
     26             String avifilepath = processAVI(type);
     27             if (avifilepath == null)
     28                 return false;// avi文件没有得到
     29             status = processFLV(avifilepath);// 将avi转为flv
     30         }
     31         return status;
     32     }
     33 
     34     private static int checkContentType() {
     35         String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length()).toLowerCase();
     36         // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
     37         if (type.equals("avi")) {
     38             return 0;
     39         } else if (type.equals("mpg")) {
     40             return 0;
     41         } else if (type.equals("wmv")) {
     42             return 0;
     43         } else if (type.equals("3gp")) {
     44             return 0;
     45         } else if (type.equals("mov")) {
     46             return 0;
     47         } else if (type.equals("mp4")) {
     48             return 0;
     49         } else if (type.equals("asf")) {
     50             return 0;
     51         } else if (type.equals("asx")) {
     52             return 0;
     53         } else if (type.equals("flv")) {
     54             return 0;
     55         }
     56         // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
     57         // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
     58         else if (type.equals("wmv9")) {
     59             return 1;
     60         } else if (type.equals("rm")) {
     61             return 1;
     62         } else if (type.equals("rmvb")) {
     63             return 1;
     64         }
     65         return 9;
     66     }
     67 
     68     private static boolean checkfile(String path) {
     69         File file = new File(path);
     70         if (!file.isFile()) {
     71             return false;
     72         }
     73         return true;
     74     }
     75 
     76     // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
     77     private static String processAVI(int type) {
     78         List<String> commend = new ArrayList<String>();
     79         commend.add("c:\\\\ffmpeg\\\\mencoder");
     80         commend.add(PATH);
     81         commend.add("-oac");
     82         commend.add("lavc");
     83         commend.add("-lavcopts");
     84         commend.add("acodec=mp3:abitrate=64");
     85         commend.add("-ovc");
     86         commend.add("xvid");
     87         commend.add("-xvidencopts");
     88         commend.add("bitrate=600");
     89         commend.add("-of");
     90         commend.add("avi");
     91         commend.add("-o");
     92         commend.add("c:\\\\ffmpeg\\\\output\\\\a.avi");
     93         try {
     94             ProcessBuilder builder = new ProcessBuilder();
     95             builder.command(commend);
     96             builder.start();
     97             return "c:\\\\ffmpeg\\\\output\\\\a.avi";
     98         } catch (Exception e) {
     99             e.printStackTrace();
    100             return null;
    101         }
    102     }
    103 
    104     // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
    105     private static boolean processFLV(String oldfilepath) {
    106         if (!checkfile(PATH)) {
    107             System.out.println(oldfilepath + " is not file");
    108             return false;
    109         }
    110         // 文件命名
    111         Calendar c = Calendar.getInstance();
    112         String savename = String.valueOf(c.getTimeInMillis()) + Math.round(Math.random() * 100000);
    113         List<String> commend = new ArrayList<String>();
    114         commend.add("c:\\\\ffmpeg\\\\ffmpeg");
    115         commend.add("-i");
    116         commend.add(oldfilepath);
    117         commend.add("-ab");
    118         commend.add("56");
    119         commend.add("-ar");
    120         commend.add("22050");
    121         commend.add("-qscale");
    122         commend.add("8");
    123         commend.add("-r");
    124         commend.add("15");
    125         commend.add("-s");
    126         commend.add("600x500");
    127         commend.add("c:\\\\ffmpeg\\\\output\\\\a.flv");
    128         try {
    129             Runtime runtime = Runtime.getRuntime();
    130             Process proce = null;
    131             String cmd = "";
    132             String cut = "     c:\\\\ffmpeg\\\\ffmpeg.exe   -i   " + oldfilepath
    133                     + "   -y   -f   image2   -ss   8   -t   0.001   -s   600x500   c:\\\\ffmpeg\\\\output\\\\" + "a.jpg";
    134             String cutCmd = cmd + cut;
    135             proce = runtime.exec(cutCmd);
    136             ProcessBuilder builder = new ProcessBuilder(commend);
    137             builder.command(commend);
    138             builder.start();
    139             return true;
    140         } catch (Exception e) {
    141             e.printStackTrace();
    142             return false;
    143         }
    144     }
    145 }

     

视频截图:

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Ffmpeg {
    public static void main(String[] args) {
        // 视频文件
        String videoRealPath = "E:\\\\Eclipse2\\\\a.avi";
        // 截图的路径(输出路径)
        String imageRealPath = "E:\\\\Eclipse2\\\\atest.jpg";

        // 方法一:调用批处理程序,调用批处理文件ffmpeg.bat转换视频格式
        // try {
        // //调用批处理文件
        // Runtime.getRuntime().exec("cmd /c start
        // C:\\\\Users\\\\Administrator\\\\Desktop\\\\test\\\\ffmpeg.bat " + videoRealPath
        // + " " + imageRealPath);
        // } catch (IOException e) {
        // // TODO Auto-generated catch block
        // e.printStackTrace();
        // }

        // 方法二:通过命令提示符来调用需要添加系统路径(Path),调用menconder转换视频各种
        // commendF
        // .add("cmd.exe /c mencoder E:\\\\Eclipse2\\\\test.flv -o
        // e:\\\\Eclipse2\\\\test.avi
        // -oac mp3lame -lameopts cbr:br=32
        // -ovc x264 -x264encopts bitrate=440 -vf scale=448:-3");

        // 方法三:调用系统中的可执行程序调用ffmpeg 提取视屏缩略图
        List<String> commend = new java.util.ArrayList<String>();
        commend.add("E:\\\\Eclipse2\\\\Mplayer\\\\ffmpeg-git-4082198-win32-static\\\\bin\\\\ffmpeg.exe");
        commend.add("-i");
        commend.add(videoRealPath);
        commend.add("-y");
        commend.add("-f");
        commend.add("image2");
        commend.add("-ss");
        commend.add("8");
        commend.add("-t");
        commend.add("0.001");
        commend.add("-s");
        commend.add(imageRealPath);
        try {

            ProcessBuilder builder = new ProcessBuilder();

            builder.command(commend);

            builder.redirectErrorStream(true);

            System.out.println("视频截图开始...");

            // builder.start();

            Process process = builder.start();

            InputStream in = process.getInputStream();

            byte[] re = new byte[1024];

            System.out.print("正在进行截图,请稍候");

            while (in.read(re) != -1) {

                System.out.print(".");

            }

            System.out.println("");

            in.close();

            System.out.println("视频截图完成...");

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("视频截图失败!");

        }
    }
}

 

 

以上是关于windows下使用ffmpeg进行视频转换和截图。的主要内容,如果未能解决你的问题,请参考以下文章

巧用ffmpeg从视频中截图

使用FFmpeg工具进行推流拉流截图变速转换,及常见问题处理

使用ffmpeg进行视频截图

Windows下PHP中使用ffmpeg

asp.net 使用FFmpeg将视频转换为mp4格式

想要使用ffmpeg来完成如下两个功能: 1.视频截图 2.视频分割功能