在一次偶然的机会,发现了一个流媒体服务器。我配合Flutter 对接 resultful API 写了个demo。
这是基于C++写的,不得不说,C++是真的牛逼。
下面我们就用Flutter开始对接这个服务器吧!
流媒体服务器运行
这个媒体的服务运行就不多说啦,在https://github.com/ZLMediaKit/ZLMediaKit/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B这个链接里面😯,我用的是Unbuntu,运行的过程还是比较快的哦。
直播
在这个流媒体服务器当中,我对接了直播的播放,录制,回放。比较简单的功能。
推流拉流。
- 推流,推流我使用的是OBS来进行推流。
- 拉流,拉流以及mp4的播放,我都是通过Flutter 的FijkPlayer 来进行播放的。如果有需要更复杂的功能可以去ZLMediaKit底下的开源项目参考捏。
在我的表面认知当中,我们将流推给服务器,可以通过FFmpeg对该流进行操作,比如截图,录制。不过这是在他流媒体服务器当中的源码,如果有兴趣的话可以先去了解一下FFmpeg。
如何推流:我是通过Obs来进行推流的。
可以在Obs中设置,rtmp流的端口是1935,后面的路径需要设置/live/test
,live在后面的接口返回的是app,test在后面接口返回的是stream可以当作房间号或者唯一表示。
接口
接口是由流媒体服务器提供的,只要部署好就可以直接使用。
- 获取流媒体列表
http://ip/index/api/getMediaList?secret=035c73f7-bb6b-4889-a715-d9eb2d1926cc&schema=rtmp参数是secret以及schema,secret主要是在你配置流媒体服器过程中配置文件的密钥
返回值
直播流可以通过返回值拼接。
在flutter里面我使用的是m3u8格式来进行播放的。
http://{ip}/{app}/{stream}/hls.m3u8?vhost={vhost}
只要通过上面拼接的方式就可以拿到直播流拉。
{
"code": 0,
"data": [{
"aliveSecond": 482,
"app": "live",
"bytesSpeed": 325984,
"createStamp": 1691069063,
"isRecordingHLS": true,
"isRecordingMP4": false,
"originSock": {
"identifier": "4666-15",
"local_ip": "10.0.2.51",
"local_port": 1935,
"peer_ip": "117.30.109.37",
"peer_port": 17717
},
"originType": 1,
"originTypeStr": "rtmp_push",
"originUrl": "rtmp://__defaultVhost__/live/chenguocan/",
"readerCount": 0,
"schema": "rtmp",
"stream": "chenguocan",
"totalReaderCount": 1,
"tracks": [],
"vhost": "__defaultVhost__"
}]
}
- 录制流
开始录制:http://{ip}/index/api/startRecord?secret={secret}&type=1&vhost=__defaultVhost__&app={app}&stream={stream}
停止录制:http://{ip}/index/api/stopRecord?secret={secret}&type=1&vhost=__defaultVhost__&app={app}&stream={stream}
录制的返回值也相对比较简单,就不写明出来啦。
- 查询回放
主要是通过period日期参数来检索录制的视频
http://{ip}/index/api/getMp4RecordFile?secret={secret}&vhost=__defaultVhost__&app={app}&stream={stream}&period=2023-08-02
{
"code" : 0,
"data" :
{
"paths" :
[
"17-03-20-0.mp4",
"17-07-22-0.mp4",
"16-45-13-0.mp4",
"17-04-32-0.mp4"
],
"rootPath" : ""
}
}
要播放视频,可以拼接paths里面的item
http://{ip}/record/{app}/{stream}/{period}/{17-03-20-0.mp4}就可以播放啦
Flutter
Flutter 主要是使用FijkPlayer来进行播放的!
https://fijkplayer.befovy.com/docs/zh/
步骤:
- pubspec.yaml引入
fijkplayer: ^0.11.0 - 项目文件引入
import 'package:fijkplayer/fijkplayer.dart'; - 生成控制实例
final FijkPlayer player = FijkPlayer(); - 界面使用
FijkView(
player: player,
panelBuilder:fijkPanel2Builder(),
fit: FijkFit.ar16_9,)
- 添加播放地址
player.setDataSource(url,autoPlay: true);
- 修改播放源
await player.reset().then((_) async {
player.setDataSource(url, autoPlay: true);
});
在这里不得不吐槽一下Flutter国人的插件真不多,还是国外的社区好一点。不过这还是得基于uni-app,uni-app在国内比Flutter流行多了!!
主要界面: