javacv之视频和音频的合并

当音频长度大于视频长度时:

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();
	}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用 javacv视频分离为音频视频,可以使用 FFmpegFrameGrabber 类来读取视频文件,然后使用 FFmpegFrameRecorder 类将音频视频分别输出为单独的文件。 下面是一个简单的代码示例: ```java import org.bytedeco.javacv.*; public class VideoSplitter { public static void main(String[] args) throws Exception { FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("input.mp4"); grabber.start(); FFmpegFrameRecorder audioRecorder = new FFmpegFrameRecorder("output_audio.mp3", grabber.getAudioChannels()); audioRecorder.setAudioCodec(avcodec.AV_CODEC_ID_MP3); audioRecorder.start(); FFmpegFrameRecorder videoRecorder = new FFmpegFrameRecorder("output_video.mp4", grabber.getImageWidth(), grabber.getImageHeight()); videoRecorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); videoRecorder.start(); Frame frame; while ((frame = grabber.grab()) != null) { if (frame.samples != null) { audioRecorder.record(frame); } else { videoRecorder.record(frame); } } grabber.stop(); audioRecorder.stop(); videoRecorder.stop(); } } ``` 在上面的示例中,我们首先创建了一个 FFmpegFrameGrabber 对象来读取视频文件。然后,我们创建了两个 FFmpegFrameRecorder 对象,一个用于输出音频文件,一个用于输出视频文件。我们使用 setAudioCodec() 和 setVideoCodec() 方法来设置音频视频编解码器。最后,我们循环读取视频文件中的每一帧,根据帧的类型将其写入对应的输出文件中。最后,我们停止读取器和记录器以完成分离操作。 需要注意的是,由于 javacv 依赖于 FFmpeg 库,因此需要正确配置 FFmpeg 的路径才能正常使用。具体配置方法可以参考 javacv 的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值