Flutter + ZLMedia流媒体服务器

640 阅读3分钟

在一次偶然的机会,发现了一个流媒体服务器。我配合Flutter 对接 resultful API 写了个demo。

github.com/ZLMediaKit/…

这是基于C++写的,不得不说,C++是真的牛逼。

下面我们就用Flutter开始对接这个服务器吧!

流媒体服务器运行

这个媒体的服务运行就不多说啦,在https://github.com/ZLMediaKit/ZLMediaKit/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B这个链接里面😯,我用的是Unbuntu,运行的过程还是比较快的哦。

直播

在这个流媒体服务器当中,我对接了直播的播放,录制,回放。比较简单的功能。

推流拉流。

  1. 推流,推流我使用的是OBS来进行推流。
  2. 拉流,拉流以及mp4的播放,我都是通过Flutter 的FijkPlayer 来进行播放的。如果有需要更复杂的功能可以去ZLMediaKit底下的开源项目参考捏。

在我的表面认知当中,我们将流推给服务器,可以通过FFmpeg对该流进行操作,比如截图,录制。不过这是在他流媒体服务器当中的源码,如果有兴趣的话可以先去了解一下FFmpeg

如何推流:我是通过Obs来进行推流的。 可以在Obs中设置,rtmp流的端口是1935,后面的路径需要设置/live/test ,live在后面的接口返回的是app,test在后面接口返回的是stream可以当作房间号或者唯一表示。 image.png

接口

接口是由流媒体服务器提供的,只要部署好就可以直接使用。

  1. 获取流媒体列表 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__"
	}]
}
  1. 录制流
开始录制: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}
录制的返回值也相对比较简单,就不写明出来啦。
  1. 查询回放
主要是通过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/ 步骤:

  1. pubspec.yaml引入 fijkplayer: ^0.11.0
  2. 项目文件引入 import 'package:fijkplayer/fijkplayer.dart';
  3. 生成控制实例 final FijkPlayer player = FijkPlayer();
  4. 界面使用
FijkView(
     player: player,
     panelBuilder:fijkPanel2Builder(),
     fit: FijkFit.ar16_9,)
  1. 添加播放地址
player.setDataSource(url,autoPlay: true);
  1. 修改播放源
await player.reset().then((_) async {
   player.setDataSource(url, autoPlay: true);
 });

在这里不得不吐槽一下Flutter国人的插件真不多,还是国外的社区好一点。不过这还是得基于uni-app,uni-app在国内比Flutter流行多了!!

主要界面:

image.png image.png

演示