panlinlin
2021-04-15 937e59143004b11a808eb93eb894ffe53871a19a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package com.genersoft.iot.vmp.media.zlm;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
import java.io.IOException;
import java.net.ConnectException;
import java.util.HashMap;
import java.util.Map;
 
@Component
public class ZLMRESTfulUtils {
 
    private final static Logger logger = LoggerFactory.getLogger(ZLMRESTfulUtils.class);
 
    @Value("${media.ip}")
    private String mediaIp;
 
    @Value("${media.port}")
    private int mediaPort;
 
    @Value("${media.secret}")
    private String mediaSecret;
 
    public interface RequestCallback{
        void run(JSONObject response);
    }
 
    public JSONObject sendPost(String api, Map<String, Object> param, RequestCallback callback) {
        OkHttpClient client = new OkHttpClient();
        String url = String.format("http://%s:%s/index/api/%s",  mediaIp, mediaPort, api);
        JSONObject responseJSON = null;
        logger.debug(url);
 
        FormBody.Builder builder = new FormBody.Builder();
        builder.add("secret",mediaSecret);
        if (param != null) {
            for (String key : param.keySet()){
                builder.add(key, param.get(key).toString());
            }
        }
 
        FormBody body = builder.build();
 
        Request request = new Request.Builder()
                .post(body)
                .url(url)
                .build();
            if (callback == null) {
                try {
                    Response response = client.newCall(request).execute();
                    if (response.isSuccessful()) {
                        String responseStr = response.body().string();
                        if (responseStr != null) {
                            responseJSON = JSON.parseObject(responseStr);
                        }
                    }
                } catch (ConnectException e) {
                    logger.error(String.format("连接ZLM失败: %s, %s", e.getCause().getMessage(), e.getMessage()));
                    logger.info("请检查media配置并确认ZLM已启动...");
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }else {
                client.newCall(request).enqueue(new Callback(){
 
                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response){
                        if (response.isSuccessful()) {
                            try {
                                String responseStr = response.body().string();
                                if (responseStr != null) {
                                    callback.run(JSON.parseObject(responseStr));
                                }else {
                                    callback.run(null);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
 
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
                        logger.error(String.format("连接ZLM失败: %s, %s", e.getCause().getMessage(), e.getMessage()));
                        logger.info("请检查media配置并确认ZLM已启动...");
                    }
                });
            }
 
 
 
        return responseJSON;
    }
 
    public JSONObject getMediaList(String app, String stream, String schema, RequestCallback callback){
        Map<String, Object> param = new HashMap<>();
        if (app != null) param.put("app",app);
        if (stream != null) param.put("stream",stream);
        if (schema != null) param.put("schema",schema);
        param.put("vhost","__defaultVhost__");
        return sendPost("getMediaList",param, callback);
    }
 
    public JSONObject getMediaList(String app, String stream){
        return getMediaList(app, stream,null,  null);
    }
 
    public JSONObject getMediaList(RequestCallback callback){
        return sendPost("getMediaList",null, callback);
    }
 
    public JSONObject getMediaInfo(String app, String schema, String stream){
        Map<String, Object> param = new HashMap<>();
        param.put("app",app);
        param.put("schema",schema);
        param.put("stream",stream);
        param.put("vhost","__defaultVhost__");
        return sendPost("getMediaInfo",param, null);
    }
 
    public JSONObject getRtpInfo(String stream_id){
        Map<String, Object> param = new HashMap<>();
        param.put("stream_id",stream_id);
        return sendPost("getRtpInfo",param, null);
    }
 
    public JSONObject addFFmpegSource(String src_url, String dst_url, String timeout_ms){
        System.out.println(src_url);
        System.out.println(dst_url);
        Map<String, Object> param = new HashMap<>();
        param.put("src_url", src_url);
        param.put("dst_url", dst_url);
        param.put("timeout_ms", timeout_ms);
        return sendPost("addFFmpegSource",param, null);
    }
 
    public JSONObject delFFmpegSource(String key){
        Map<String, Object> param = new HashMap<>();
        param.put("key", key);
        return sendPost("delFFmpegSource",param, null);
    }
 
    public JSONObject getMediaServerConfig(){
        return sendPost("getServerConfig",null, null);
    }
 
    public JSONObject setServerConfig(Map<String, Object> param){
        return sendPost("setServerConfig",param, null);
    }
 
    public JSONObject openRtpServer(Map<String, Object> param){
        return sendPost("openRtpServer",param, null);
    }
 
    public JSONObject closeRtpServer(Map<String, Object> param) {
        return sendPost("closeRtpServer",param, null);
    }
 
    public JSONObject listRtpServer() {
        return sendPost("listRtpServer",null, null);
    }
 
    public JSONObject startSendRtp(Map<String, Object> param) {
        return sendPost("startSendRtp",param, null);
    }
 
    public JSONObject stopSendRtp(Map<String, Object> param) {
        return sendPost("stopSendRtp",param, null);
    }
 
    public JSONObject addStreamProxy(String app, String stream, String url, boolean enable_hls, boolean enable_mp4, String rtp_type) {
        Map<String, Object> param = new HashMap<>();
        param.put("vhost", "__defaultVhost__");
        param.put("app", app);
        param.put("stream", stream);
        param.put("url", url);
        param.put("enable_hls", enable_hls?1:0);
        param.put("enable_mp4", enable_mp4?1:0);
        param.put("rtp_type", rtp_type);
        return sendPost("addStreamProxy",param, null);
    }
 
    public JSONObject closeStreams(String app, String stream) {
        Map<String, Object> param = new HashMap<>();
        param.put("vhost", "__defaultVhost__");
        param.put("app", app);
        param.put("stream", stream);
        param.put("force", 1);
        return sendPost("close_streams",param, null);
    }
}