zoukankan      html  css  js  c++  java
  • javacv 设置帧率(续)

    前文地址:https://www.cnblogs.com/svenwu/p/9663038.html

    前文已经对大多数正常情况可以支持了,但是我最近处理一些公司的视频流,发现一些坑爹的情况

    每次给的视频流帧率不一致,甚至帧率为每秒3帧。。。。

    以下代码只适合已经录制完成的视频格式,不适合实时视频流

    还是直接上源码

    原代码:

     1 /**
     2      * 按帧录制视频
     3      * 
     4      * @param inputFile-该地址可以是网络直播/录播地址,也可以是远程/本地文件路径
     5      * @param outputFile
     6      *            -该地址只能是文件地址,如果使用该方法推送流媒体服务器会报错,原因是没有设置编码格式
     7      * @throws FrameGrabber.Exception
     8      * @throws FrameRecorder.Exception
     9      * @throws org.bytedeco.javacv.FrameRecorder.Exception
    10      */
    11     public static void frameRecord(String inputFile, String outputFile, int audioChannel)
    12             throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
    13         
    14             boolean isStart=true;//该变量建议设置为全局控制变量,用于控制录制结束
    15         // 获取视频源
    16         FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
    17         // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
    18         FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
    19         // 开始取视频源
    20         recordByFrame(grabber, recorder, isStart);
    21     }
     1 private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
     2             throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
     3         try {//建议在线程中使用该方法
     4             grabber.start();
     5             recorder.start();
     6             Frame frame = null;
     7             while (status&& (frame = grabber.grabFrame()) != null) {
     8                 recorder.record(frame);
     9             }
    10             recorder.stop();
    11             grabber.stop();
    12         } finally {
    13             if (grabber != null) {
    14                 grabber.stop();
    15             }
    16         }
    17     }

    修改后代码:

     1 private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
     2             throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
     3         try {//建议在线程中使用该方法
     4             grabber.start();
     5             double frameLength = grabber.getLengthInFrames();
     6             long frameTime = grabber.getLengthInTime();
     7             recorder.setFrameRate(frameLength * 1000 * 1000/frameTime);
     8             recorder.start();
     9             Frame frame = null;
    10             while (status&& (frame = grabber.grabFrame()) != null) {
    11                 recorder.record(frame);
    12             }
    13             recorder.stop();
    14             grabber.stop();
    15         } finally {
    16             if (grabber != null) {
    17                 grabber.stop();
    18             }
    19         }
    20     }

    这里主要看第5-7行

    //表示视频的总图片数量
    double frameLength = grabber.getLengthInFrames();
    //表示视频总时长,这里单位是微妙,所以计算帧率时 要乘以 1000 * 1000
    long frameTime = grabber.getLengthInTime();
    帧率为 frameLength * 1000 * 1000 / frameTime 单位:帧/秒

    另外,
    1.获取这两个参数,必须要在grabber.start()以后
    2.只适合已经录制完成的视频格式,不适合实时视频流

    这样就能自适应的适配视频帧率了


    ===================================================================

    从这一刻开始努力也不晚,所以我决定留下我学习的痕迹

    ===================================================================

  • 相关阅读:
    qwebchannel.js
    锚点
    ECharts
    基于html2canvas实现网页保存为图片及图片清晰度优化
    JS判断某变量是否为某数组中的一个值的3种方法
    .on()之selector——jQuery
    Loading——spin.js
    理解CSS3 transform中的Matrix(矩阵)
    IOS中修改图片的大小:修改分辨率和裁剪
    IOS版本被拒的经历
  • 原文地址:https://www.cnblogs.com/svenwu/p/11044370.html
Copyright © 2011-2022 走看看