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