<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.0.2-1.4.3</version>
</dependency>
/**
* 功能描述: 保存小视频
*
*/
@RequestMapping(value = "/saveVideo", method = RequestMethod.POST)
@ResponseBody
public void saveVideo(@RequestParam(value="file",required=false) MultipartFile file) {
try {
InputStream inputStream = file.getInputStream();
// todo 返回小视频url 和 图片url
Map map = picBusiness.uploadVideo(request, inputStream);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void uploadVideo(InputStream inputStream){
File saveDirectory = new File("文件夹路径");
// 创建文件夹
if (!saveDirectory.exists() && !saveDirectory.isDirectory()) {
boolean bl = saveDirectory.mkdirs();
}
// 转byte
byte[] b = readAsBytes(inputStream);
OutputStream out = null;
try{
out = new FileOutputStream(filePath.concat(fileName));
out.write(b);
out.flush();
// 第一帧图片路径
grabberVideoFramer(文件名, 路径);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(null != out){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 二进制读取
public static byte[] readAsBytes(InputStream in) {
byte[] buffer = new byte[0];
try {
buffer = new byte[in.available()];
} catch (IOException e) {
e.printStackTrace();
}
try {
in.read(buffer);
in.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer;
}
public String grabberVideoFramer(String videoFileName, String videoPath, Map map){
//最后获取到的视频的图片的路径
String videPicture="";
String pivStr = "";
//Frame对象
Frame frame = null;
//标识
int flag = 0;
try {
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath.concat(videoFileName));
fFmpegFrameGrabber.start();
//获取视频总帧数
int ftp = fFmpegFrameGrabber.getLengthInFrames();
String rotate = fFmpegFrameGrabber.getVideoMetadata("rotate");
while (flag <= ftp) {
frame = fFmpegFrameGrabber.grabImage();
opencv_core.IplImage src = null;
if (frame != null && flag==1) {
// 视频旋转调整
if(StringUtils.isNotBlank(rotate)){
OpenCVFrameConverter.ToIplImage converter =new OpenCVFrameConverter.ToIplImage();
src =converter.convert(frame);
frame =converter.convert(rotate(src, Integer.valueOf(rotate)));
}
//文件储存对象
File outPut = new File(文件绝对路径+文件名);
BufferedImage bufferedImage = FrameToBufferedImage(frame);
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
// 图片大小限制
if(width > height){
// 高宽比
double proportion = (double)height/(double)width;
width = 600;
BigDecimal bd=new BigDecimal(width * proportion).setScale(0, BigDecimal.ROUND_HALF_UP);
height = bd.intValue();
}
// 图片压缩
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
bi.getGraphics().drawImage(bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
0, 0, null);
ImageIO.write(bi, "jpg", outPut);
break;
}
flag++;
}
fFmpegFrameGrabber.stop();
fFmpegFrameGrabber.close();
} catch (Exception e) {
throw new BusinessException("grabberVideoFramer 异常", e);
}
return pivStr;
}
public static BufferedImage FrameToBufferedImage(Frame frame) {
//创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
public static opencv_core.IplImage rotate(opencv_core.IplImage src, int rotate) {
opencv_core.IplImage img = opencv_core.IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());
opencv_core.cvTranspose(src, img);
opencv_core.cvFlip(img, img, rotate);
return img;
}
java保存视频并保存第一帧图片
最新推荐文章于 2024-08-01 02:07:23 发布