java MultipartFile 的视频文件压缩到104857600 bytes.内 再转回 MultipartFile file的完整代码 使用 FFmpegFrameRecorder
时间: 2024-05-25 21:08:50 浏览: 11
您好,以下是Java中使用FFmpegFrameRecorder进行视频压缩并转回MultipartFile的示例代码:
```
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
public class VideoCompressUtil {
/**
* 将视频文件压缩到指定大小并转回MultipartFile
* @param videoFile 待压缩的视频文件
* @param maxSize 压缩后的最大大小,单位为字节
* @return 压缩后的MultipartFile对象
* @throws Exception
*/
public static MultipartFile compressVideo(File videoFile, long maxSize) throws Exception {
// 打开视频文件
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFile);
grabber.start();
// 获取视频的宽高和帧率
int width = grabber.getImageWidth();
int height = grabber.getImageHeight();
double frameRate = grabber.getFrameRate();
// 创建输出流,用于存放压缩后的视频数据
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建视频录制器,用于进行视频压缩
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputStream, width, height, 0);
recorder.setFormat("flv");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFrameRate(frameRate);
recorder.setVideoOption("preset", "ultrafast");
// 开始录制视频
recorder.start();
Frame frame;
while ((frame = grabber.grabFrame()) != null) {
// 将原视频的帧写入压缩器进行压缩
recorder.record(frame);
// 如果压缩后的视频大小达到指定大小,则停止录制
if (outputStream.size() >= maxSize) {
break;
}
}
recorder.stop();
grabber.stop();
// 将压缩后的视频数据转成MultipartFile对象并返回
byte[] bytes = outputStream.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bytes);
MultipartFile multipartFile = new MockMultipartFile("file", videoFile.getName(), "video/mp4", inputStream);
return multipartFile;
}
}
```
在上述代码中,我们使用FFmpegFrameGrabber读取原视频文件,获取其宽高和帧率等信息,并将原视频文件的帧逐帧写入FFmpegFrameRecorder中进行压缩。当压缩后的视频数据大小达到指定大小时,停止录制并将输出流中的数据转成MultipartFile对象返回。