Monica视频监控处理程序
xc
2021-02-22 fa92d56ae9d27343df39c92b799f727c11f090b6
补充Monica API
6 files modified
1 files added
318 ■■■■■ changed files
README.md 5 ●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/controller/api/MonibucaAPI.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/dto/StreamDto.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/manager/MonibucaManager.java 51 ●●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/manager/impl/MonibucaManagerImpl.java 191 ●●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/utils/HttpClientUtil.java 46 ●●●●● patch | view | raw | blame | history
src/main/resources/application.properties 3 ●●●● patch | view | raw | blame | history
README.md
@@ -7,6 +7,7 @@
#### 准备工作
- 运行Monica实例机器IP
- application.properties 必须配置: monica.ip , monica.port
(monica.ip 是monica运行实例所在机器的IP)
#### 已有功能
- 将rtsp流转换成 HLS,WebRTC,FLV.js,Jessibuca 并进行H5播放
@@ -16,10 +17,6 @@
1. 启动 com.hbbh.adapter.AdapterApplication 
2. 访问 http://localhost:8088/public/index.html
#### 目前还存在的已知一些问题
#### 环境介绍
#### 项目部署可能会涉及到Linux命令
src/main/java/com/hbbh/adapter/controller/api/MonibucaAPI.java
@@ -15,7 +15,7 @@
    public String parseVideoRTSP();
    /**
     * 中止已经产生的视频流
     * 删除发布流
     * @param param streamPath地址
     */
    public void stopStream(String param);
src/main/java/com/hbbh/adapter/dto/StreamDto.java
New file
@@ -0,0 +1,20 @@
package com.hbbh.adapter.dto;
import com.sun.istack.NotNull;
import lombok.Data;
import java.io.Serializable;
@Data
public class StreamDto implements Serializable {
    /**
     *  推流的地址
     */
    private String target;
    /**
     * StreamPath 是发布流的唯一标识,我们可以把它理解为网页的 url ,它是流传输服务中的 url 。你要发布一个流,就需要一个 StreamPath ,这里类比后端服务的发布,需要 ip 和对外暴露的端口一起组成一个 url 。
     */
    private String streamPath;
}
src/main/java/com/hbbh/adapter/manager/MonibucaManager.java
@@ -1,7 +1,16 @@
package com.hbbh.adapter.manager;
import com.hbbh.adapter.dto.StreamDto;
import com.hbbh.adapter.vo.CallResult;
import java.util.List;
/**
 * 基于monica监控封装接口
 *
 * 这里接口实现 请参考 Monibuca API 文档
 * https://www.yuque.com/docs/share/446ab7fa-2a25-411e-940f-1ba5252bd11b
 */
public interface MonibucaManager {
    /**
@@ -23,7 +32,49 @@
    String parseVideo();
    /**
     * 删除发布流
     * @param param StreamPath 是发布流的唯一标识
     */
    void stopStream(String param);
    /**
     * 推流
     * @param param 推流入参
     */
    void pullStream(StreamDto param);
    /**
     * 批量推流
     * @param params 推流入参
     */
    void pullStreamList(List<StreamDto> params);
    /**
     * 实例依赖更新
     * @param param Monica启动实例名称
     */
    void instanceUpdate(String param);
    /**
     * 删除实例
     * @param param Monica启动实例名称
     */
    void instanceRemove(String param);
    /**
     * 关闭实例
     * @param param Monica启动实例名称
     */
    void instanceKill(String param);
    /**
     * 启动实例
     * @param param Monica启动实例名称
     */
    void instanceStart(String param);
    /**
     * 创建实例
     */
    void instanceCreate();
}
src/main/java/com/hbbh/adapter/manager/impl/MonibucaManagerImpl.java
@@ -2,17 +2,16 @@
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import com.hbbh.adapter.dto.StreamDto;
import com.hbbh.adapter.manager.MonibucaManager;
import com.hbbh.adapter.utils.HttpClientUtil;
import com.hbbh.adapter.vo.CallResult;
import com.hbbh.adapter.vo.MessageVO;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -26,6 +25,8 @@
    private String monicaIP;
    @Value("${monica.port}")
    private String monicaPort;
    @Value("${monica.rtsp.port}")
    private String monicaRTSPPort;
    //入参 rtsp视频流
