《ffmepg入门学习》 八 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.csdn.net/qq_16855077/article/details/89839708 4前端代码部分。注意因为文件在本地,如果其他的ip直接访问会有跨域的问题,这里为了方便,我是在nginx中配置勒跨域代码,和代理映射到本地的配置。

点击链接加入群聊【java交流群】:https://jq.qq.com/?_wv=1027&k=5VZxg3k

 

你可能感兴趣的:(FFmpeg视频处理入门学习)