javacv裁剪视频如何保证音画同步
音画不同步的原因
FFmpegFrameGrabber#grab迭代出来的帧有多种类型,但只有相同类型的帧是按照时间有序输出。
例如 迭代前50帧可能都是audio帧,第51帧输出了第一个video帧
下面代码就有可能出现音画不同步;
Frame frame;
while ((frame = grabber.grab()) != null) {
if (grabber.getTimestamp() >= (end * 1000000L)) {
// 裁剪到指定时间戳
break;
}
fFmpegFrameRecorder.record(frame);
}
通常来说音频解析的速度比视频帧快非常多,所以可能出现结尾画面不动但音频正常的情况
解决思路
分别提取音频与视频帧
// 读取指定帧
Frame frame;
// 提取视频帧
grabber.setTimestamp(sta * 1000000);
while ((frame = grabber.grabImage()) != null) {
if (grabber.getTimestamp() >= (end * 1000000L)) {
// 裁剪到指定时间戳
break;
}
fFmpegFrameRecorder.record(frame);
}
// 提取音频帧
grabber.setTimestamp(sta * 1000000);
while ((frame = grabber.grabSamples()) != null) {
if (grabber.getTimestamp() >= (end * 1000000L)) {
// 裁剪到指定时间戳
break;
}
fFmpegFrameRecorder.record(frame);
}

浙公网安备 33010602011771号