近期项目中有需求将终端设备中的摄像头视频进行本地存储,并支持H5实时拉流实时播放的功能;本人Java后端,开始使用javacv进行了代码实现,但是效果及稳定性不是很理想,毕竟对多媒体处理没有啥技术积累;故开始寻找开源开包即用的项目,最终选择了Monibuca,配置简单,多平台支持,资源消耗也小;轻松实现了拉取RTSP视频流,提供H5播放,并支持分片录制视频功能。实际使用过程如下,记录备份一下

Monibuca v4

下载地址

页面右上角按照使用平台进行下载

安装Monibuca

我这里以linux-arm服务器作为例,下载对应的m7s_linux_arm64.tar.gz包,并上传至服务器opt/m7s目录,进入目录解压文件

# 建立文件夹 m7s
mkdir m7s
# 将m7s_linux_arm64.tar.gz 包上传至m7s目录下
# 进入m7s目录后进行解压
tar -zxvf m7s_linux_arm64.tar.gz

修改配置文件

文件解压后解压目录下找到config.yml进行按需修改,全局配置参考

# 支持零配置启动,即无需填写配置默认启用所有的插件。
# 只需要填写需要修改的配置项即可。不需要将所有的配置都填写进来!!。
# 插件配置参考各个插件的文档
# 插件都有一个enable配置,如果为false则不启用该插件,默认为true即不需要配置。

llhls:
  enable: false
hls:
  enable: false
monitor:
  enable: false

# 录制插件
record:
  subscribe: # 格式参考全局配置
  mp4:  # s使用MP4格式,便于后期直接使用h5浏览器中的video即可播放
      ext: .mp4
      path: /opt/media-handle/media-backup/mp4  #录制文件存储目录
      autorecord: true
      filter: ""
      fragment: 60s #录制文件分片大小,60秒存一个文件

rtsp:
  enable: true # 如果disableal1false的话,这个可以不需要写
  pullprotocol: tcp
  pull:
    pullonstart: #这里设置了启动自动拉流
      live/ipad: rtsp://admin:admin@192.168.11.48:8554/live
      live/iphone: rtsp://admin:admin@192.168.11.48:8554/live  #live/iphone 为后续使用flv进行直播的地址(streamPath)
    pullonsub: # I#HA
      rtsp/ipad: rtsp://admin:admin@192.168.11.48:8554/live
      rtsp/iphone: rtsp://admin:admin@192.168.11.48:8554/live

启动Monibuca

这里为了方便,我写启动脚本start-m7s.sh,注意这个文件放在解压路径下和config.ymal文件同目录

#!/bin/bash

# 检查服务是否已经启动
if pgrep -f "./m7s" >/dev/null; then
    echo "Media handle service is already running. Stopping the existing service..."
    pkill -f "./m7s"
    sleep 5
fi

# 启动新的服务
nohup ./m7s > m7s.log 2>&1 &
echo "Media handle service started."

使用脚本的时候注意修改sh文件权限

执行启动脚本

#启动
./start-m7s.sh

 项目启动后默认使用的8080端口,这个端口可根据实际需求在config.yaml文件中进行修改;浏览器输入http:[IP]:8080即可看到Monibuca接口页面,页面如下

Android RTSP流编码保存MP4_h.264

启动失败: 若启动失败可以进入日志目录中查看日志明细信息,解压目录下有一个logs的文件夹,查看相关文件即可

cat *.log

视频试试查看

我再vue中使用西瓜播放器中的flv插件进行播放,前端代码如下

依赖引入

"xgplayer": "^3.0.11",
"xgplayer-flv": "^3.0.11", 
"xgplayer-hls": "^3.0.11"

在此简单封装了一下播放插件flv-player.vue

<template>
    <div id="flv-player"></div>
</template>

<script setup>
import { ref, onMounted, defineProps } from 'vue';
import Player from 'xgplayer';
import FlvPlugin from 'xgplayer-flv'
import 'xgplayer/dist/index.min.css';
const props = defineProps({
    src: String,
    isLive: {
        type: Boolean,
        default: true,
    }
});
const player = ref(null);
function initPlayer() {
    player.value = new Player({
        id: 'flv-player',
        autoplay: true,
        autoplayMuted: true, //自动播放
        isLive: props.isLive,
        url: props.src,
        height: '100%',
        width: '100%',
        playbackRate: [1],
        defaultPlaybackRate: 1,
        cors: true,
        plugins: [FlvPlugin], // flv播放插件
        flv: {
            retryCount: 3, // 重试 3 次,默认值
            retryDelay: 1000, // 每次重试间隔 1 秒,默认值
            loadTimeout: 10000, // 请求超时时间为 10 秒,默认值
            targetLatency: 5, // 直播目标延迟,默认 10 秒
            maxLatency:  10, // 直播允许的最大延迟,默认 20 秒
            disconnectTime: 0, // 直播断流时间,默认 0 秒,(独立使用时等于 maxLatency)
            fetchOptions: {
                // 该参数会透传给 fetch,默认值为 undefined
                mode: 'cors'
            }
        }
    });
}
onMounted(() => {
    initPlayer();
})

</script>

<style scoped>
#flv-player {
    flex: auto;
}
</style>

播放组件引入

<div class="player-container">
     <FlvPlayer v-if="showFlv" :src="flvUrl" />
</div>

//播放地址
const flvUrl = ref("http://192.168.11.51:8080/hdl/live/iphone");

播放地址重点说明一下使用的,需在streamPath前面添加/hdl,上面例子中手机端视频拉流定义了streamPath为live/iPhone 所完整的播放地址为http://192.168.11.51:8080/hdl/live/iphone

注意:Monibuca的功能很多,可以去官方文档中按照文档进行使用,我这里使用随手记录了一下我的使用过程,因以上配置已经满足了我们的基础要求,更多的使用方式期待更多的小伙伴使用分享。