import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.avutil;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameRecorder.Exception;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.opencv.core.Core;
public class PictureAndAudioToVideo {
public static void main(String[] args) throws Exception,
org.bytedeco.javacv.FrameGrabber.Exception {
// 图片转换器
// 在main函数中时要让系统去加载这个opencv的相关变量
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// ------------------->begin 初始化视频录制器
// 参数说明mp4Path.mov,视频的宽和高
//mp4Path 视频存储位置
//imageWidth 视频宽
//imageHeight 视频高
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");
String name = df.format(new Date())+"video.mp4";
String mp4Path = "D:\\video\\f"+name;
int imageWidth = 600;
int imageHeight = 800;
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4Path, imageWidth, imageHeight);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //MP4格式设置成H264,才能在html上播放
// 设置格式mp4
recorder.setFormat("mp4");
// 此处说明每一秒多少帧,即说明1秒会录多少张照片
recorder.setFrameRate(0.1); //0.01 代表100秒一张图
// 8000kb/s 这个说明视频每秒大小,值越大图片转过来的压缩率就越小质量就会越高
recorder.setVideoBitrate(8000000);
// yuv420p
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
// 先默认吧,这个应该属于设置视频的处理模式 不可变(固定)音频比特率
recorder.setAudioOption("crf", "0");
// 最高质量
recorder.setAudioQuality(0);
// 音频比特率
recorder.setAudioBitrate(192000);
// 音频采样率
recorder.setSampleRate(44100);
// 双通道(立体声)
recorder.setAudioChannels(2);
// ------------------->end 初始化视频录制器
recorder.start();// 开始录制
// ------------------->begin 图片处理开始
OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage(); // 申明一个图片处理的变量
// 图片目录的位置
String imagesPath = "D:\\image\\";
// 列出目录中所有的图片,都是jpg的,以1.jpg,2.jpg的方式,方便操作
File file = new File(imagesPath);
File[] flist = file.listFiles();
for (int i = 1; i <= flist.length; i++) {
IplImage image = opencv_imgcodecs.cvLoadImage(imagesPath + i + ".png"); // 非常吃内存!!
Frame frame = conveter.convert(image);
recorder.record(frame); // 录制
// 释放内存 非常吃内存!!
opencv_core.cvReleaseImage(image);
}
// ------------------->end 图片处理开始
// ------------------->begin 开始录制音频
String mp3Path = "D:\\music\\dome.mp3";
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(mp3Path);
grabber.start();// 开始录制音频
Frame audioSamples;
while ((audioSamples = grabber.grab()) != null) {
recorder.setTimestamp(grabber.getTimestamp()); // 告诉录制器这个audioSamples的音频时长
recorder.record(audioSamples); // 录入音频
}
// ------------------->end 开始录制音频
grabber.stop();
grabber.release();
recorder.stop();
recorder.release();
}
}
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //MP4格式设置成H264,才能在html上播放