import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
/**
* 多个视频的合并
* @param videoAddrSet 地址集合
* @param output 合并后的视频输出地址
*/
public static void videoMerge(Set<String> videoAddrSet, String output)
throws org.bytedeco.javacv.FrameRecorder.Exception, org.bytedeco.javacv.FrameGrabber.Exception {
List<String> videoList=new ArrayList<>(videoAddrSet);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoList.get(0));
grabber.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getImageWidth(),
grabber.getImageHeight(), 0);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// recorder.setAudioChannels(1);
// recorder.setInterleaved(true);
recorder.setFormat("mp4");
recorder.setFrameRate(grabber.getFrameRate());
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // yuv420p
int bitrate = grabber.getVideoBitrate();
if (bitrate == 0) {
bitrate = grabber.getAudioBitrate();
}
recorder.setVideoBitrate(bitrate);
recorder.start();
Frame frame = null;
for (; (frame = grabber.grabImage()) != null;) {
// 封装/复用
recorder.record(frame);
}
for(int i=1;i<videoList.size();i++) {
FFmpegFrameGrabber grabberTemp = new FFmpegFrameGrabber(videoList.get(i));
grabberTemp.start();
for (; (frame = grabberTemp.grabImage()) != null;) {
// 封装/复用
recorder.record(frame);
}
grabberTemp.close();
}
recorder.close();
grabber.close();
}
版权声明:本文为Dug_Zhang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。