Boombox:基于 Elixir 的流媒体库

上周,在 RTC.On 大会上,Membrane 团队宣布创建了的新 Elixir 库: Boombox。本文将简要介绍 Boombox 是什么以及创建它的动机。

认识 Boombox

Boombox 可以让你使用各种协议和格式来传输多媒体: WebRTC、RTMP、RTSP、HLS 和 MP4。让我们考虑这样一种情况:某人通过 RTMP 发送流(如来自 OBS 的流媒体),然后通过 HLS 向更广泛的公众进行广播:

Boombox:基于 Elixir 的流媒体库

只需调用一次 Boombox 即可完成:

Boombox.run(input: "rtmp://localhost:5432", output: "path/to/index.m3u8")

它将接收 RTMP 流并生成 HLS (.m3u8) 播放列表。Boombox 也可以使用 CLI 调用:

boombox -i rtmp://localhost:5432 -o path/to/index.m3u8

Boombox 还允许你在 Elixir 代码中与流进行交互。例如,要生成视频并通过 WebRTC 将其发送到浏览器:

Boombox:基于 Elixir 的流媒体库

下面的代码片段生成一个旋转的图像视频并通过 WebRTC 进行流式传输:

Mix.install([:boombox, :image, :req])

{:ok, image} =
  Req.get!("https://avatars.githubusercontent.com/u/25247695?s=200&v=4")
  .body
  |> Vix.Vips.Image.new_from_buffer()

angle = Stream.iterate(0, fn a -> rem(a + 3, 360) end)

timestamps =
  Stream.iterate(0, fn pts -> pts + div(Membrane.Time.seconds(1), 60) end)

Stream.zip(angle, timestamps)
|> Stream.map(fn {angle, pts} ->
  image = Image.rotate!(image, angle) |> Image.thumbnail!(200)
  %Boombox.Packet{kind: :video, payload: image, pts: pts}
end)
|> Boombox.run(
  input: {:stream, video: :image, audio: false},
  output: {:webrtc, "ws://localhost:8830"}
)

要在浏览器中接收流,你可以使用示例HTML 代码片段

为什么选择 Boombox?

明确性和灵活性一直是 Membrane 的首要任务。但它也不是没有代价的,尤其是入门门槛较高,学习曲线陡峭。Boombox 以更简单的 API 提供了 Membrane 的许多功能。你无需学习如何创建 Membrane 管道、使用哪些插件以及如何连接它们。只需执行 Boombox.run(…) 即可。这就好像媒体流很简单一样……

但事实很少如此。随着项目的发展,你可能需要学习更多关于媒体的知识,需要更多灵活性,而不仅仅是指定输入和输出。好消息是,Boombox 只是 Membrane 的一个简单包装!你可以使用与 Boombox 完全相同的组件来创建 Membrane 管道,并对其进行任意定制。此外,我们还将允许你把 Boombox 插入到 Membrane 管道中,从而让 Boombox 和 Membrane 互动得更好。

Boombox 还处于早期阶段,仍在完善中。但它的基础十分牢固,可供早期采用者使用!试用地址:https://github.com/membraneframework/boombox

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/52437.html

(0)

相关推荐

发表回复

登录后才能评论