package org.springblade.jfpt.rvideo.controller;
|
import org.bytedeco.javacpp.avcodec;
|
import org.bytedeco.javacv.*;
|
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
public class RecordVideoThread implements Runnable {
|
public String streamURL;// 流地址(测试可以用obs推流)
|
public String filePath;// 文件路径
|
public Long timesSec = 100L;// 停止录制时长 0为不限制时长
|
public String fileFormat = "mp4";//录制的文件格式
|
public boolean isAudio = false;//是否录制声音
|
|
public void setStreamURL(String streamURL) {
|
this.streamURL = streamURL;
|
}
|
|
public void setFilePath(String filePath) {
|
this.filePath = filePath;
|
}
|
|
@Override
|
public void run() {
|
System.out.println(streamURL);
|
// 获取视频源
|
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(streamURL);
|
FFmpegFrameRecorder recorder = null;
|
try {
|
grabber.start();
|
Frame frame = grabber.grabFrame();
|
createFile();
|
//"rtmp://192.168.1.225:1935/live/home"
|
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
|
recorder = new FFmpegFrameRecorder(filePath, 1280, 720, isAudio ? 1 : 0);
|
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
|
recorder.setFormat(fileFormat);// 录制的视频格式
|
recorder.setFrameRate(25);// 帧数
|
//百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
|
recorder.setVideoBitrate(800000);
|
recorder.start();
|
System.out.println("推流开始");
|
// new Thread(new Runnable() {
|
// @Override
|
// public void run() {
|
// RecordVideoThread thread = new RecordVideoThread();
|
// thread.pushVideoAsRTSP(1, null);
|
// }
|
// }).start();
|
// 计算结束时间
|
//long endTime = System.currentTimeMillis() + timesSec * 1000;
|
// 如果没有到录制结束时间并且获取到了下一帧则继续录制
|
while (frame != null) {
|
System.out.println("开始");
|
recorder.record(frame);//录制
|
frame = grabber.grabFrame();//获取下一帧
|
System.out.println("结束");
|
}
|
recorder.record(frame);
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
//停止录制
|
if (null != grabber) {
|
try {
|
grabber.stop();
|
} catch (FrameGrabber.Exception e) {
|
e.printStackTrace();
|
}
|
}
|
if (recorder != null) {
|
try {
|
recorder.stop();
|
} catch (FrameRecorder.Exception e) {
|
e.printStackTrace();
|
}
|
}
|
System.out.println("录制完成,录制时长:" + timesSec + "秒");
|
}
|
}
|
|
private void createFile() {
|
File outFile = new File(filePath);
|
if (filePath.isEmpty() || !outFile.exists() || outFile.isFile()) {
|
try {
|
outFile.createNewFile();
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
}
|
}
|
|
}
|
}
|