ffmepg入门学习八 java操作ffmepg实现(实景视频实现)

1.准备

  ffmpeg

链接:https://pan.baidu.com/s/1oh_36qFxnLW5Kmdf8F5eTQ 
提取码:rsdn 
复制这段内容后打开百度网盘手机App,操作更方便哦

ffmepg入门学习八 java操作ffmepg实现(实景视频实现)_第1张图片

2.通过ffmepg查看实景视频画面


   
   
   
   
  1. public void run() {
  2. ProcessBuilder builder = null;
  3. List commend = new ArrayList();
  4. commend. add( this.item.getOsName());
  5. //以本地帧频读数据,主要用于模拟捕获设备
  6. commend. add( "-re");
  7. commend. add( "-rtsp_transport");
  8. commend. add( "tcp");
  9. //解析错误的网络流时,会导致该函数长时间不返回。这里设置超时为5秒
  10. commend. add( "-stimeout");
  11. commend. add( "5000000");
  12. //输入您要处理的视频文件路径
  13. commend. add( "-i");
  14. commend. add( "rstpurl地址");
  15. commend. add( "-buffer_size");
  16. commend. add( "1024000000");
  17. //设置最大延时
  18. commend. add( "-max_delay");
  19. commend. add( "50000000");
  20. commend. add( "-codec:v");
  21. commend. add( "libx264");
  22. //指定截屏频率
  23. commend. add( "-r");
  24. commend. add( "25");
  25. commend. add( "-rtbufsize");
  26. commend. add( "10M");
  27. commend. add( "-s");
  28. // 指定分辨率
  29. commend. add( "1024*576");
  30. commend. add( "-map:v");
  31. commend. add( "0");
  32. //不使能音频纪录
  33. commend. add( "-an");
  34. //强迫采用格式hls
  35. commend. add( "-f");
  36. commend. add( "hls");
  37. //HLS播放的列表
  38. commend. add( "-hls_list_size");
  39. commend. add( "6");
  40. //表示为最大的TS循环数,也就是每10个一个循环
  41. commend. add( "-hls_wrap");
  42. commend. add( "10");
  43. //每片的长度
  44. commend. add( "-hls_time");
  45. commend. add( "10");
  46. commend. add( "-loglevel");
  47. commend. add( "8");
  48. commend. add( "D:/project/direct/40/camera.m3u8");
  49. try {
  50. builder = new ProcessBuilder(commend);
  51. builder.command(commend);
  52. Process p = builder.start();
  53. p.getOutputStream().close();
  54. doWaitFor(p);
  55. p.destroy();
  56. builder = null;
  57. this.doBusiness();
  58. } catch (Exception var7) {
  59. PrintCatchErrorMsg.Print(var7, "Direct", "run catch", "Exception");
  60. this.doBusiness();
  61. } finally {
  62. commend = null;
  63. }
  64. }

   
   
   
   
  1. public static int doWaitFor(Process p) {
  2. InputStream in = null;
  3. InputStream err = null;
  4. int exitValue = -1;
  5. try {
  6. in = p.getInputStream();
  7. err = p.getErrorStream();
  8. boolean finished = false;
  9. while(!finished) {
  10. try {
  11. Character c;
  12. while( in.available() > 0) {
  13. c = new Character(( char) in.read());
  14. System. out.print(c);
  15. }
  16. while(err.available() > 0) {
  17. c = new Character(( char)err.read());
  18. System. out.print(c);
  19. }
  20. exitValue = p.exitValue();
  21. finished = true;
  22. } catch (IllegalThreadStateException var19) {
  23. Thread.currentThread();
  24. Thread.sleep( 500L);
  25. }
  26. }
  27. } catch (Exception var20) {
  28. } finally {
  29. try {
  30. if ( in != null) {
  31. in.close();
  32. }
  33. } catch (IOException var18) {
  34. }
  35. if (err != null) {
  36. try {
  37. err.close();
  38. } catch (IOException var17) {
  39. }
  40. }
  41. }
  42. return exitValue;
  43. }

效果如下图所示: 

ffmepg入门学习八 java操作ffmepg实现(实景视频实现)_第2张图片

总结:

    通过上面的方式可以实现视频画面的显示,视频画面很清楚,没有掉帧问题,也很问题

    存在的问题:

           视频延迟30s左右,视频cpu开销大,对视频的ts切片进行视频分析,切片的大小也有考虑,官网说建议4s左右,发现少B祯,做了优化也没有什么用,如果有好的建议,欢迎下方留言,或者加群。

  前端部分参考https://blog.csdn.net/qq_16855077/article/details/89839708 4前端代码部分。注意因为文件在本地,如果其他的ip直接访问会有跨域的问题,这里为了方便,我是在nginx中配置勒跨域代码,和代理映射到本地的配置。

你可能感兴趣的:(FFmpeg音视频学习)