@@ -72,10 +73,190 @@
     */
    @Override
    public void stopStream(String param) {
        String url="http://"+monicaIP+":"+monicaPort+"/api/stop";
        String url="http://"+monicaIP+":"+monicaRTSPPort+"/api/stop";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("stream",param);
        String result = HttpClientUtil.doGet(url, params);
        log.info("调用 Monibuca 执行结果 : {}",result);
        log.info("调用 Monibuca -stopStream- 执行结果 : {}",result);
    }
    /**
     * GET
     * @param param 推流入参
     */
    @Override
    public void pullStream(StreamDto param) {
        String url="http://"+monicaIP+":"+monicaRTSPPort+"/rtsp/pull";
        Map<String, String> params = Maps.newLinkedHashMap();
        String streamPath = param.getStreamPath();
        String target = param.getTarget();
        params.put("target",target);
        params.put("streamPath",streamPath);
        String result = HttpClientUtil.doGet(url, params);
        log.info("调用 Monibuca -pullStream- 执行结果 : {}",result);
    }
    /**
     * GET
     * @param params 推流入参
     */
    @Override
    public void pullStreamList(List<StreamDto> params) {
        String url="http://"+monicaIP+":"+monicaRTSPPort+"/rtsp/pull";
        for (StreamDto param : params) {
            Map<String, String> paramMap = Maps.newLinkedHashMap();
            String streamPath = param.getStreamPath();
            String target = param.getTarget();
            paramMap.put("target",target);
            paramMap.put("streamPath",streamPath);
            String result = HttpClientUtil.doGet(url, paramMap);
            log.info("调用 Monibuca -pullStreamList- streamPath:{}   执行结果 : {}",streamPath,result);
        }
    }
    /**
     * GET
     * @param param Monica启动实例名称
     */
    @Override
    public void instanceUpdate(String param) {
        String url="http://"+monicaIP+":"+monicaPort+"/api/instance/update";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("name",param);
        String result = HttpClientUtil.doGet(url, params);
        log.info("调用 Monibuca -instanceUpdate- 执行结果 : {}",result);
    }
    /**
     * DELETE
     * @param param Monica启动实例名称
     */
    @Override
    public void instanceRemove(String param) {
        String url="http://"+monicaIP+":"+monicaPort+"/api/instance/remove";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("name",param);
        String result = HttpClientUtil.doDelete(url, params);
        log.info("调用 Monibuca -instanceRemove- 执行结果 : {}",result);
    }
    /**
     * POST
     * @param param Monica启动实例名称
     */
    @Override
    public void instanceKill(String param) {
        String url="http://"+monicaIP+":"+monicaPort+"/api/instance/kill";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("name",param);
        String result = HttpClientUtil.doPost(url, params);
        log.info("调用 Monibuca -instanceKill- 执行结果 : {}",result);
    }
    /**
     * POST
     * @param param Monica启动实例名称
     */
    @Override
    public void instanceStart(String param) {
        String url="http://"+monicaIP+":"+monicaPort+"/api/instance/start";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("name",param);
        String result = HttpClientUtil.doPost(url, params);
        log.info("调用 Monibuca -instanceStart- 执行结果 : {}",result);
    }
    @Override
    public void instanceCreate() {
        String url="http://"+monicaIP+":"+monicaPort+"/api/instance/create";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("path","/Users/xucheng/Downloads/store/live");
        params.put("name","live");
        params.put("info",info);
        params.put("clear","true");
        String result = HttpClientUtil.doGet(url, params);
        log.info("调用 Monibuca -instanceCreate- 执行结果 : {}",result);
    }
    private String info="[Monibuca]\n" +
            "# 是否等待流,如果为true则订阅一个尚未发布的流会进入等待发布的状态,否则返回订阅失败\n" +
            "EnableWaitStream = true\n" +
            "EnableAudio = true\n" +
            "EnableVideo = true\n" +
            "# 缓冲环大小默认是2的10次方\n" +
            "RingSize = 10\n" +
            "# 发布流默认过期时间 1分钟\n" +
            "PublishTimeout = 60000000000\n" +
            "[RTMP]\n" +
            "ListenAddr = \":1935\"\n" +
            "[GateWay]\n" +
            "ListenAddr = \":8081\"\n" +
            "[Jessica]\n" +
            "ListenAddr = \":8080\"\n" +
            "[LogRotate]\n" +
            "# 日志存储目录相对或绝对\n" +
            "Path = \"logs\"\n" +
            "# 日志是否按大小分割,0表示不按大小分割,非零代表按该大小字节进行分割\n" +
            "Size = 0\n" +
            "Days = 1\n" +
            "[Cluster]\n" +
            "# 监听端口代表该服务器为源服务器\n" +
            "ListenAddr = \":2019\"\n" +
            "# 源服务器地址,用于向源服务器进行推或拉流\n" +
            "OriginServer = \"\"\n" +
            "# 推送模式,true表示如果此服务器有发布流,就会推送到源服务器,否则表示拉模式,即如果此服务器有订阅流则从源服务器拉流\n" +
            "Push = true\n" +
            "[HLS]\n" +
            "# 是否开启写磁盘,开启后侦测到发布流就会开始写TS文件\n" +
            "EnableWrite = false\n" +
            "# 是否打开内存模式,在内存中保留TS数据,方便直接读取\n" +
            "EnableMemory = false\n" +
            "# 分片大小 单位秒\n" +
            "Fragment = 10\n" +
            "# 窗口数里,代表一个m3u8文件里面有几个ts\n" +
            "Window = 2\n" +
            "# ts文件存放目录,m3u8会存放在上一级\n" +
            "Path = \"resource\"\n" +
            "[HDL]\n" +
            "ListenAddr = \":2020\"\n" +
            "[TS]\n" +
            "# 是否自动发布,开启后一旦有订阅流就会读取ts文件进行发布,方便测试\n" +
            "AutoPublish = false\n" +
            "# ts存放目录\n" +
            "Path  = \"resource\"\n" +
            "[Record]\n" +
            "Path = \"resource\"\n" +
            "# 是否自动发布,开启后一旦有订阅流就会读取flv文件进行发布,方便测试\n" +
            "AutoPublish = false\n" +
            "# 自动录制功能\n" +
            "AutoRecord  = false\n" +
            "[RTSP]\n" +
            "ListenAddr = \":554\"\n" +
            "AutoPull = true\n" +
            "Reconnect = true\n" +
            "RemoteAddr = \"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov\"\n" +
            "StreamPath = \"live/rtsp\"\n" +
            "#[[RTSP.AutoPullList]]\n" +
            "#URL = \"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov\"\n" +
            "#StreamPath = \"live/rtsp2\"\n" +
            "[WebRTC]\n" +
            "# 公网IP地址\n" +
            "PublicIP = [\"127.0.0.1\"]\n" +
            "# 端口范围不配置的话是自动分配\n" +
            "# PortMin = 30000\n" +
            "# PortMax = 40000\n" +
            "[GB28181]\n" +
            "Serial = \"34020000002000000001\"\n" +
            "Realm = \"3402000000\"\n" +
            "Expires = 3600\n" +
            "AutoInvite = false\n" +
            "ListenAddr = \"192.168.1.120:5060\"";
}
src/main/java/com/hbbh/adapter/utils/HttpClientUtil.java
@@ -3,6 +3,7 @@
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
@@ -17,8 +18,11 @@
import java.util.List;
import java.util.Map;
//httpclientutil 工具类
/**
 * httpclientutil 工具类
 */
public class HttpClientUtil {
    public static String doGet(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -59,6 +63,46 @@
        return resultString;
    }
    public static String doDelete(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();
            // 创建 http DELETE 请求
            HttpDelete httpDelete = new HttpDelete(uri);
            // 执行请求
            response = httpclient.execute(httpDelete);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }
    public static String doGet(String url) {
        return doGet(url, null);
    }
src/main/resources/application.properties
@@ -45,4 +45,5 @@
#Monibuca info
monica.ip=localhost
monica.port=8081
monica.port=3000
monica.rtsp.port=8081