`
liang100100
  • 浏览: 37251 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

java 调用ffmpeg,取时长,码率与截图

 
阅读更多
package com.jzero.upload;
  
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
  
import com.jzero.util.MPrint;
import com.jzero.util.MRecord;
  
public class MFFmpeg {
    private String ffmpegPath;
    private static final String FILE_SEPARATOR = File.separator;
    public static MFFmpeg self = new MFFmpeg();
  
    private MFFmpeg() {
    }
  
    public static MFFmpeg me() {
        return self;
    }
  
    public MFFmpeg init(String path) {
        this.ffmpegPath = path;
        return this;
    }
  
    private static boolean isSurpportedType(String type) {
        Pattern pattern = Pattern.compile(
                "(asx|asf|mpg|wmv|3gp|mp4|mov|avi|flv){1}$",
                Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(type);
        return matcher.find();
    }
  
    /**
     *
     * @param sourceFile
     *            将要被转换的目标文件
     * @param desctination
     *            转换之后文件的存放路径 ffmpeg commandLine: ffmpeg -y -i
     *            /usr/local/bin/lh.mp4 -ab 56 -ar 22050 -b 500 -s 320x240
     *            /usr/local/bin/lh.flv
     * @throws IOException
     */
    public MRecord converToFlv(File sourceFile, String destination) {
  
        String fileName = sourceFile.getName();
        String surffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!isSurpportedType(surffix))
            throw new RuntimeException("unsurpported file type " + surffix);
  
        List<String> cmdParam = new LinkedList<String>();
        cmdParam.add(ffmpegPath);
        cmdParam.add("-y");
        cmdParam.add("-i");
        cmdParam.add(sourceFile.getAbsolutePath());
        cmdParam.add("-ab");
        cmdParam.add("56");
        cmdParam.add("-ar");
        cmdParam.add("22050");
        cmdParam.add("-b");
        cmdParam.add("500");
        cmdParam.add("-s");
        cmdParam.add("320*240");
        cmdParam.add(destination + FILE_SEPARATOR
                + fileName.substring(0, fileName.lastIndexOf(".")) + ".flv");
  
        return execCmd(cmdParam);
    }
  
    /**
     *
     * 获取图片的第一帧 ffmpeg commandLine: ffmpeg -y -i /usr/local/bin/lh.3gp -vframes
     * 1 -r 1 -ac 1 -ab 2 -s 320x240 -f image2 /usr/local/bin/lh.jpg
     *
     * @param sourceFile
     *            源文件
     * @param destination
     *            目标文件
     * @param surfix
     *            要保存的图片格式:jpg,jpeg,gif
     * @throws IOException
     * @throws IOException
     */
    public MRecord captureFirstFrame(File sourceFile, String destination) {
        return captureFirstFrame(sourceFile, destination, "jpg");
    }
  
    public MRecord captureFirstFrame(File sourceFile, String destination,
            String surfix) {
        String fileName = sourceFile.getName();
        String surffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!isSurpportedType(surffix))
            throw new RuntimeException("unsurpported file type " + surffix);
  
        List<String> cmd = new LinkedList<String>();
        cmd.add(ffmpegPath);
        cmd.add("-y");
        cmd.add("-i");
        cmd.add(sourceFile.getAbsolutePath());
        cmd.add("-vframes");
        cmd.add("1");
        cmd.add("-r");
        cmd.add("1");
        cmd.add("-ac");
        cmd.add("1");
        cmd.add("-ab");
        cmd.add("2");
        cmd.add("-s");
        cmd.add("56*56");
        cmd.add("-f");
        cmd.add("image2");
        cmd.add(destination + FILE_SEPARATOR
                + fileName.substring(0, fileName.lastIndexOf(".")) + "."
                + surfix);
  
        return execCmd(cmd);
    }
  
    private MRecord execCmd(List<String> cmd) {
        MRecord out = null;
        final ProcessBuilder pb = new ProcessBuilder();
        pb.redirectErrorStream(true);
        pb.command(cmd);
        try {
            final Process p = pb.start();
            InputStream in = p.getInputStream();
            out = pattInfo(in);
            // 开启单独的线程来处理输入和输出流,避免缓冲区满导致线程阻塞.
            try {
                p.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
            p.getErrorStream().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out;
    }
  
    // 负责从返回信息中读取内容
    private String read(InputStream is) {
        BufferedReader br = null;
        StringBuffer sb = new StringBuffer();
        try {
            br = new BufferedReader(new InputStreamReader(is), 500);
  
            String line = "";
            while ((line = br.readLine()) != null) {
                // System.out.println(line);
                sb.append(line);
            }
            br.close();
        } catch (Exception e) {
        } finally {
            try {
                if (br != null)
                    br.close();
            } catch (Exception e) {
            }
        }
        return sb.toString();
    }
  
    // 负责从返回的内容中解析
    /**
     * Input #0, avi, from 'c:\join.avi': Duration: 00:00:10.68(时长), start:
     * 0.000000(开始时间), bitrate: 166 kb/s(码率) Stream #0:0: Video: msrle
     * ([1][0][0][0] / 0x0001)(编码格式), pal8(视频格式), 165x97(分辨率), 33.33 tbr, 33.33
     * tbn, 33.33 tbc Metadata: title : AVI6700.tmp.avi Video #1
     */
    public MRecord pattInfo(InputStream is) {
        String info = read(is);
        MRecord out = new MRecord();
        String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";
        Pattern pattern = Pattern.compile(regexDuration);
        Matcher m = pattern.matcher(info);
        if (m.find()) {
            out.set("timelen", getTimelen(m.group(1))).set("begintime", m.group(2)).set(
                    "kb", m.group(3) + "kb/s");
        }
        return out;
    }
    //格式:"00:00:10.68"
    private int getTimelen(String timelen){
        int min=0;
        String strs[] = timelen.split(":");
        if (strs[0].compareTo("0") > 0) {
            min+=Integer.valueOf(strs[0])*60*60;//秒
        }
        if(strs[1].compareTo("0")>0){
            min+=Integer.valueOf(strs[1])*60;
        }
        if(strs[2].compareTo("0")>0){
            min+=Math.round(Float.valueOf(strs[2]));
        }
        return min;
    }
    public static void main(String[] args) {
        // String ffmpegPath = "c:/ffmpeg.exe";
        // File file = new File("c:/join.avi");
        // MFFmpeg.me().init(ffmpegPath).captureFirstFrame(file, "c:/", "jpg");
        String t = "00:00:10.68";
        String strs[] = t.split(":");
        int min=0;
        if (strs[0].compareTo("0") > 0) {
            min+=Integer.valueOf(strs[0])*60*60;//秒
        }
        if(strs[1].compareTo("0")>0){
            min+=Integer.valueOf(strs[1])*60;
        }
        if(strs[2].compareTo("0")>0){
            min+=Math.round(Float.valueOf(strs[2]));
        }
        MPrint.print(min);
    }
  
}
分享到:
评论

相关推荐

    java调用ffmpeg详细步骤

    使用Java语言调用终端开启关闭Nginx服务器,然后执行ffmpeg命令,开启转流推流。以及其它指令,来学习吧

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

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

    java上传调用ffmpeg转码截图截取视频

    在IT行业中,Java是一种...总结来说,Java调用FFmpeg处理视频涉及到文件上传、FFmpeg命令的构造与执行、视频的转码、时长获取、缩略图生成以及视频片段截取。理解这些知识点对于开发涉及音视频处理的Java应用至关重要。

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

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

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

    在实际应用中,Java调用FFmpeg进行视频转换时,需要注意以下几点: 1. 文件权限:确保Java程序有读取输入文件和写入输出文件的权限。 2. 并行处理:为了提高转换速度,可以考虑多线程并行处理多个视频文件。 3. 错误...

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

    Java调用FFmpeg转换视频格式为FLV是一个常见的任务,特别是在开发媒体处理应用程序时。FFmpeg是一个强大的跨平台命令行工具,用于处理音频和视频文件,包括转换、编码、解码、分割等操作。在Java中,我们通常通过...

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

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

    java中使用FFMpeg获取视频时长

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

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

    1. **Java FFmpeg API**:Java调用FFmpeg通常通过JNI(Java Native Interface)或者使用如JAVE(Java Audio Video Encoder)或Xuggler这样的库来实现。这些API允许Java代码直接调用FFmpeg的C/C++接口,使得Java应用...

    Java通过调用FFMPEG获取视频时长

    Java通过调用FFmpeg获取视频时长是利用Java程序调用外部的FFmpeg工具,以执行获取视频文件时长的任务。FFmpeg是一个功能强大的音视频处理工具集,支持各种音视频格式的编解码、转码、录制以及流式传输。它包含了...

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

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

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

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

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

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

    java 调用视频转换工具ffmpeg

    在Java中调用这个文件时,确保它位于系统的PATH环境变量中,或者直接提供完整路径。 在实际应用中,为了实现更复杂的视频处理任务,如添加水印、裁剪视频、调整分辨率等,可以通过在FFmpeg命令中添加额外的参数。...

    Java调用ffmpeg3.x操作视频、视频截图完整开发工具包-Win 64位版,含所需DLL文件

    Java调用ffmpeg操作视频、视频截图开发工具包-Win 64位版,含所需DLL文件 JAVA视频操作的最常用工具包的Windows环境开发运行库,支持在Windows下java调用ffmpeg进行视频操作、转码、截图等操作。如果你自己编译、...

    ffmpeg压缩java实例

    最后,`ffmpeg.exe`和`ffmpeg`文件可能分别是Windows和Linux/Unix环境下的FFmpeg可执行文件,它们是Java程序调用FFmpeg命令的核心工具,需要与Java代码一起部署到运行环境中。在开发过程中,确保这些文件与Java项目...

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

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

    linux上使用ffmpeg 实现视频截图

    在Linux环境中,利用Java调用FFmpeg命令进行视频截图是一项常见的任务,特别是在多媒体处理和视频分析的项目中。FFmpeg是一款强大的开源工具,它提供了多种音视频处理功能,包括编码、解码、转换、流处理等。在这个...

    java用ffmpeg截取视频图片

    在 Java 中,我们可以借助于 FFmpeg 的命令行接口与 Java 的 ProcessBuilder 类来调用 FFmpeg 进行截图操作。 首先,我们需要在项目环境中配置 FFmpeg。在 Windows 和 Linux 平台上,你可以下载 FFmpeg 的预编译...

    java利用ffmpeg获取视频缩略图

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

Global site tag (gtag.js) - Google Analytics