欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

合并多个视频的JavaCV教程

最编程 2024-08-03 18:31:31
...
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();
	}