为什么我使用javacv 的 切片设置的是10秒 第二个开始后每个视频都会叠加10秒?
package com.alex.test;
import javax.swing.JFrame;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameFilter;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameRecorder.Exception;
/**
* 视频切片制作
*
* @author eguid
*/
public class SegmentVideoRecorder {
/**
*
* @param input 输入流或者对应文件
* @param output 输出流或者对应文件
* @param segmentTime 对应分段
* @param width 宽
* @param height 高
* @param frameRate 码率
* @param filterContent 过滤主题(后面有机会说)
* @return
* @throws Exception
*/
public static boolean recordSegment(String input, String output, Integer segmentTime, Integer width, Integer height,
Integer frameRate, String filterContent) {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(input);
try {
grabber.start();
if (width == null || height == null) {
width = grabber.getImageWidth();
height = grabber.getImageHeight();
}
// 是否录制音频(0:不录制/1:录制)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, width, height, 1);
recorder.setFormat("segment");
recorder.setOption("segment_time", segmentTime.toString());
recorder.setOption("segment_list_flags", "live");
recorder.setOption("segment_atclocktime", "1");
recorder.setOption("break_non_keyframes", "1");
recorder(grabber, recorder, segmentTime, width, height, frameRate, filterContent);
} catch (org.bytedeco.javacv.FrameGrabber.Exception | Exception | org.bytedeco.javacv.FrameFilter.Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 录像核心
*
* @param grabber
* @param recorder
* @param segmentTime
* @param width
* @param height
* @param frameRate
* @param filterContent
* @throws org.bytedeco.javacv.FFmpegFrameFilter.Exception
* @throws org.bytedeco.javacv.FrameFilter.Exception
* @throws org.bytedeco.javacv.FrameGrabber.Exception
*/
public static void recorder(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Integer segmentTime,
Integer width, Integer height, Integer frameRate, String filterContent)
throws Exception, org.bytedeco.javacv.FrameFilter.Exception, org.bytedeco.javacv.FrameGrabber.Exception {
//// //默认10秒生成一个文件
// if (segmentTime == null) {
// segmentTime = 10;
// }
// if (frameRate == null) {
// frameRate = 25;
// }
// 生成模式:live(实时生成)
//
// 设置帧率
recorder.setFrameRate(grabber.getFrameRate());
// 设置gop
// recorder.setGopSize((int)(grabber.getFrameRate() * segmentTime));
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.setAudioBitrate(grabber.getAudioBitrate());
// 这种方式也可以
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// 设置音频编码
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start();
FFmpegFrameFilter filter = null;
// if(StringUtils.hasLength(filterContent)) {
// // filter= RecorderLogoUtils.overlayChar(filterContent, grabber);
// }
Frame frame;
// grab 混合帧。
for (; (frame = grabber.grab()) != null;) {
try {
if (filter != null) {
// 把数据放到filter里面
filter.push(frame);
// 取出过滤器合并后的图像
Frame filterFrame = filter.pull();
recorder.record(filterFrame);
} else {
// 录制/推流
recorder.record(frame);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// if(filter != null) {
// filter.close();
// }
recorder.close();// close包含stop和release方法。录制文件必须保证最后执行stop()方法,才能保证文件头写入完整,否则文件损坏。
grabber.close();// close包含stop和release方法
}
public static void main(String[] args) {
String input = "E:\\视频采集工具\\作品保存\\作者作品\\龙帅食堂\\2022年\\第2季度\\7091152418955693342-哇塞!青苔战斧牛排?复刻高级餐厅的招牌!香草脆皮战斧牛排味道怎么样?把春天留住 方太蒸烤烹饪机.mp4";
String output = "E:\\视频采集工具\\作品保存\\作者作品\\龙帅食堂\\2022年\\第2季度\\output\\eguid%03d.mp4";
recordSegment(input, output, 10, null, null, null, null);
}
}
来点积分