通过ZLMediaKit来说说流媒体服务的实现

实现流媒体服务的三大基础

  1. 事件循环。
  2. 并发模型。
  3. 错误处理。

这是也是实现各种C++服务的基础,业务通过这三大基础进行构建。

事件循环

EventLoop,它通过事件驱动程序的流程,所处理的是IO和定时器事件。

它的实现都是基于IO复用机制,比如Linux的epoll。现在有很多开源事件库实现,比如libevet,libuv,asio等,不同的实现,主要是在性能,功能,和跨平台上做文章来突出差异化。

通过reactor模式实现EventLoop并不复杂(不追求跨平台和性能的情况下)。在流媒体服务领域,咱们手搓一个基于linux epoll的事件循环就足够满足IO需求,毕竟流媒体服务主要指标并不在IO上。

ZLMediaKit中的EventLoop就实现的比较好,封装性好,代码简明,作为流媒体服务的IO性能已够用。

并发模型

并发模型,是指服务是多线程还是多进程。会出现多进程多线程,单进程多线程,单进程单线程,多进程单线程的各种模式。

现在服务器的实现大多采用了多线程模式,即多进程多线程或单进程多线程,ZLMediaKit是单进程多线程服务,虽然它有两个进程,但是其中一个是守护进程,并不处理业务。

对rtc流媒体服务,一般都是采用单线程多进程模式,主要是规避对锁的使用及线程切换的开销,来保证足够实时性。

多线程的模型中线程通常是于EventLoop结构在一起的,即Event Loop per thread可以看看这篇文章介绍的ZLMediaKit的线程

错误处理

C++有两种错误处理方式:

  1. 从C 语言继承而来的错误码方式。
  2. 异常方式(C++异常有天生的缺点)。

C++中比没有统一的方式,所以错误处理的方式,是处于各取所爱的状态。在ZLMediaKit中,使用的异常的方式。但是不管用哪种方式,都要达到以下要求:

  • 能清楚的分辨,记录错误
  • 要保证有一定的错误兼容性(比如,不因为消息兼容性的问题而崩溃 )

流媒体服务的分类

  • rtc流媒体服务

rtc流媒体服务运用在rtc系统中,比如腾讯会议,声网。rtc中的流媒体服务主要目标是保证高效的转发,在基于udp/rtp协议的系统中,直接转发rtp包,不会转协议,不涉及到组帧,拆包,音视频同步。

  • 通用流媒体服务

ZLMediaKit,live555这类服务称为通用流媒体服务,支持多种协议。所以有转协议,组帧,拆包,还会做音视频同步。

rtc服务相比通用流媒体服务,转发效率高。通用流媒体服务则媒体业务丰富。这两种服务上实现的区别

  1. EventLoop(网络IO)
  • rtc服务,网络IO比较简单,只需支持UDP,甚至可以不同IO复用机制。
  • 通用流媒体服务,因为要支持多种协议,所以TCP,UDP都需支持,所以一般都有完善的EventLoop,事件驱动机制。
  1. 并发模型
  • rtc服务,前面提到过,为了保证转发效率,rtc服务会使用单线程,通过多进程的方式利用多核。
  • 通用流媒体服务,并发模型多样。
要通过调用zlmediakit服务实现和拉转发,可以使用Java中的HTTP客户端库,例如Apache HttpClient或OkHttp,来向zlmediakit服务发送HTTP请求。 首先,需要了解zlmediakit服务的接口文档和使用方法。根据文档中的明,构建推和拉的HTTP请求URL,并设置请求参数,例如推地址、拉地址、转发地址等。 下面是一个简单的Java代码片段,演示了如何使用OkHttp向zlmediakit服务发送推请求: ``` import okhttp3.*; public class PushStream { public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); String url = "http://localhost:8080/index/api/push"; String pushUrl = "rtmp://live.hkstv.hk.lxdns.com/live/test"; String app = "live"; String stream = "test"; HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder(); urlBuilder.addQueryParameter("app", app); urlBuilder.addQueryParameter("stream", stream); urlBuilder.addQueryParameter("url", pushUrl); String requestUrl = urlBuilder.build().toString(); Request request = new Request.Builder() .url(requestUrl) .build(); Response response = client.newCall(request).execute(); System.out.println(response.body().string()); } } ``` 通过设置url、pushUrl、app和stream参数,构建请求URL,并使用OkHttp发送HTTP请求,即可完成推操作。 同样的,可以使用类似的方式来实现转发。需要按照文档中的明,设置拉地址、转发地址等参数,并使用OkHttp发送HTTP请求。 需要注意的是,zlmediakit服务的接口文档可能会随着版本变化而更新,因此在实际开发中需要及时查看最新的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo4776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值