Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取上传视频文件的缩略图?_Java_Video_Thumbnails - Fatal编程技术网

Java 如何获取上传视频文件的缩略图?

Java 如何获取上传视频文件的缩略图?,java,video,thumbnails,Java,Video,Thumbnails,几天来,我一直在尝试为上传的文件创建缩略图,但没有效果。我试过Xugler、FFMpegFrameGrabber和其他一些随机代码,但似乎都不起作用。从视频中捕获单个帧应该是一项简单的任务。有人知道我怎么做吗?使用ffmpegthumbnailer快速轻量级视频缩略图。使用ffmpegthumbnailer快速轻量级视频缩略图。您可以使用(sucesor) 与maven一起使用: <project> ... <dependencies> ... &

几天来,我一直在尝试为上传的文件创建缩略图,但没有效果。我试过Xugler、FFMpegFrameGrabber和其他一些随机代码,但似乎都不起作用。从视频中捕获单个帧应该是一项简单的任务。有人知道我怎么做吗?

使用ffmpegthumbnailer快速轻量级视频缩略图。

使用ffmpegthumbnailer快速轻量级视频缩略图。

您可以使用(sucesor)

与maven一起使用:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.humble</groupId>
      <artifactId>humble-video-all</artifactId>
      <version>0.2.1</version>
    </dependency>
  </dependencies>
</project>

...
...
谦卑的

您可以使用(sucesor)

与maven一起使用:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.humble</groupId>
      <artifactId>humble-video-all</artifactId>
      <version>0.2.1</version>
    </dependency>
  </dependencies>
</project>

...
...
谦卑的

我用io.humble编写了一个简单的示例来创建视频图片。但这是一个scala类。您可以检查它,并根据需要将其修改为java版本

看看:

我用io.humble编写了一个简单的示例来创建视频图片。但这是一个scala类。您可以检查它,并根据需要将其修改为java版本

看看:

