java生成視頻縮略圖
需要給前端返回視頻的縮略圖鏈接,本來使用的是阿里雲的OSS,它提供了縮略圖功能的,但是最近換成了Minio....就只有自己寫了;
要求:返回給前端一個連接,縮略圖實時生成,不會保存.
使用javacv包
流程: 先從Minio中讀取視頻,然后使用javacv獲取某一幀的圖,最后使用thumbnailator將圖片壓縮
但是,視頻幾十上百M的時候很慢,大視頻1分鍾都出不來_(:з」∠)_
若是縮略圖會保存起來,使用的時候直接讀取縮略圖的話,這個方案還可以,但是實時讀取就不行了
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.4</version>
</dependency>
使用
public void getViewResize(GlobalAccessoryFile accessory) throws Exception {
// 獲取Minio服務
MinioClient client = this.getOSSClient();
//從服務器獲取圖片
InputStream inputStream = client.getObject(GetObjectArgs.builder()
.bucket(ossCfg.bucketName) //桶
.object(accessory.getFileDirectoryPath()) //圖片在桶內位置
.build());
FFmpegFrameGrabber grabber;
InputStream img = null;
try {
grabber = new FFmpegFrameGrabber(inputStream,0);
grabber.start();
// 視頻總幀數
int videoLength = grabber.getLengthInFrames();
Frame frame = null;
int i = 0;
while (i < videoLength) {
// 過濾前5幀,因為前5幀可能是全黑的
frame = grabber.grabFrame();
if (i>5&&frame.image != null) {
break;
}
i++;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
// 繪制圖片
BufferedImage bi = converter.getBufferedImage(frame);
img = bufferedImageToInputStream(bi);
grabber.stop();
grabber.close();
} catch (IOException e) {
e.printStackTrace();
}
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.setContentType("multipart/form-data");
int h = accessory.getTHeight() != null ? accessory.getTHeight() : 200;
Thumbnails.Builder<? extends InputStream> tb = Thumbnails.of(img).height(h);
if (accessory.getTWidth() != null) {
tb.width(accessory.getTWidth());
}
tb.toOutputStream(response.getOutputStream());
}
/**
* 將BufferedImage轉換為InputStream
*
* @param image
* @return
*/
public static InputStream bufferedImageToInputStream(BufferedImage image) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ImageIO.write(image, "png", os);
InputStream input = new ByteArrayInputStream(os.toByteArray());
return input;
} catch (IOException e) {
}
return null;
}
vidio查看--失敗了
本來用這種方法,看着沒有加載視頻以為是成功了,后來發現,是之前瀏覽器緩存了,強制刷新之后還是會加載整個視頻_(:з」∠)_
直接返回給前端查看視頻的鏈接,前端使用這個連接顯示縮略圖
比如我的視頻鏈接是 http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34
前端需要縮略圖展示的時候(這樣會自動展示縮略圖,並且沒有操作按鈕)
<video height="200px" width="200" src="http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34"/>
前端需要播放視頻的時候
<video controls height="800px" width="1000" style="outline: none;width:100%" autoplay src="http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34"/>
前端下載
<a href="http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34" download="achieve8321280.mov">視頻下載</a>