Elixir 是一种用于构建分布式、可扩展和可靠的多媒体应用程序的优秀语言。它基于 Erlang,而 Erlang 以同时处理大量事务而不会崩溃而著称。如果您正在处理视频流、图像处理或 WebRTC,Elixir 会让您的工作更轻松。本文将通过实际示例和技巧展示如何在多媒体项目中使用 Elixir。
Elixir 多媒体库
Membrane
Elixir 有一些处理多媒体的好工具。Membrane 是其中一个,它是 Software Mansion 专门为创建多媒体管道而构建的框架。可以把它想象成一组构建模块(元素),将它们组合在一起就能创建一个数据流,帮助您处理视频和音频。一个负责播放 MP3 文件的管道示例将由三个这样的元素组成: 文件源(负责从文件中读取数据)、MP3 解码器(负责将音频转换为原始格式)和 PortAudio Sink(负责在耳机中播放原始音频)。因此,如果您正在处理视频流、音频处理,甚至是实时通信,那么 Membrane 值得你一试。
用 Membrane 播放 mp3 文件:
defmodule MP3Player do
use Membrane.Pipeline
@impl true
def handle_init(_ctx, mp3_url) do
spec =
child(%Membrane.Hackney.Source{
location: mp3_url, hackney_opts: [follow_redirect: true]
})
|> child(Membrane.MP3.MAD.Decoder)
|> child(Membrane.PortAudio.Sink)
{[spec: spec], %{}}
end
end
Membrane.Pipeline.start_link(MP3Player, mp3_url)
Boombox
Boombox 建立在 Membrane 的基础之上,为那些希望用更简单的方法完成常见流媒体任务的用户提供了更精简的 API。Membrane 提供了细粒度的控制和自定义功能,您需要自己编写管道,了解确切的元素以及如何将它们组合在一起,而 Boombox 则侧重于典型流媒体场景的易用性,并提供了更具声明式的 API,可以指定输入和输出的内容,并且 Boombox 负责在引擎下构建足够的管道。它处理了许多模板,让您无需深入研究 Membrane 底层组件的复杂性,就能快速启动并运行流媒体服务器。可以把 Boombox 看作是 Membrane 之上的一个便捷层,它简化了常见的流媒体用例。
通过 WebRTC 流式传输 mp4 文件:
Boombox.run(input: "file.mp4", output: {:webrtc, "ws://localhost:8830"})
或者使用 CLI 界面:
./boombox -i file.mp4 -o --webrtc ws://localhost:8830
Xav
虽然 Membrane 和 Boombox 是非常高级和声明性的工具,但有时可能需要编写一些更“命令式”的代码,于是 Xav 应运而生,它是 FFmpeg 的一个简单包装器,主要用于音频和视频编码/解码,但不仅限于此。
使用 Xav 解码单个视频帧:
decoder = Xav.Decoder.new(:vp8, out_format: :rgb24)
{:ok, %Xav.Frame{} = frame} = Xav.Decoder.decode(decoder, <<”somebinary>>)
Image 和 Vix
多媒体不仅仅涉及流媒体,还涉及静态图像!Image 和 Vix 等库可让您处理静态图像(或单个视频帧)。这些操作包括调整大小、裁剪、颜色转换、绘制形状、生成图像直方图、使用蒙版等等。Image 还与 Bumblebee 集成,使执行图像分类或基于文本提示的图像生成变得更加容易。
使用图像增加图像亮度:
image = Image.open!("./test/support/images/cat.png")
{:ok, _brighter_image} = Image.brightness(image, 1.5)
Nx
Elixir Nx 是一套用于 Elixir 生态系统的机器学习库。你可以将音频样本或视频帧转换成张量,使用 Bumblebee 加载音频和视频模型,做任何你想做的(和需要做的)事情!更多信息,请访问 https://github.com/elixir-nx。
Evision
说到机器学习,谁还没听说过 OpenCV?Evision 是一个在 Elixir 中提供 OpenCV 绑定的库。从文档中的模块数量来看,很有可能在 Python 中能做的事,在 Elixir 中也能做。
Elixir WebRTC
WebRTC 是一种标准,允许两个对等点之间(特别是在 Web 浏览器之间)进行实时音频 / 视频交换,而 Elixir 与 Go(Pion)、Rust(webrtc-rs)和 Python(aiortc)类似,都有自己的实现,称为Elixir WebRTC。这使得您的 Elixir/Phoenix 应用程序中可以实现视频聊天、实时流媒体、交互式通信以及与 OpenAI 或 Google Gemini 等 LLM 服务集成等功能。此外,Elixir WebRTC 具有内置可观察性,可以与 Membrane 和 Phoenix 顺利集成,最后但并非最不重要的是,它模仿 JavaScript API,因此如果您已经熟悉 Web 浏览器中的 WebRTC,那么在 Elixir 中使用 WebRTC 不会有任何麻烦。
例如,JS 中的此代码片段:
const pc = new RTCPeerConnection();
const tr = pc.addTransceiver( "audio" );
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
映射到以下 Elixir 代码:
{ :ok , pc} = PeerConnection.start_link()
{ :ok , tr} = PeerConnection.add_transceiver(pc, :audio )
{ :ok , offer} = PeerConnection.create_offer(pc)
:ok = PeerConnection.set_local_description(pc, offer)
小结
使用哪个库取决于您要构建的内容。Membrane 非常适合创建强大且可扩展的管道,尤其是在进行流式传输或复杂处理时。Boombox 是快速设置常见流式传输场景的绝佳选择。当您需要进行大量数学运算时,例如需要详细分析的图像或视频处理,Nx 是您的好帮手。通常,它们会协同工作。您可以使用 Membrane(或 Boombox)来管理流式传输,使用 Nx 来处理图像或视频帧。了解每个库最擅长的功能可以帮助您将它们结合起来构建一些很酷的多媒体应用程序。
如何在多媒体应用程序中使用 Elixir
下图简单介绍了上述库在多媒体环境中的使用方式。希望它能启发您自己创建一个 Elixir 多媒体项目 :

请注意,虽然 Membrane 没有内置对象检测或语音转文本支持,但您可以使用 Elixir Nx 和 Bumblebee 等轻松编写自己的元素。
Elixir 生态系统不断发展,新工具和库层出不穷。这意味着多媒体开发人员将拥有更多的可能性。如果您对多媒体开发感兴趣,现在是开始探索 Elixir 的好时机。
作者:Karolina Kulig
原文:https://blog.swmansion.com/elixir-for-multimedia-a-practical-guide-for-developers-169adb0eb523
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/56355.html