【问题标题】:Create a video preview image like youtube or whatsapp from a Video file (.mp4) using JAVA Code使用 JAVA 代码从视频文件 (.mp4) 创建视频预览图像,如 youtube 或 whatsapp
【发布时间】:2018-05-08 02:59:53
【问题描述】:

问题1.当我使用FFmpeg Java api时,程序在grabber.start()之后没有运行和打印任何东西。未生成预览​​。

代码示例:

public static boolean generatePreviewImage(String filePath, String previewFileName ) throws IOException {
        boolean isPreviewGenerated = false;
        System.out.println("Request received to generate thumbnail for video.");
        System.out.println("VideoFilePath : "+filePath);
        System.out.println("ResultFileName : "+previewFileName);
        try {

            FFmpegFrameGrabber fGrabber = new FFmpegFrameGrabber(filePath);
            System.out.println("FrameGrabber found "+fGrabber);
            fGrabber.start();
            System.out.println("Frame started..");
            ImageIO.write(fGrabber.grab().getBufferedImage(), "jpg", new File(previewFileName));
            System.out.println("Image written successfully as "+previewFileName);
            isPreviewGenerated = true;
            fGrabber.stop();
            System.out.println("FrameGrabber stopped.. "+fGrabber);

        } catch(Exception e){
            System.out.println("Exception while creating video thumbnail : "+previewFileName+" - exception - "+e);
            e.printStackTrace();
        }
        System.out.println("Image written successfully? "+previewFileName);
        return isPreviewGenerated;
    }   

结果: 收到为视频生成缩略图的请求。 视频文件路径:/root/appdir/VIDEO20171124143855.mp4 结果文件名:/root/appdir/vdthumb_0.jpg FrameGrabber 找到 org.bytedeco.javacv.FFmpegFrameGrabber@3529360e

在上面的语句之后什么都没有发生并被打印出来..


附加信息: 我也在 Linux VPS 上安装了 FFmpeg,并且能够使用命令行生成预览 root@vps19984[~/usr/appdir]#ffmpeg -i /root/appdir/.VIDEO20171123165555.mp4 -r 1 -f image2 image-%2d.png (上面的命令 ffmpeg 在 linux 机器上成功生成预览,但我想通过 Java 程序生成它)


问题 2. 当我使用 JCodec api 时,程序会生成黑色图像,但不会从视频文件中生成图像。 代码示例:

public static boolean generatePreviewImage(String filePath, String previewFileName ) throws IOException, JCodecException {
    logger.info("Request received to generate thumbnail for video. VideoFilePath : "+filePath+", resultFileName "+previewFileName);
    boolean isPreviewGenerated = false;
    Picture framePic = FrameGrab.getNativeFrame(new File(filePath),20);
    logger.info("Frame grabbed successfully..");
    Transform transform = ColorUtil.getTransform(framePic.getColor(), ColorSpace.RGB);
    Picture rgb = Picture.create(framePic.getWidth(), framePic.getHeight(), ColorSpace.RGB);
    transform.transform(framePic, rgb);
    logger.info("Frame transformed successfully to RGB..");
    BufferedImage dst = new BufferedImage(rgb.getCroppedWidth(), rgb.getCroppedHeight(),
            BufferedImage.TYPE_INT_RGB);
    ImageIO.write(dst, "jpg", new File(previewFileName));
    isPreviewGenerated = true;
    logger.info("Is preview generated.."+isPreviewGenerated);

}

结果: 收到为视频生成缩略图的请求。视频文件路径:/usr/appdir/VIDEO20171123165555.mp4,结果文件名/usr/appdir/vdthumb_0.jpg 抓帧成功.. 帧成功转换为 RGB.. 是否生成预览..true

问题:JCodec 生成 5 KB 的黑色 jpg 图像

【问题讨论】:

    标签: java ffmpeg video-processing jcodec


    【解决方案1】:

    感谢 Urvashi 的所有 cmets 和建议。使用 FFMpeg,我的环境无法正常工作。我也没有任何例外。我会进一步尝试,看看是什么问题。

    但是使用 JCodec(第 2 期)我可以使用以下代码生成预览:

    在 pom.xml 中添加了如下两个依赖:

    <dependency>
        <groupId>org.jcodec</groupId>
        <artifactId>jcodec</artifactId>
        <version>0.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.jcodec</groupId>
        <artifactId>jcodec-javase</artifactId>
        <version>0.2.1</version>
    </dependency>
    

    并在java文件中编写如下代码:

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import org.jcodec.api.JCodecException;
    import org.jcodec.api.awt.AWTFrameGrab;
    
    public static boolean generatePreviewImage(String filePath, String previewFileName ) throws IOException, JCodecException {
        boolean isPreviewGenerated = false;
        try {
            double sec = 1;
            BufferedImage dst = AWTFrameGrab.getFrame(new File(filePath), sec);
            ImageIO.write(dst, "jpg", new File(previewFileName));
            isPreviewGenerated = true;
            //where filePath is the path of video file and previeFileName is the name of preview image file.    
        } catch(Exception e) {
            System.out.println("Exception while creating video thumbnail : "+previewFileName+" - exception - "+e);
            e.printStackTrace();
        }
        System.out.println("Image written successfully? "+previewFileName);
        return isPreviewGenerated;
    }
    

    谢谢!

    【讨论】:

      【解决方案2】:

      检查此代码,因为它成功创建了文件。进行了一些更改。这是问题 1 的解决方案。 如果您看不到日志,则问题出在记录器上。您可以粘贴您正在使用的记录器或使用您的记录器搜索问题。

      public static boolean generatePreviewImage(String filePath,
              String previewFileName) throws IOException, Exception {
          logger.info("Request received to generate thumbnail for video. VideoFilePath : "
                  + filePath + ", resultFileName " + previewFileName);
          boolean isPreviewGenerated = false;
          FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath);
          logger.info("FrameGrabber found " + grabber);
          grabber.start();
          logger.info("FrameGrabber started.. " + grabber);
          for (int i = 20; i < 22; i++) {
              logger.info("Reading first 2 images..");
              ImageIO.write(grabber.grab().getBufferedImage(), "jpg", new File(
                      previewFileName + "_" + i));
              logger.info(i + " image written successfully as " + previewFileName
                      + "_" + i + ".jpg");
              isPreviewGenerated = true;
          }
          grabber.stop();
          logger.info("Is preview generated.." + isPreviewGenerated);
          return isPreviewGenerated;
      
      }
      

      【讨论】:

      • 感谢 Urvashi 的回复,但 Loggers 不是问题.. 即使在删除记录器并使用您编辑的代码后,抓取器也没有启动..
      • 你用什么解决FFmpegFrameGrabber的依赖??我正在使用来自 repository 的 maven 依赖项,您也可以使用 System.out.println() 来完成最初的流程。
      • 另外,您是否已将代码形式 throws IOException {} 更正为 throws IOException { ??
      • 我正在使用具有以下依赖项的 maven org.bytedecojavacv0.10 我也是将每个记录器更改为 System.out.println ,但程序仍然停留在 fGrabber.start() 语句上。即使没有开始,它看起来也很吸引人。注意:IOException 后面的“{}”是在 stackoverflow 中粘贴代码时的拼写错误。
      • 是的,您使用的这个版本是例外。请使用我之前评论中已经分享的版本。点击存储库。使用 0.8 版,您的工作就完成了。
      猜你喜欢
      • 2019-09-17
      • 2013-08-03
      • 2013-04-10
      • 2014-08-24
      • 2020-09-14
      • 2011-01-03
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多