• javacv 通过rtsp 获取视频流 设置帧率


    原文章:https://blog.csdn.net/eguid_1/article/details/52680802

    原代码:

     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 public static void main(String[] args)
    2             throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException {
    3  
    4          String inputFile = "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0";
    5          // Decodes-encodes
    6          String outputFile = "recorde.mp4";
    7          frameRecord(inputFile, outputFile,1);
    8 }

    这时候已经完全可以run了

    但是发现视频播放的速度非常的快,研究后发现是帧率设置的问题

    修改后代码:

     1     public void frameRecord(String inputFile, String outputFile, int audioChannel) throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
     2 
     3         boolean isStart = true;// 该变量建议设置为全局控制变量,用于控制录制结束
     4         // 获取视频源
     5         FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
     6         grabber.setOption("rtsp_transport","tcp");
     7         grabber.setFrameRate(30);
     8         grabber.setVideoBitrate(3000000);
     9         // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
    10         FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720,audioChannel);
    11         recorder.setFrameRate(30);
    12         recorder.setVideoBitrate(3000000);
    13         recordByFrame(grabber, recorder, isStart);
    14     }

    这里主要看第7行和第11行

    我原来一直在修改recorder的帧率等参数,后来发现grabber(获取流)也需要设置帧率参数

    修改后完美解决~~

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

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

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

  • 相关阅读:
    大道至简 读后感01
    《人月神话》读后感
    水王继续
    软工大作业DB天气项目风险评估
    自我调查 使用输入法
    课堂练习之找“水王”
    浪潮之巅阅读笔记之三
    浪潮之巅阅读笔记之二
    浪潮之巅阅读笔记之一
    课程改进意见
  • 原文地址:https://www.cnblogs.com/svenwu/p/9663038.html
Copyright © 2020-2023  润新知