狠人话不多,直接上代码
package com.bitar.javavideo.test;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.io.File;
/**
* 把图片转换为MP4视频 ,
* dir:D:\desktop\test\test01
* 1个图1秒
*/
public class Test01 {
public static void main(String[] args) throws Exception {
String outPutFile = "D:\\desktop\\test\\test01\\01-result.mp4";
int imgWidth = 512;
int imgHeight = 512;
// FFmpegFrameRecorder:处理视频帧
//视频宽高最好是按照常见的视频的宽高 16:9 或者 9:16
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outPutFile, imgWidth, imgHeight);
//设置视频编码层模式
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
//1-代表1帧/s
Double FrameRate = 25.0D;
recorder.setFrameRate(FrameRate);
/*
* videoBitRate这个参数很重要,当然越大,越清晰,但最终的生成的视频也越大。
* 查看一个资料,说均衡考虑建议设为videoWidth*videoHeight*frameRate*0.07*运动因子,运动因子则与视频中画面活动频繁程度有关,如果很频繁就设为4,不频繁则设为1
*/
int motionFactory = 1;
recorder.setVideoBitrate((int) ((imgWidth * imgHeight * FrameRate) * motionFactory * 0.07));
//设置视频图像数据格式
int pixelFormat = avutil.AV_PIX_FMT_YUV420P;
recorder.setPixelFormat(pixelFormat);
String format = "mp4";
recorder.setFormat(format);
// 双通道(立体声)
// recorder.setAudioChannels(grabber.getAudioChannels());
recorder.setAudioChannels(2);
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start();
// 录制视频
Java2DFrameConverter converter = new Java2DFrameConverter();
//URL imgUrl = new URL("D:\\desktop\\test\\img1.png");
//根据每秒的帧数 记录多少次图片,
for (int i = 0; i < 25; i++) {
recorder.record(converter.getFrame(ImageIO.read(new File("D:\\desktop\\test\\test01\\512x512-1.png"))));
}
for (int i = 0; i < 25; i++) {
recorder.record(converter.getFrame(ImageIO.read(new File("D:\\desktop\\test\\test01\\512x512-2.png"))));
}
for (int i = 0; i < 25; i++) {
recorder.record(converter.getFrame(ImageIO.read(new File("D:\\desktop\\test\\test01\\512x512-3.png"))));
}
recorder.close();
}
}
补充:
FFmpegFrameRecorder 可以当成录像机,往录像中加入一张张图片,最后就是视频。
FFmpegFrameRecorder 记录的是frame(视频帧),所以需要将图片转换为Frame需要借助Java2DFrameConverter 。可以将本地图片、字节、网络图片等作为录像机的图片来源。
注意:最终视频是一个固定宽高的视频,所以图片最好是相同尺寸,关于图片的编辑、音频编辑后续会讲到,欢迎关注下哈