欢迎来到淼淼之森的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp或rtmp视频文件(基于javaCV-FFMPEG)

  |   0 评论   |   0 浏览

引入依赖

<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.3</version>
        </dependency>

代码实现

package com.java.mmzsblog;
 
import org.bytedeco.javacv.*;
 
/**
 * @author :created by mmzsblog.cn
 * @description:javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)
 * @date :created at 2020/07/07 10:57
 */
public class FrameRecord {
    public static void main(String[] args)
            throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException {
 
//        String inputFile = "rtsp://admin:admin@192.168.0.236:1935/cam/realmonitor?channel=1&subtype=0";
//        String inputFile = "rtmp://192.168.0.236:1935/live/1256";
        String inputFile = "rtmp://192.168.0.14:1935/live/888";
 
        // Decodes-encodes
        String outputFile = "d:/recorde.mp4";
        try {
            FrameRecord frame = new FrameRecord();
            frame.frameRecord(inputFile, outputFile, 1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
 
    /**
     * 按帧录制视频
     *
     * description: 如果获取到的视频流有卡顿? 则要分析视频源,如果视频源本身没有卡顿的话,可以结合视频源的刷新率,考虑提高grabber的帧率,同时提高recorder的帧率。如果视频源本身就有卡顿话,那就需要另外想办法解决视频源卡顿的问题。
     * @param inputFile   -该地址可以是网络直播/录播地址,也可以是远程/本地文件路径
     * @param outputFile  -该地址只能是文件地址,如果使用该方法推送流媒体服务器会报错,原因是没有设置编码格式
     * @throws FrameGrabber.Exception
     * @throws FrameRecorder.Exception
     * @throws org.bytedeco.javacv.FrameRecorder.Exception
     */
    public void frameRecord(String inputFile, String outputFile, int audioChannel)
            throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
 
        boolean isStart = true;//该变量建议设置为全局控制变量,用于控制录制结束
        // 获取视频源
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
        // 获取流设置帧率参数
        grabber.setOption("rtsp_transport", "tcp");
        grabber.setFrameRate(30);
        grabber.setVideoBitrate(3000000);
 
        // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
        // 输出流设置帧率参数
        recorder.setFrameRate(30);
        recorder.setVideoBitrate(3000000);
        // 停止取视频源
//        stopRecordByFrame(isStart);
        // 开始取视频源
        recordByFrame(grabber, recorder, isStart);
    }
 
    /**
     * 保存视频源到本地
     * @param grabber
     * @param recorder
     * @param status
     * @throws Exception
     * @throws org.bytedeco.javacv.FrameRecorder.Exception
     */
    private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
            throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
        try {
            // 用来标记控制
            int i = -2999;
 
            //建议在线程中使用该方法
            grabber.start();
            recorder.start();
            Frame frame = null;
            while (status && (frame = grabber.grabFrame()) != null) {
                recorder.record(frame);
 
                // 停止录制,此处方式过于简陋;读者可自行修改,比如线程控制之类的
                if (i++ > 2999) {
                    status = false;
                }
 
            }
            recorder.stop();
            grabber.stop();
        } finally {
            if (grabber != null) {
                grabber.stop();
            }
        }
    }
}

标题:javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp或rtmp视频文件(基于javaCV-FFMPEG)
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2020/09/08/1599546092381.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜 Java 学习之道