‘liusuyi’
2023-07-13 35d87ba0e7567ec001123ef7d83e63f211dc02e7
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
package com.ruoyi.media.service.impl;
 
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.media.domain.Conf;
import com.ruoyi.media.domain.Items;
import com.ruoyi.media.domain.JsonsRoot;
import com.ruoyi.media.service.IMediaService;
import com.ruoyi.utils.forest.MediaClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.List;
 
/**
 * @Description:
 * @ClassName: MediaService
 * @Author: 刘苏义
 * @Date: 2023年07月13日9:28
 * @Version: 1.0
 **/
@Service
public class MediaService implements IMediaService {
 
    @Resource
    MediaClient mediaClient;
 
    @Value("${mediamtx.host}")
    String mediamtxHost;
 
    @Override
    public String addPath(String name, String rtspPath) {
        String apiUrl="http://"+mediamtxHost+":9997/v2";
        String rtspUrl="rtsp://"+mediamtxHost+":8554/";
        Conf mediaInfo = new Conf();
        //-vcodec libx264 //指定视频编码器为 libx264,使用 H.264 编码格式进行视频压缩
        //-preset ultrafast  //--preset的参数主要调节编码速度和质量的平衡,有ultrafast(转码速度最快,视频往往也最模糊)、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢
        //-r 25 //设置输出视频的帧率为 25 帧/秒
        //-rtsp_transport tcp //这个选项告诉 FFmpeg 使用 TCP 作为 RTSP 的传输协议
        //-threads 4: 指定要使用的线程数为 4。//这允许 FFmpeg 在多核处理器上使用多个线程来进行视频编码,以加快速度。
        // -i //用于指定输入媒体文件或输入流的地址
        //-f rtsp //这个选项告诉 FFmpeg 输出为 RTSP 格式。
        //CPU软解码编码
        //String cmd = "ffmpeg -rtsp_transport udp -i \"" + rtspPath + "\" -vcodec libx264 -preset:v veryfast  -r 25 -threads 4 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
        //GPU硬解码编码
        String cmd = "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport udp  -i \"" + rtspPath + "\" -c:v h264_nvenc  -r 25 -threads 4 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
        mediaInfo.setRunoninit(cmd);
        mediaInfo.setRunoninitrestart(true);
        mediaClient.add(apiUrl, name, mediaInfo);
        return rtspUrl + name;
    }
 
    @Override
    public void removePath(String name) {
        String apiUrl="http://"+mediamtxHost+":9997/v2";
        mediaClient.remove(apiUrl, name);
    }
 
    @Override
    public List<Items> list() {
        String apiUrl="http://"+mediamtxHost+":9997/v2";
        String list = mediaClient.list(apiUrl);
        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
        return jsonsRoot.getItems();
    }
}