`
shuai1234
  • 浏览: 972472 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

通过 ffmpeg 获取视频第一帧(指定时间)图片

    博客分类:
  • java
 
阅读更多

 


1、VideoInfo.java 获取视频信息。读者可认真研究此方法。


复制代码
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 获取视频的信息
 * FFMPEG homepage http://ffmpeg.org/about.html
 */
public class VideoInfo
{
    //视频路径
    private String ffmpegApp;
    //视频时
    private int hours;
    //视频分
    private int minutes;
    //视频秒
    private float seconds;
    //视频width
    private int width;
    //视频height
    private int heigt;
   

    public VideoInfo() {}
   
    public VideoInfo(String ffmpegApp)
    {
        this.ffmpegApp = ffmpegApp;
    }
   
    public String toString()
    {
        return "time: " + hours + ":" + minutes + ":" + seconds + ", width = " + width + ", height= " + heigt;
    }
   
    public void getInfo(String videoFilename) throws IOException,
            InterruptedException
    {
        String tmpFile = videoFilename + ".tmp.png";
        ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp, "-y",
                "-i", videoFilename, "-vframes", "1", "-ss", "0:0:0", "-an",
                "-vcodec", "png", "-f", "rawvideo", "-s", "100*100", tmpFile);

        Process process = processBuilder.start();

        InputStream stderr = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line;
        //打印 sb,获取更多信息。 如 bitrate、width、heigt
        StringBuffer sb = new StringBuffer();
        while ((line = br.readLine()) != null)
        {
            sb.append(line);
        }

        new File(tmpFile).delete();
       
        System.out.println("video info:\n" + sb);
        Pattern pattern = Pattern.compile("Duration: (.*?),");
        Matcher matcher = pattern.matcher(sb);
       
        if (matcher.find())
        {
            String time = matcher.group(1);
            calcTime(time);
        }

        pattern = Pattern.compile("w:\\d+ h:\\d+");
        matcher = pattern.matcher(sb);
       
        if (matcher.find())
        {
            String wh = matcher.group();
            //w:100 h:100
            String[] strs = wh.split("\\s+");
            if(strs != null && strs.length == 2)
            {
                width = Integer.parseInt(strs[0].split(":")[1]);
                heigt = Integer.parseInt(strs[1].split(":")[1]);
            }
        }
       
        process.waitFor();
        if(br != null)
            br.close();
        if(isr != null)
            isr.close();
        if(stderr != null)
            stderr.close();
    }

    private void calcTime(String timeStr)
    {
        String[] parts = timeStr.split(":");
        hours = Integer.parseInt(parts[0]);
        minutes = Integer.parseInt(parts[1]);
        seconds = Float.parseFloat(parts[2]);
    }

    public String getFfmpegApp()
    {
        return ffmpegApp;
    }

    public void setFfmpegApp(String ffmpegApp)
    {
        this.ffmpegApp = ffmpegApp;
    }

    public int getHours()
    {
        return hours;
    }

    public void setHours(int hours)
    {
        this.hours = hours;
    }

    public int getMinutes()
    {
        return minutes;
    }

    public void setMinutes(int minutes)
    {
        this.minutes = minutes;
    }

    public float getSeconds()
    {
        return seconds;
    }

    public void setSeconds(float seconds)
    {
        this.seconds = seconds;
    }

    public int getWidth()
    {
        return width;
    }

    public void setWidth(int width)
    {
        this.width = width;
    }

    public int getHeigt()
    {
        return heigt;
    }

    public void setHeigt(int heigt)
    {
        this.heigt = heigt;
    }

    public static void main(String[] args)
    {
        VideoInfo videoInfo = new VideoInfo("D:\\ffmpeg\\bin\\ffmpeg.exe");
        try
        {
            videoInfo.getInfo("f:/sun/Diana_Vickers_-_The_Boy_Who_Murdered_Love.mkv");
            System.out.println(videoInfo);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

复制代码

从此类,可以看出,我把 ffmpeg,解压在了 D:\\ffmpeg\\bin\\ffmpeg.exe 路径下,传入一个视频地址,就可以得出视频信息。

2、VideoThumbTaker.java 获取视频指定播放时间的图片


复制代码
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

/**
 * @author Bashan
 * FFMPEG homepage http://ffmpeg.org/about.html
 * By Google Get first and last thumb of a video using Java and FFMpeg
 * From http://www.codereye.com/2010/05/get-first-and-last-thumb-of-video-using.html
 */

public class VideoThumbTaker
{
    protected String ffmpegApp;

    public VideoThumbTaker(String ffmpegApp)
    {
        this.ffmpegApp = ffmpegApp;
    }

    @SuppressWarnings("unused")
    /****
     * 获取指定时间内的图片
     * @param videoFilename:视频路径
     * @param thumbFilename:图片保存路径
     * @param width:图片长
     * @param height:图片宽
     * @param hour:指定时
     * @param min:指定分
     * @param sec:指定秒
     * @throws IOException
     * @throws InterruptedException
     */
    public void getThumb(String videoFilename, String thumbFilename, int width,
            int height, int hour, int min, float sec) throws IOException,
            InterruptedException
    {
        ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp, "-y",
                "-i", videoFilename, "-vframes", "1", "-ss", hour + ":" + min
                        + ":" + sec, "-f", "mjpeg", "-s", width + "*" + height,
                "-an", thumbFilename);

        Process process = processBuilder.start();

        InputStream stderr = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null)
            ;
        process.waitFor();
       
        if(br != null)
            br.close();
        if(isr != null)
            isr.close();
        if(stderr != null)
            stderr.close();
    }

    public static void main(String[] args)
    {
        VideoThumbTaker videoThumbTaker = new VideoThumbTaker("D:\\ffmpeg\\bin\\ffmpeg.exe");
        try
        {
            videoThumbTaker.getThumb("f:/sun/Diana_Vickers_-_The_Boy_Who_Murdered_Love.mkv", "C:\\thumbTest.png",    800, 600, 0, 0, 9);
            System.out.println("over");
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

复制代码

 

3、VideoFirstThumbTaker.java 获取第一帧图片


复制代码
import java.io.IOException;

/***
 *
 * 得到第一秒(也是第一帧)图片
 */
public class VideoFirstThumbTaker extends VideoThumbTaker
{
    public VideoFirstThumbTaker(String ffmpegApp)
    {
        super(ffmpegApp);
    }

    public void getThumb(String videoFilename, String thumbFilename, int width,
            int height) throws IOException, InterruptedException
    {
        super.getThumb(videoFilename, thumbFilename, width, height, 0, 0, 1);
    }
}

复制代码

4、VideoLastThumbTaker.java 获取最后一帧图片


复制代码
/**
 * 得到最后一秒(也是最后一帧)图片
 */

public class VideoLastThumbTaker extends VideoThumbTaker
{
    public VideoLastThumbTaker(String ffmpegApp)
    {
        super(ffmpegApp);
    }

    public void getThumb(String videoFilename, String thumbFilename, int width,
            int height) throws IOException, InterruptedException
    {
        VideoInfo videoInfo = new VideoInfo(ffmpegApp);
        videoInfo.getInfo(videoFilename);
        super.getThumb(videoFilename, thumbFilename, width, height,
                videoInfo.getHours(), videoInfo.getMinutes(),
                videoInfo.getSeconds() - 0.2f);
    }
}

复制代码

分享到:
评论

相关推荐

    最简单的利用ffmpeg获取视频的图片

    在“最简单的利用ffmpeg获取视频的图片”这一场景中,我们将探讨如何通过FFmpeg库从视频中提取帧并保存为PPM图像文件。 1. **FFmpeg基本概念** - FFmpeg是一个命令行工具,同时也提供了C/C++库供开发者直接进行...

    上传视频自动获取第一帧

    2. 了解FFmpeg工具及其在.NET环境下的应用,用于提取视频第一帧。 3. 图像处理和存储,包括选择合适的格式和编码,以及在服务器端保存和读取图像。 4. 前后端交互,将生成的图片信息返回给客户端展示。 以上所述...

    java获取视频信息,帧(封面图片)

    在Java编程环境中,获取视频信息和提取视频帧作为封面图片是一项常见的任务,特别是在处理多媒体内容时。本篇文章将深入探讨如何使用FFmpeg这个强大的跨平台命令行工具,并结合Java进行调用来实现这一功能。FFmpeg是...

    java后台利用ffmpeg实现将视频截取某一帧图片并保存

    以上代码会截取视频的第一帧并保存为指定路径的图片。当然,为了更精确地截取特定帧,你需要解析视频的时长信息,并根据需要调整`-vframes`参数。 总结来说,通过Java后台结合`ffmpeg.jar`,我们可以轻松地实现从...

    上传视频自动获取第一帧图片

    这里,`-i input.mp4` 指定了输入的视频文件,`-vf "select='eq(n,0)'"` 选择的是第一帧(n=0),`-vframes 1` 限制只输出一帧图像,最后的 `output.jpg` 是输出的图片文件名。 对于上传大小的限制,2MB的上限可能...

    java利用ffmpeg获取视频缩略图

    命令通常类似于`ffmpeg -i input.mp4 -ss time -vframes 1 output.png`,其中`-i`参数是输入视频,`-ss`定义了提取帧的时间,`-vframes 1`表示只提取一帧,`output.png`是输出的缩略图。 3. **执行命令**:使用Java...

    最新版本ffmpeg提取任意格式视频帧并保存

    如果想获取视频的缩略图,可以使用如下命令: ``` ffmpeg -i 输入视频文件 -vf "thumbnail,scale=w=1280:h=720" -q:v 2 输出图像文件 ``` 这里`thumbnail`筛选器会选取一个代表性的帧,`scale`筛选器用于调整图像...

    C#获取视频截图,ffmpeg简单调用

    在命令行中,我们可以直接输入`ffmpeg -i input_video.mp4 output_image.jpg`来获取视频`input_video.mp4`的第一帧并保存为`output_image.jpg`。这个命令中的`-i`参数指定了输入文件,`output_image.jpg`则是输出的...

    ffmpeg获取音视频基本信息

    运行 `ffprobe -i input.mp4 -select_streams a:0 -show_entries stream=codec_name -v quiet -of default=noprint_wrappers=1:nokey=1`,这里的 `a:0` 指定第一个音频流,将得到音频的编码格式,如 AAC、MP3 等。...

    在windows使用FFmpeg获取视频缩略图的工具类

    这里,`-i input.mp4` 指定了输入的视频文件,`-vf` 后的参数用于设置过滤器,`select='eq(n,0)'` 表示选择第一个帧作为缩略图,`setpts=1/TB` 是时间戳设置,确保输出的图片与视频同步,`-vframes 1` 指定只输出一...

    通过视频地址获取视频缩略图

    本教程将深入探讨如何仅通过视频地址来获取视频的缩略图,这是一个高效且实用的技术。以下是对这个主题的详细阐述: 1. **视频缩略图的概念**:视频缩略图,也称为预览图像或帧截图,是视频内容的一个静态表示,...

    C#获取视频时长,并且视频截图

    这段代码会从指定的视频文件中截取第一帧图片并保存到指定路径。`-vframes 1`参数表示只截取一帧。 在实际应用中,为了使程序更加健壮,你需要确保`ffmpeg.exe`已经正确安装并在系统路径中,或者在程序运行目录下。...

    截取视频的第一帧另存为图片

    接下来,让我们看看如何使用PHP和FFmpeg来实现“截取视频第一帧另存为图片”: ```php require_once 'vendor/autoload.php'; use FFMpeg\FFMpeg; use FFMpeg\Coordinate\TimeCode; use FFMpeg\Format\Video\WebM;...

    ffmpeg视频格式转换

    - 例如,提取视频的第一帧为 JPG 图片:`ffmpeg -i video.mp4 -vf "select='eq(n,0)'" -vframes 1 output.jpg`。 4. **添加水印**: - 添加文本水印:`ffmpeg -i 输入文件 -vf "drawtext=fontfile=/path/to/font....

    ffmpeg视频抓取图片

    默认情况下,FFmpeg会抓取第一帧作为图片,但也可以通过`-ss`参数设置提取的时间点,如`-ss 00:01:23.456`表示在1分23秒456毫秒处抓取。 如果你在Java项目中使用FFmpeg,通常会依赖相关的Java库,如Xuggle或ffmpeg-...

    net C# 上传视频自动截取一张图片.rar

    然后,我们可以使用以下代码来获取视频的第一帧并保存为图片: ```csharp using Xabe.FFmpeg; var info = FFmpeg.GetMediaInfo(Server.MapPath("~/Videos/" + videoFile.FileName)); var imageStream = info....

    C#上传视频截图成图片

    4. **截图选择**:为了选择合适的帧作为图片,你可以设定规则,例如选择中间帧、第一帧或某一时间点的帧。这可能需要计算帧率,或者使用`Seek`方法跳转到特定位置。 5. **图片保存**:最后,将帧数据保存为图片文件...

    FFMPEG保存图片

    这里的`-i`参数指定了输入文件(视频文件),`-vframes 1`表示仅提取并保存第一帧为图片,`输出文件.jpg`是保存的图片文件名。 4. **具体操作**:在王纲老师的例子中,假设我们有一个名为`video.mp4`的视频文件,...

    ffmpeg转码截取、截图、合并

    `ffmpeg获取视频时长.txt`则可能包含如何使用FFmpeg获取视频长度的信息,这对于视频处理的预处理阶段非常有用。 在使用FFmpeg进行视频处理时,一定要注意文件路径的正确性,以及错误处理和日志记录,以确保程序的...

    JAVA获取视频缩略图

    通常会选择第一帧,因为它是视频的预览画面,但也可以根据时间戳选择中间或最后一帧。 5. 转换为图像:将视频帧转换为`BufferedImage`对象,这一步可以使用`IImage`到`BufferedImage`的转换。 6. 保存图像:将`...

Global site tag (gtag.js) - Google Analytics