根据视频直播流获取一个视频下载到本地
视频流为一段视频流,比如直播的历史数据,我们获取的是摄像头的历史数据
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import com.tlzn.tkwl.util.StringUtil;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
public class VideoDownloader {
private static final int NUM_OF_FRAMES = 5; // 指定需要截取几张图片
private static final double FRAME_RATE = 30.0; // 视频帧率
private static final Dimension FRAME_SIZE = new Dimension(1280, 720); // 视频大小
public static void download(String url, String outputPath) {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, FRAME_SIZE.width, FRAME_SIZE.height);
Java2DFrameConverter converter = new Java2DFrameConverter();
grabber.setOption("stimeout", "3000");
grabber.setOption("timeout", "5000000"); //设置超时时间 5秒
try {
// 开始拉取视频
grabber.start();
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); // 设置转换后的视频格式为MP4
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.setAudioQuality(0); // 可选,设置音频质量
recorder.setSampleRate(44100); // 可选,设置音频采样率
recorder.setAudioChannels(2); // 可选,设置音频通道数量
recorder.setFrameRate(FRAME_RATE);
recorder.start();
Frame frame = grabber.grabFrame();
// 循环拉取视频,并逐帧转换
for (int i = 0; ; i++) {
if (StringUtil.isEmptyObject(frame)) { // 如果获取失败,表示视频播放结束或者发生了错误
break;
}
BufferedImage bufferedImage = converter.getBufferedImage(frame);
// 将当前帧写入文件
recorder.record(frame);
// 主动gc释放
System.gc();
frame = grabber.grabFrame(); // 获取下一帧图像
if (StringUtil.isEmptyObject(grabber.grabFrame())||StringUtil.isEmptyObject(frame)) { // 如果获取失败,表示视频播放结束或者发生了错误
break;
}
}
recorder.stop();
grabber.stop();
System.out.println("视频拉取成功,已保存至:" + outputPath);
} catch (Exception e) {
System.err.println("视频拉取失败:" + e.getMessage());
}
}
public static void main(String[] args) {
// 在需要调用的地方执行以下代码:
String url = "https://fsacam.0.flv"; // 视频流地址
String outputPath = "C:\\Users\\dell-pc\\Desktop\\aaaaaaaaaaaa\\output.mp4"; // 指定输出路径
VideoDownloader.download(url, outputPath);
}
}