package com.zone;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.*;
import org.bytedeco.javacv.Frame;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Map;
public class Util {
/**
* 图片转视频
* @param sourceVideolUrl 原视频地址
* @param targetVideoUrl 新视频地址
* @param imgMap
* @return void
*/
public static void imageTovideo(String sourceVideolUrl, String targetVideoUrl, Map<Integer, File> imgMap) throws IOException {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(sourceVideolUrl);
grabber.start();
int width = grabber.getImageWidth();
int height = grabber.getImageHeight();
// 时长
// long duration = grabber.getLengthInTime() / 1000000;
// 帧数
int ftp = grabber.getLengthInFrames();
//视频宽高最好是按照常见的视频的宽高 16:9 或者 9:16
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(targetVideoUrl, width, height);
//设置视频为25帧每秒
recorder.setFrameRate(25);
//设置视频图像数据格式
recorder.setPixelFormat((avutil.AV_PIX_FMT_YUV420P));
recorder.setFormat(grabber.getFormat());
recorder.start();
Java2DFrameConverter converter = new Java2DFrameConverter();
int num = 0;
while (num <= ftp){
Frame sourceFrame = grabber.grabImage();
if (sourceFrame == null) {
num++;
continue;
}
BufferedImage read = ImageIO.read(imgMap.get(num));
Frame targetFrame = converter.getFrame(read);
targetFrame.audioChannels = sourceFrame.audioChannels;
targetFrame.sampleRate = sourceFrame.sampleRate;
targetFrame.samples = sourceFrame.samples;
recorder.record(targetFrame);
num++;
}
//最后一定要结束并释放资源
recorder.stop();
recorder.release();
grabber.stop();
grabber.release();
}
}