ffmpeg
链接:https://pan.baidu.com/s/1oh_36qFxnLW5Kmdf8F5eTQ
提取码:rsdn
复制这段内容后打开百度网盘手机App,操作更方便哦
-
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.csdn.net/qq_16855077/article/details/89839708 4前端代码部分。注意因为文件在本地,如果其他的ip直接访问会有跨域的问题,这里为了方便,我是在nginx中配置勒跨域代码,和代理映射到本地的配置。