package com.tape.controller;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入javax.imageio.imageio;
导入org.bytedeco.javacv.FFmpegFrameGrabber;
导入org.bytedeco.javacv.OpenCVFrameGrabber;
公共课录像员{
保护串ffmpegApp;
公共视频采集者(字符串ffmpegApp)
{
this.ffmpegApp=ffmpegApp;
}
public void getThumb(字符串videoFilename、字符串thumbFilename、int-width、int-height、int-hour、int-min、float-sec)
抛出IOException、InterruptedException
{
ProcessBuilder ProcessBuilder=新的ProcessBuilder(ffmpegApp,“-y”、“-i”、videoFilename、“-vframes”、“1”,
“-ss”,“小时+”:“+min+”:“+sec”,“-f”,“mjpeg”,“-s”,宽度+“*”+高度,“-an”,拇指文件名);
Process=processBuilder.start();
InputStream stderr=process.getErrorStream();
InputStreamReader isr=新的InputStreamReader(stderr);
BufferedReader br=新的BufferedReader(isr);
弦线;
而((line=br.readLine())!=null);
process.waitFor();
}
公共静态void main(字符串[]args)引发异常,IOException
{
FFmpegFrameGrabber g=新的FFmpegFrameGrabber(“C:\\JavaEE\\new Project\\tape\\src\\main\\webapp\\web resources\\videos\\vid.mp4”);
g、 setFormat(“mp4”);
g、 start();
对于(int i=0;i<50;i++){
ImageIO.write(g.grab().getBuffereImage(),“png”,新文件(“C:\\JavaEE\\new Project\\tape\\src\\main\\webapp\\web resources\\thumbnails\\video frame-”+System.currentTimeMillis()+“.png”);
}
g、 停止();
}
}
我使用这个Java代码使用FFMpegFrameGrabber来创建视频的Thumnail。试试看

Maven依赖项:

<dependency>
   <groupId>org.bytedeco</groupId>
   <artifactId>javacv</artifactId>
   <version>0.8</version>
</dependency>

org.bytedeco
爪哇
0.8
包com.tape.controller;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入javax.imageio.imageio;
导入org.bytedeco.javacv.FFmpegFrameGrabber;
导入org.bytedeco.javacv.OpenCVFrameGrabber;
公共课录像员{
保护串ffmpegApp;
公共视频采集者(字符串ffmpegApp)
{
this.ffmpegApp=ffmpegApp;
}
public void getThumb(字符串videoFilename、字符串thumbFilename、int-width、int-height、int-hour、int-min、float-sec)
抛出IOException、InterruptedException
{
ProcessBuilder ProcessBuilder=新的ProcessBuilder(ffmpegApp,“-y”、“-i”、videoFilename、“-vframes”、“1”,
“-ss”,“小时+”:“+min+”:“+sec”,“-f”,“mjpeg”,“-s”,宽度+“*”+高度,“-an”,拇指文件名);
Process=processBuilder.start();
InputStream stderr=process.getErrorStream();
InputStreamReader isr=新的InputStreamReader(stderr);
BufferedReader br=新的BufferedReader(isr);
弦线;
而((line=br.readLine())!=null);
process.waitFor();
}
公共静态void main(字符串[]args)引发异常,IOException
{
FFmpegFrameGrabber g=新的FFmpegFrameGrabber(“C:\\JavaEE\\new Project\\tape\\src\\main\\webapp\\web resources\\videos\\vid.mp4”);
g、 setFormat(“mp4”);
g、 start();
对于(int i=0;i<50;i++){
ImageIO.write(g.grab().getBuffereImage(),“png”,新文件(“C:\\JavaEE\\new Project\\tape\\src\\main\\webapp\\web resources\\thumbnails\\video frame-”+System.currentTimeMillis()+“.png”);
}
g、 停止();
}
}
我使用这个Java代码使用FFMpegFrameGrabber来创建视频的Thumnail。试试看

Maven依赖项:

<dependency>
   <groupId>org.bytedeco</groupId>
   <artifactId>javacv</artifactId>
   <version>0.8</version>
</dependency>

org.bytedeco
爪哇
0.8
使用和处理旋转视频图像

import io.humble.video.*;
import io.humble.video.awt.MediaPictureConverter;
import io.humble.video.awt.MediaPictureConverterFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.*;
import java.nio.file.Path;

        demuxer = Demuxer.make();
        demuxer.open(videoFile.toString(), null, false, true, null, null);
        final int numStreams = demuxer.getNumStreams();
        int streamIndex = -1;
        Decoder videoDecoder = null;
        String rotate = null;
        for (int i = 0; i < numStreams; ++i) {
            final DemuxerStream stream = demuxer.getStream(i);
            final KeyValueBag metaData = stream.getMetaData();
            final Decoder decoder = stream.getDecoder();
            if (decoder != null && decoder.getCodecType() == MediaDescriptor.Type.MEDIA_VIDEO) {
                videoDecoder = decoder;
                streamIndex = i;
                rotate = metaData.getValue("rotate", KeyValueBag.Flags.KVB_NONE);
                break;
            }
        }
        if (videoDecoder == null) {
            throw new IOException("Not a valid video file");
        }
        videoDecoder.open(null, null);

        final MediaPicture picture = MediaPicture.make(
            videoDecoder.getWidth(),
            videoDecoder.getHeight(),
            videoDecoder.getPixelFormat());

        final MediaPictureConverter converter =
            MediaPictureConverterFactory.createConverter(
                MediaPictureConverterFactory.HUMBLE_BGR_24,
                picture);

        final MediaPacket packet = MediaPacket.make();
        BufferedImage image = null;
        MUX:
        while (demuxer.read(packet) >= 0) {
            if (packet.getStreamIndex() != streamIndex) {
                continue;
            }
            int offset = 0;
            int bytesRead = 0;
            videoDecoder.decodeVideo(picture, packet, offset);
            do {
                bytesRead += videoDecoder.decode(picture, packet, offset);
                if (picture.isComplete()) {
                    image = converter.toImage(null, picture);
                    break MUX;
                }
                offset += bytesRead;

            } while (offset < packet.getSize());
        }
        if (image == null) {
            throw new IOException("Unable to find a complete video frame");
        }
        if (rotate != null) {
            final AffineTransform transform = new AffineTransform();
            transform.translate(0.5 * image.getHeight(), 0.5 * image.getWidth());
            transform.rotate(Math.toRadians(Double.parseDouble(rotate)));
            transform.translate(-0.5 * image.getWidth(), -0.5 * image.getHeight());
            final AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
            image = op.filter(image, null);
        }

        final Path target = videoFile.getParent().resolve(videoFile.getFileName() + ".thumb.jpg");

        final double mul;
        if (image.getWidth() > image.getHeight()) {
            mul = 216 / (double) image.getWidth();
        } else {
            mul = 216 / (double) image.getHeight();
        }

        final int newW = (int) (image.getWidth() * mul);
        final int newH = (int) (image.getHeight() * mul);
        final Image thumbnailImage = image.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
        image = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_BGR);

        final Graphics2D g2d = image.createGraphics();
        g2d.drawImage(thumbnailImage, 0, 0, null);
        g2d.dispose();

        ImageIO.write(image, "jpeg", target.toFile());
        return target.toAbsolutePath();
导入io.humble.video.*;
导入io.humble.video.awt.MediaPictureConverter;
导入io.humble.video.awt.MediaPictureConverterFactory;
导入javax.imageio.imageio;
导入java.awt.*;
导入java.awt.image.*;
导入java.nio.file.Path;
demuxer=demuxer.make();
open(videoFile.toString(),null,false,true,null,null);
final int numStreams=demuxer.getNumStreams();
int streamIndex=-1;
解码器videoDecoder=null;
字符串旋转=空;
对于(int i=0;i