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);
}
posted @ 2025-07-11 10:33  看她闹~  阅读(18)  评论(0)    收藏  举报