当音频长度大于视频长度时:
import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameRecorder.Exception;
public static void testAudioMornThanVideo(String videoInput, String audioInput, String outputPath)
throws org.bytedeco.javacv.FrameRecorder.Exception, org.bytedeco.javacv.FrameGrabber.Exception {
FFmpegFrameGrabber imageGrabber = new FFmpegFrameGrabber(videoInput);
imageGrabber.start();
FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(audioInput);
audioGrabber.start();
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:单声道/1:立体声)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, imageGrabber.getImageWidth(),
imageGrabber.getImageHeight(), 1);
recorder.setInterleaved(true);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.start(imageGrabber.getFormatContext());
long videoTime = imageGrabber.getLengthInTime();
AVPacket packet = null;
// 解封装/解复用
for (; (packet = imageGrabber.grabPacket()) != null;) {
// 封装/复用
recorder.recordPacket(packet);
}
// 解封装/解复用
Frame sampleFrame = null;
while ((sampleFrame = audioGrabber.grabSamples()) != null) {
recorder.record(sampleFrame);
if (audioGrabber.getTimestamp() >= videoTime) {
break;
}
}
recorder.close();
audioGrabber.close();
imageGrabber.close();
}
当视频长度大于音频长度时:
import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameRecorder.Exception;
public static void testVideoMornThanAudio(String videoInput, String audioInput, String outputPath)
throws org.bytedeco.javacv.FrameRecorder.Exception, org.bytedeco.javacv.FrameGrabber.Exception {
FFmpegFrameGrabber imageGrabber = new FFmpegFrameGrabber(videoInput);
imageGrabber.start();
FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(audioInput);
audioGrabber.start();
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:单声道/1:立体声)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, imageGrabber.getImageWidth(),
imageGrabber.getImageHeight(), 1);
recorder.setInterleaved(true);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.start(imageGrabber.getFormatContext());
long videoTime = imageGrabber.getLengthInTime();
AVPacket packet = null;
// 解封装/解复用
for (; (packet = imageGrabber.grabPacket()) != null;) {
// 封装/复用
recorder.recordPacket(packet);
}
long audioPlayTime = 0L;
Frame sampleFrame = null;
while ((sampleFrame = audioGrabber.grabSamples()) != null || audioPlayTime < videoTime) {
if (null == sampleFrame) {
audioGrabber.restart();// 重新开始
sampleFrame = audioGrabber.grabSamples();
videoTime -= audioPlayTime;
}
recorder.record(sampleFrame);
audioPlayTime = audioGrabber.getTimestamp();
if (audioPlayTime >= videoTime) {
break;
}
}
recorder.close();
audioGrabber.close();
imageGrabber.close();
}