java操作ffmepg实现
1.准备
ffmpeg
链接:https://pan.baidu.com/s/1oh_36qFxnLW5Kmdf8F5eTQ
提取码:rsdn
复制这段内容后打开百度网盘手机App,操作更方便哦
2.通过ffmepg查看实景视频画面
public void run() {
ProcessBuilder builder = null;
List commend = new ArrayList();
commend.add(this.item.getOsName());
//以本地帧频读数据,主要用于模拟捕获设备
commend.add("-re");
commend.add("-rtsp_transport");
commend.add("tcp");
//解析错误的网络流时,会导致该函数长时间不返回。这里设置超时为5秒
commend.add("-stimeout");
commend.add("5000000");
//输入您要处理的视频文件路径
commend.add("-i");
commend.add("rstpurl地址");
commend.add("-buffer_size");
commend.add("1024000000");
//设置最大延时
commend.add("-max_delay");
commend.add("50000000");
commend.add("-codec:v");
commend.add("libx264");
//指定截屏频率
commend.add("-r");
commend.add("25");
commend.add("-rtbufsize");
commend.add("10M");
commend.add("-s");
// 指定分辨率
commend.add("1024*576");
commend.add("-map:v");
commend.add("0");
//不使能音频纪录
commend.add("-an");
//强迫采用格式hls
commend.add("-f");
commend.add("hls");
//HLS播放的列表
commend.add("-hls_list_size");
commend.add("6");
//表示为最大的TS循环数,也就是每10个一个循环
commend.add("-hls_wrap");
commend.add("10");
//每片的长度
commend.add("-hls_time");
commend.add("10");
commend.add("-loglevel");
commend.add("8");
commend.add("D:/project/direct/40/camera.m3u8");
try {
builder = new ProcessBuilder(commend);
builder.command(commend);
Process p = builder.start();
p.getOutputStream().close();
doWaitFor(p);
p.destroy();
builder = null;
this.doBusiness();
} catch (Exception var7) {
PrintCatchErrorMsg.Print(var7, "Direct", "run catch", "Exception");
this.doBusiness();
} finally {
commend = null;
}
}
public static int doWaitFor(Process p) {
InputStream in = null;
InputStream err = null;
int exitValue = -1;
try {
in = p.getInputStream();
err = p.getErrorStream();
boolean finished = false;
while(!finished) {
try {
Character c;
while(in.available() > 0) {
c = new Character((char)in.read());
System.out.print(c);
}
while(err.available() > 0) {
c = new Character((char)err.read());
System.out.print(c);
}
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException var19) {
Thread.currentThread();
Thread.sleep(500L);
}
}
} catch (Exception var20) {
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException var18) {
}
if (err != null) {
try {
err.close();
} catch (IOException var17) {
}
}
}
return exitValue;
}
效果如下图所示:
总结:
通过上面的方式可以实现视频画面的显示,视频画面很清楚,没有掉帧问题,也很问题
存在的问题:
视频延迟30s左右,视频cpu开销大,对视频的ts切片进行视频分析,切片的大小也有考虑,官网说建议4s左右,发现少B祯,做了优化也没有什么用,如果有好的建议,欢迎下方留言,或者加群。
前端部分参考https://blog.****.net/qq_16855077/article/details/89839708 4前端代码部分。注意因为文件在本地,如果其他的ip直接访问会有跨域的问题,这里为了方便,我是在nginx中配置勒跨域代码,和代理映射到本地的配置。
点击链接加入群聊【java交流群】:https://jq.qq.com/?_wv=1027&k=5VZxg3k