用Javacv,ffmpeg将图片合成为视频
转自烂代码网:【Javacv示例】用Javacv,ffmpeg将图片合成为视频
https://www.trashcode.cn/post/d/9b7505de-5693-4a65-9e4a-c413c641b25f
步骤为:
读取图片库图片,用ffmpeg创建recorder
将读取到的图片转换为IplImage,用创建的recorder进行记录
生成视频
/**
* 通过图片创建视频
* @return
*/
public String createVideoFromPhoto()
{
//图片路径,指向图片目录
String imgFolder = videoFolder + "imggen\\emerge\\";
String videoFormat = "mp4";
String videoGenFolder = videoFolder + "videogen\\";
String videoName = "vCreateFromPhoto";
String videoGenPath = videoGenFolder + videoName + "." + videoFormat;
MediaTool.tryDelete(videoGenPath);
//用FFmpeg提供的 recorder 记录图片帧生成视频
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoGenPath, 640, 480);
try {
// recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// recorder.setVideoCodec(avcodec.AV_CODEC_ID_FLV1);
//设置编码格式
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat(videoFormat);
// recorder.setFormat("mov,mp4,m4a,3gp,3g2,mj2,h264,ogg,MPEG4");
recorder.setFrameRate(30);
//recorder.setPixelFormat(0); // yuv420p
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
recorder.start();
//图片转换器
OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage();
File file = new File(imgFolder);
File[] flist = file.listFiles();
String imgPath;
// 循环所有图片
org.bytedeco.opencv.opencv_core.IplImage image;
org.bytedeco.opencv.opencv_core.IplImage imageOther=null;
for (int i = 0; i < flist.length; i++) {
imgPath=imgFolder+flist[i].getName();
//image=opencv_imgcodecs.cvLoadImage(imgPath);
//加载图片
imageOther= cvLoadImage(imgPath);
for (int j = 0; j < 30; j++)
//按照帧率30进行记录
recorder.record(conveter.convert(imageOther));
//recorder.record(conveter.convert(image));
//opencv_core.cvReleaseImage(image);
}
opencv_core.cvReleaseImage(imageOther);
recorder.stop();
recorder.release();
//输出视频路径
LOGGER.info(videoGenPath);
} catch (Exception e) {
LOGGER.error("", e);
}
return videoGenPath;
}