From c2a2f991892da3033d17641beee4e6b07686b484 Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Tue, 29 Aug 2023 13:54:41 +0200 Subject: [PATCH 01/14] new readme --- README.md | 107 ++++++++++++--- update_packages.livemd | 288 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 378 insertions(+), 17 deletions(-) create mode 100644 update_packages.livemd diff --git a/README.md b/README.md index bf5935609..016e0c7b3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Membrane Multimedia Framework +# Membrane Framework [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/packages/membrane_core) [![API Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core/) @@ -11,22 +11,84 @@ Multimedia processing framework that focuses on reliability, concurrency and scalability. -An easy to use abstraction layer for assembling mostly server-side applications that have to consume, produce or process multimedia streams. +Membrane is a versatile multimedia streaming & processing framework. You can use it to build a media server of your need, that can: +- stream via WebRTC, RTSP, RTMP, HLS, HTTP and other protocols, +- transcode, mix and apply custom processing of video & audio, +- accept and generate / record to MP4, MKV, FLV and other containers, +- handle dynamically connecting and disconnecting streams, +- seamlessly scale and recover from errors, +- do whatever you imagine if you implement it yourself :D Membrane makes it easy to plug in your code at almost any point of processing. -It puts reliability over amount of features. +The abbreviations above don't ring any bells? Visit [membrane.stream/learn](membrane.stream/learn) and let Membrane introduce you to the multimedia world! -It is written in Elixir + C with outstanding Erlang VM underneath that gives us a rock solid and battle tested foundation. +Want a generic media server, instead of building a custom one? Try [Jellyfish](https://github.com/jellyfish-dev/jellyfish) - it's built on top of Membrane and provides many of its features via simple, WebSocket API. We'll soon [provide it as a SAAS](https://membrane.stream/cloud) too. -## Membrane Core +If you have questions or need consulting, we're for you at our [Discord](https://discord.gg/nwnfVSY), [forum](https://elixirforum.com/c/elixir-framework-forums/membrane-forum/), [GitHub discussions](https://github.com/orgs/membraneframework/discussions), [X (Twitter)](https://twitter.com/ElixirMembrane) and via [e-mail](mailto:info@membraneframework.org). -This package provides core of the [Membrane Multimedia Framework](https://membrane.stream). +Membrane is maintained by [Software Mansion](swmansion.com). -## Installation +## Quick start -Add the following line to your `deps` in `mix.exs`. Run `mix deps.get`. +```elixir +Mix.install([ + :membrane_hackney_plugin, + :membrane_mp3_mad_plugin, + :membrane_portaudio_plugin, +]) + +import Membrane.ChildrenSpec +alias Membrane.RCPipeline + +mp3_url = "https://raw.githubusercontent.com/membraneframework/membrane_demo/master/simple_pipeline/sample.mp3" + +pipeline = RCPipeline.start_link!() + +RCPipeline.exec_actions(pipeline, spec: + child(%Membrane.Hackney.Source{location: mp3_url, hackney_opts:[follow_redirect: true]}) + |> child(Membrane.MP3.MAD.Decoder) + |> child(Membrane.PortAudio.Sink) +) +``` + +This is an [Elixir](elixir-lang.org) snippet, that streams an mp3 via HTTP and plays it on your speaker. To run it, do the following: +- Install libmad and portaudio. Membrane uses these libs to decode the mp3 and to access your speaker, respectively. You can use these commands: + - On Mac OS: `brew install libmad portaudio pkg-config` + - On Debian: `apt install libmad0-dev portaudio19-dev` + +- Option 1: Click the button below: + + [![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fmembraneframework%2F.github%2Fblob%2Freadme%2Fprofile%2Fquick_start.livemd) + + It will install [Livebook](livebook.dev), an interactive notebook similar to Jupyter, and it'll open the snippet in there for you. Then just click the 'run' button in there. + +- Option 2: If you don't want to use Livebook, you can [install Elixir](https://elixir-lang.org/install.html), type `iex` to run interactive shell and paste the snippet there. + +After that, you should hear music playing on your speaker :tada: + +To learn step-by-step what exactly happens here, follow [this tutorial](https://membrane.stream/learn/get_started_with_membrane). + +## Learning + +The best place to learn Membrane is the [membrane.stream/learn](membrane.stream/learn) website and the [membrane_demo](github.com/membraneframework/membrane_demo) repository. Try them out, then hack something exciting! + +## Usage + +Membrane API is mostly based on media processing pipelines. To create one, create an Elixir project, script or livebook and add some plugins to dependencies. Plugins provide elements that you can use in your pipeline, as demonstrated in the 'Quick start' section above. + +**Plugins** + +Each plugin lives in a `membrane_X_plugin` repository, where X can be a protocol, codec, container or functionality, for example [mebrane_opus_plugin](github.com/membraneframework/membrane_opus_plugin). Plugins wrapping a tool or library are named `membrane_X_LIBRARYNAME_plugin` or just `membrane_LIBRARYNAME_plugin`, like [membrane_mp3_mad_plugin](github.com/membraneframework/membrane_mp3_mad_plugin). Plugins are published on [hex.pm](hex.pm), for example [hex.pm/packages/membrane_opus_plugin](hex.pm/pakcages/membrane_opus_plugin) and docs are at [hexdocs](hexdocs.pm), like [hexdocs.pm/membrane_opus_plugin](hexdocs.pm/membrane_opus_plugin). Some plugins require native libraries installed in your OS. Those requirements, along with usage examples are outlined in each plugin's readme. + +**Formats** + +Apart from plugins, Membrane has stream formats, which live in `membrane_X_format` repositories, where X is usually a codec or container, for example [mebrane_opus_format](github.com/membraneframework/mebrane_opus_format). Stream formats are published the same way as packages and are used by elements to define what kind of stream can be sent or received. They also provide utility functions to deal with a given codec/container. + +**Core** + +The API for creating pipelines (and custom elements too) is provided by [membrane_core](github.com/membraneframework/membrane_core). To install it, add the following line to your `deps` in `mix.exs` and run `mix deps.get` ```elixir -{:membrane_core, "~> 0.11.0"} +{:membrane_core, "~> 0.12.0"} ``` Or, if you'd like to try the latest release candidate, use this version: @@ -35,23 +97,34 @@ Or, if you'd like to try the latest release candidate, use this version: {:membrane_core, "~> 1.0.0-rc0"} ``` -## Getting started +**Standalone libraries** -To get familiar with basic concepts and build your first application using Membrane Framework, visit [Membrane Guide](https://membrane.stream/guide). +Last but not least, Membrane provides tools and libraries that can be used standalone and don't depend on the membrane_core, for example [video_compositor](github.com/membraneframework/video_compositor), [ex_sdp](github.com/membraneframework/ex_sdp) or [unifex](github.com/membraneframework/unifex). -API documentation is available at [HexDocs](https://hexdocs.pm/membrane_core/). +## Goals -Moreover, we would like to invite you to take some of the [Membrane Tutorials](https://membrane.stream/learn), based on real-life use cases. +The main goals of Membrane are: +- To make work with multimedia a more pleasant experience than it is now. +- To provide a welcoming ecosystem for learning multimedia development. +- To power resilient, maintainable and scalable systems. -## Contributing +## Elixir language -Any contributions are more than welcome! You can help us improving Membrane by either contributing to the core (see [opened issues](https://github.com/membraneframework/membrane-core/issues)), extending our [guide](https://github.com/membraneframework/guide) or by creating new elements. +We chose Elixir for Membrane because it's a modern, high-level, easy-to-learn language, that lets us rapidly develop media solutions. Elixir's main selling points are built-in parallelism and fault-tolerance features, so we can build scalable systems that are self-healing. It also runs on the battle-tested BEAM VM, that's been widely used and actively developed since the '80s. When we need the performance of a low-level language, we delegate to Rust or C. + +If you don't know Elixir, try [this tutorial](https://elixir-lang.org/getting-started) - it shouldn't take long and you'll know more than enough to get started with Membrane. + +## Contributing -For more details see [Contribution guide](CONTRIBUTING.md) +We welcome everyone to contribute to Membrane. Here are some ways to contribute: +- Spread the word about Membrane! Even though multimedia are present everywhere today, media dev is still quite niche. Let it be no longer! +- Create learning materials. We try our best but can cover only a limited number of Membrane use cases. +- Improve docs. We know it's not the most exciting part, but if you had a hard time understanding the docs, you're the best person to fix them ;) +- Contribute code - plugins, features and bug fixes. It's best to contact us before, so we can provide our help & assistance, and agree on important matters. For details see the [contribution guide](CONTRIBUTING.md) ## Support and questions -If you have any problems with Membrane Framework feel free to contact us via [membrane tag at Elixir forum](https://elixirforum.com/tag/membrane), [mailing list](https://groups.google.com/forum/#!forum/membrane-framework), [Discord](https://discord.gg/nwnfVSY) or via [e-mail](mailto:info@membraneframework.org). +If you have any problems with Membrane Framework feel free to contact us via [Discord](https://discord.gg/nwnfVSY), [forum](https://elixirforum.com/c/elixir-framework-forums/membrane-forum/), [GitHub discussions](https://github.com/orgs/membraneframework/discussions), [X (Twitter)](https://twitter.com/ElixirMembrane) or [e-mail](mailto:info@membraneframework.org). ## Copyright and License diff --git a/update_packages.livemd b/update_packages.livemd new file mode 100644 index 000000000..d8fb009c4 --- /dev/null +++ b/update_packages.livemd @@ -0,0 +1,288 @@ +# Update packages + +```elixir +Mix.install([{:req, "~> 0.4.0"}, :kino]) +``` + +## Section + +```elixir +packages = + [ + {:md, "### General"}, + "membrane_core", + "kino_membrane", + "docker_membrane", + "membrane_demo", + "membrane_tutorials", + {:md, "### Plugins"}, + {:md, "#### General purpose"}, + "membrane_file_plugin", + "membrane_udp_plugin", + "membrane_hackney_plugin", + "membrane_scissors_plugin", + "membrane_tee_plugin", + "membrane_funnel_plugin", + "membrane_realtimer_plugin", + "membrane_stream_plugin", + "membrane_fake_plugin", + "membrane_pcap_plugin", + "kim-company/membrane_live_framerate_converter_plugin", + "membrane_template_plugin", + {:md, "#### Streaming protocols"}, + "membrane_webrtc_plugin", + "membrane_rtmp_plugin", + "membrane_http_adaptive_stream_plugin", + "membrane_rtp_plugin", + "membrane_rtp_h264_plugin", + "membrane_rtp_vp8_plugin", + "membrane_rtp_vp9_plugin", + "membrane_rtp_mpegaudio_plugin", + "membrane_rtp_opus_plugin", + "mickel8/membrane_quic_plugin", + "kim-company/membrane_mpeg_ts_plugin", + "kim-company/membrane_hls_plugin", + {:md, "#### Containers"}, + "membrane_mp4_plugin", + "membrane_matroska_plugin", + "membrane_flv_plugin", + "membrane_ivf_plugin", + "membrane_ogg_plugin", + {:md, "#### Audio codecs"}, + "membrane_aac_plugin", + "membrane_aac_fdk_plugin", + "membrane_flac_plugin", + "membrane_mp3_lame_plugin", + "membrane_mp3_mad_plugin", + "membrane_opus_plugin", + "membrane_wav_plugin", + {:md, "#### Video codecs"}, + "membrane_h264_plugin", + "membrane_h264_ffmpeg_plugin", + "binarynoggin/elixir-turbojpeg", + "kim-company/membrane_subtitle_mixer_plugin", + {:md, "#### Raw audio & video"}, + "membrane_generator_plugin", + {:md, "**Raw audio**"}, + "membrane_raw_audio_parser_plugin", + "membrane_portaudio_plugin", + "membrane_audio_mix_plugin", + "membrane_audio_filler_plugin", + "membrane_ffmpeg_swresample_plugin", + "membrane_audiometer_plugin", + {:md, "**Raw video**"}, + "membrane_raw_video_parser_plugin", + "membrane_video_merger_plugin", + "membrane_video_compositor_plugin", + "membrane_camera_capture_plugin", + "membrane_framerate_converter_plugin", + "membrane_sdl_plugin", + "membrane_ffmpeg_swscale_plugin", + "membrane_ffmpeg_video_filter_plugin", + "kim-company/membrane_video_mixer_plugin", + {:md, "#### External APIs"}, + "membrane_element_gcloud_speech_to_text", + "membrane_element_ibm_speech_to_text", + "YuzuTen/membrane_s3_plugin", + "lawik/membrane_transcription", + {:md, "### Formats"}, + "membrane_raw_audio_format", + "membrane_raw_video_format", + "membrane_aac_format", + "membrane_mp4_format", + "membrane_opus_format", + "membrane_rtp_format", + "membrane_mpegaudio_format", + "membrane_h264_format", + "membrane_cmaf_format", + "membrane_matroska_format", + "membrane_vp8_format", + "membrane_vp9_format", + {:md, "### Standalone media libs"}, + "video_compositor", + "ex_sdp", + "ex_libnice", + "ex_libsrtp", + "ex_dtls", + "membrane_rtsp", + "membrane_ffmpeg_generator", + "membrane_telemetry_dashboard", + "webrtc-server", + {:md, "### Utils"}, + "unifex", + "bundlex", + "beamchmark", + "bunch", + "bunch_native", + "shmex", + "membrane_common_c", + "membrane_telemetry_metrics", + "membrane_opentelemetry" + ] + |> Enum.map(fn + {:md, markdown} -> + %{type: :markdown, content: markdown} + + package when is_binary(package) -> + case String.split(package, "/", parts: 2) do + [owner, name] -> %{type: :package, name: name, owner: owner} + [name] -> %{type: :package, name: name, owner: nil} + end + end) +``` + +```elixir +gh_req_timeout = 500 +gh_req_mock = false + +repos = + ["membraneframework", "membraneframework-labs", "jellyfish-dev"] + |> Enum.flat_map(fn org -> + Process.sleep(gh_req_timeout) + + Req.get!( + "https://api.github.com/orgs/#{org}/repos?per_page=100", + decode_json: [keys: :atoms] + ).body + end) + |> Map.new(&{&1.name, &1}) +``` + +```elixir +package_names = + packages |> Enum.filter(&(&1.type == :package)) |> Enum.map(& &1.name) |> MapSet.new() + +lacking_repos = + repos + |> Map.values() + |> Enum.filter(&(&1.owner.login == "membraneframework")) + |> Enum.map(& &1.name) + |> Enum.reject(&(&1 in package_names)) + |> Enum.reject( + &Enum.any?( + [ + "circleci-orb", + "guide", + "design-system", + ~r/.*_tutorial/, + "membrane_resources", + "membrane_gigachad", + "static", + "membrane_videoroom", + ".github", + "membraneframework.github.io" + ], + fn repo -> &1 =~ repo end + ) + ) + +require Logger + +Logger.warning( + "The following repositories from membraneframework organisation aren't mentioned in the package list: +#{Enum.join(lacking_repos, ",\n")} +" +) +``` + +```elixir +packages = + Enum.map(packages, fn + %{type: :package, name: name, owner: owner} = package -> + repo = + case Map.fetch(repos, name) do + {:ok, repo} -> + repo + + :error when owner != nil and gh_req_mock -> + %{owner: %{login: :mock}, html_url: :mock, description: :mock} + + :error when owner != nil -> + Process.sleep(gh_req_timeout) + IO.puts("Fetching https://api.github.com/repos/#{owner}/#{name}") + + Req.get!("https://api.github.com/repos/#{owner}/#{name}", decode_json: [keys: :atoms]).body + + :error -> + raise "Package #{inspect(name)} repo not found, please specify owner." + end + + hex = Req.get!("https://hex.pm/api/packages/#{name}", decode_json: [keys: :atoms]) + hex_present = hex.status == 200 + + Map.merge(package, %{ + owner: repo.owner.login, + url: repo.html_url, + description: repo.description, + hex_url: if(hex_present, do: hex.body.url), + hexdocs_url: if(hex_present, do: hex.body.docs_html_url) + }) + + other -> + other + end) +``` + +```elixir +header = """ +| Package | Description | Links | +| --- | --- | --- | +""" + +result = + packages + |> Enum.map_reduce(%{header_present: false}, fn + %{type: :markdown, content: content}, acc -> + {content, %{acc | header_present: false}} + + %{type: :package} = package, acc -> + prefix = + case package.owner do + "membraneframework-labs" -> "[Labs] " + "membraneframework" -> "" + _other -> "[Maintainer: [#{package.owner}](https://github.com/#{package.owner})] " + end + + hex_badge = + if package.hex_url, + do: + "[![Hex.pm](https://img.shields.io/hexpm/v/#{package.name}.svg)](#{package.hex_url})" + + hexdocs_badge = + if package.hexdocs_url, + do: + "[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](#{package.hexdocs_url})" + + url = "[#{package.name}](#{package.url})" + + result = """ + #{if acc.header_present, do: "", else: header}\ + | #{url} | #{prefix}#{package.description} | #{hex_badge}#{hexdocs_badge} |\ + """ + + {result, %{acc | header_present: true}} + end) + |> elem(0) + |> Enum.join("\n") + +packages_md = + """ + + + + #{result} + + + """ +``` + +```elixir +readme = File.read!("/Users/matheksm/Desktop/sm/membrane/membrane_core/README.md") + +String.replace( + readme, + ~r/(.|\n)*/m, + packages_md +) +|> Kino.Markdown.new() +``` From 04291f406d95b0c9d8deacf4bf8b161f36b6f2ea Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Tue, 29 Aug 2023 14:12:54 +0200 Subject: [PATCH 02/14] add packages list --- README.md | 229 +++++++++++++++++++++++++++++++++++++++++++++++++ example.livemd | 33 +++++++ 2 files changed, 262 insertions(+) create mode 100644 example.livemd diff --git a/README.md b/README.md index 016e0c7b3..0c29f20c0 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,235 @@ We welcome everyone to contribute to Membrane. Here are some ways to contribute: If you have any problems with Membrane Framework feel free to contact us via [Discord](https://discord.gg/nwnfVSY), [forum](https://elixirforum.com/c/elixir-framework-forums/membrane-forum/), [GitHub discussions](https://github.com/orgs/membraneframework/discussions), [X (Twitter)](https://twitter.com/ElixirMembrane) or [e-mail](mailto:info@membraneframework.org). +## All packages + +### Media agnostic packages +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_core` | The core of the framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/packages/membrane_core) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_core) | | +| `membrane_common_c` | Utilities for the native parts of Membrane | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_common_c.svg)](https://hex.pm/packages/membrane_common_c) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_common_c) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_common_c) | | +| `membrane_telemetry_metrics` | Tool for generating metrics | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_telemetry_metrics.svg)](https://hex.pm/packages/membrane_telemetry_metrics) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_telemetry_metrics) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_telemetry_metrics) | | +| `membrane_opentelemetry` | Wrapper of OpenTelemetry functions for Membrane Multimedia Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opentelemetry.svg)](https://hex.pm/packages/membrane_opentelemetry) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_opentelemetry) | | +| `bundlex` | Tool for compiling C/C++ code within Mix projects | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/packages/bundlex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/bundlex) | | +| `unifex` | Tool automatically generating NIF and CNode interfaces between C/C++ and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/unifex) | | +| `bunch` | Extension of Elixir standard library | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/packages/bunch) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/bunch) | | +| `sebex` | The ultimate assistant in Membrane Framework releasing & development | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/sebex) | | +| `Beamchmark` | Tool for measuring BEAM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/packages/beamchmark) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/beamchmark) | | + +### Plugins + +Membrane plugins are packages which provide the elements and bins that can be used in pipelines built with the Membrane Framework. These plugins can provide various multimedia processing capabilities and help in dealing with various formats, +codecs, protocols, containers and external APIs. + +#### Media agnostic + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_file_plugin` | Plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/packages/membrane_file_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_file_plugin) | | +| `membrane_udp_plugin` | Plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/packages/membrane_udp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin) [![![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_udp_plugin) | | +| `membrane_hackney_plugin` | HTTP sink and source based on Hackney library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hackney_plugin.svg)](https://hex.pm/packages/membrane_hackney_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hackney_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_hackney_plugin) | | +| `membrane_scissors_plugin` | Element for cutting off parts of the stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_scissors_plugin.svg)](https://hex.pm/packages/membrane_scissors_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_scissors_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_scissors_plugin) | | +| `membrane_tee_plugin ` | Plugin for splitting data from a single input to multiple outputs | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_tee_plugin.svg)](https://hex.pm/packages/membrane_tee_plugin ) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_tee_plugin ) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_tee_plugin) | | +| `membrane_funnel_plugin` | Plugin for merging multiple input streams into a single output | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_funnel_plugin.svg)](https://hex.pm/packages/membrane_funnel_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_funnel_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_funnel_plugin) | | +| `membrane_realtimer_plugin` | Membrane element limiting playback speed to realtime, according to buffers' timestamps | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_realtimer_plugin.svg)](https://hex.pm/packages/membrane_realtimer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_realtimer_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_realtimer_plugin) | | +| `membrane_stream_plugin` | Plugin for dumping and restoring a Membrane Stream to and from a binary format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_stream_plugin.svg)](https://hex.pm/packages/membrane_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_stream_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_stream_plugin) | | +| `membrane_fake_plugin` | Plugin with fake sink elements that consume & drop incoming data | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_fake_plugin.svg)](https://hex.pm/packages/membrane_fake_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_fake_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_fake_plugin) | | +| `membrane_pcap_plugin` | [Experimental] Plugin for reading files in pcap format | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_pcap_plugin) | | +| `membrane_live_framerate_converter_plugin` | [Third-Party] [Experimental] Plugin for producing a stable output framerate | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_live_framerate_converter_plugin) | | +| `membrane_node_proxy` | [Third-Party] [Experimental] Plugin providing a mechanism for starting and connecting sources and sinks that span Erlang nodes | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/geometerio/membrane_node_proxy) | | + +#### Media network protocols & containers + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_rtp_plugin` | Membrane bins and elements for handling RTP and RTCP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_plugin.svg)](https://hex.pm/packages/membrane_rtp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_plugin) | | +| `membrane_rtp_h264_plugin` | RTP payloader and depayloader for H264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_h264_plugin.svg)](https://hex.pm/packages/membrane_rtp_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_h264_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_h264_plugin) | | +| `membrane_rtp_vp8_plugin` | RTP payloader and depayloader for VP8 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_vp8_plugin.svg)](https://hex.pm/packages/membrane_rtp_vp8_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_vp8_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_vp8_plugin) | | +| `membrane_rtp_vp9_plugin` | RTP payloader and depayloader for VP9 | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_rtp_vp9_plugin) | | +| `membrane_rtp_mpegaudio_plugin` | RTP MPEG Audio depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_mpegaudio_plugin.svg)](https://hex.pm/packages/membrane_rtp_mpegaudio_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_mpegaudio_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_mpegaudio_plugin) | | +| `membrane_rtp_opus_plugin` | RTP payloader and depayloader for OPUS audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_opus_plugin.svg)](https://hex.pm/packages/membrane_rtp_opus_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_opus_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_opus_plugin) | | +| `membrane_rtmp_plugin` | Plugin for receiving, demuxing, parsing and streaming RTMP streams. Includes TCP server for handling connections| [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtmp_plugin.svg)](https://hex.pm/packages/membrane_rtmp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtmp_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtmp_plugin) | | +| `membrane_mpegts_plugin` | MPEG-TS demuxer | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegts_plugin.svg)](https://hex.pm/packages/membrane_mpegts_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegts_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mpegts_plugin) | | +| `membrane_mp4_plugin` | Utilities for MP4 container parsing and serialization and elements for muxing the stream to CMAF | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_plugin.svg)](https://hex.pm/packages/membrane_mp4_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp4_plugin) | | +| `membrane_http_adaptive_stream_plugin` | Plugin generating manifests for HLS (DASH support planned) | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_http_adaptive_stream_plugin.svg)](https://hex.pm/packages/membrane_http_adaptive_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_http_adaptive_stream_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin) | | +| `membrane_matroska_plugin` | Plugin for muxing audio and video streams to Matroska container and demuxing matroska stream to audio and video | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_plugin.svg)](https://hex.pm/packages/membrane_matroska_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_matroska_plugin) | | +| `membrane_flv_plugin` | Plugin for muxing audio and video streams to FLV format and demuxing FLV stream to audio and video | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flv_plugin.svg)](https://hex.pm/packages/membrane_flv_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flv_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_flv_plugin) | | +| `membrane_ivf_plugin` | Plugin for serializing and deserializng Indeo Video Format stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ivf_plugin.svg)](https://hex.pm/packages/membrane_ivf_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ivf_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ivf_plugin) | | +| `membrane_ogg_plugin` | [Experimental] Ogg demuxer and parser | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_ogg_plugin) | | +| `membrane_quic_plugin` | [Experimental] Plugin containing elements for sending and receiving data over QUIC. It contains also QUIC server | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/mickel8/membrane_quic_plugin) | | +| `membrane_hls_plugin` | [Third-Party] [Alpha] Membrane.HLS.Source element for HTTP Live Streaming (HLS) playlist files | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_hls_plugin) | | +| `membrane_ogg_plugin` | [Third-Party] [Alpha] Ogg plugin based on the libogg | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/ledhed2222/membrane_ogg_plugin) | | + +#### Audio codecs + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_aac_plugin` | AAC parser and complementary elements for AAC codec | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_plugin.svg)](https://hex.pm/packages/membrane_aac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_aac_plugin) | | +| `membrane_aac_fdk_plugin` | AAC decoder and encoder based on FDK library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_fdk_plugin.svg)](https://hex.pm/packages/membrane_aac_fdk_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_fdk_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_aac_fdk_plugin) | | +| `membrane_flac_plugin` | Parser for files in FLAC bitstream format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_plugin.svg)](https://hex.pm/packages/membrane_flac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_flac_plugin) | | +| `membrane_mp3_lame_plugin` | Membrane MP3 encoder based on Lame | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_lame_plugin.svg)](https://hex.pm/packages/membrane_mp3_lame_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_lame_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp3_lame_plugin) | | +| `membrane_mp3_mad_plugin` | Membrane MP3 decoder based on MAD | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_mad_plugin.svg)](https://hex.pm/packages/membrane_mp3_mad_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_mad_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp3_mad_plugin) | | +| `membrane_element_mpegaudioparse` | Element capable of parsing bytestream into MPEG audio frames | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_mpegaudioparse.svg)](https://hex.pm/packages/membrane_element_mpegaudioparse) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_mpegaudioparse) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-mpegaudioparse) | | +| `membrane_opus_plugin` | Opus encoder, decoder and parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_plugin.svg)](https://hex.pm/packages/membrane_opus_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_opus_plugin) | | +| `membrane_wav_plugin` | WAV parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_wav_plugin.svg)](https://hex.pm/packages/membrane_wav_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_wav_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_wav_plugin) | | + + +#### Video codecs + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_h264_ffmpeg_plugin` | Membrane H264 parser, decoder and encoder based on FFmpeg and x264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_ffmpeg_plugin.svg)](https://hex.pm/packages/membrane_h264_ffmpeg_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_ffmpeg_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_h264_ffmpeg_plugin) | | +| `membrane_h264_plugin` | Pure Elixir Membrane H264 parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_plugin.svg)](https://hex.pm/packages/membrane_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_h264_plugin) | | +| `turbojpeg` | [Third-party] libjpeg-turbo bindings for Elixir by Binary Noggin | [![Hex.pm](https://img.shields.io/hexpm/v/turbojpeg.svg)](https://hex.pm/packages/turbojpeg) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/turbojpeg/readme.html) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/binarynoggin/elixir-turbojpeg) | | +| `membrane_subtitle_mixer_plugin`| [Third-party] [Alpha] Plugin that uses CEA708 to merge subtitles directly in H264 packets | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_subtitle_mixer_plugin) | | +| `membrane_mpeg_ts_plugin` | [Third-party] [Alpha] MPEG-TS Demuxer | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_mpeg_ts_plugin) | | + + +#### Raw + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_generator_plugin` | Video and audio samples generator | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_generator_plugin.svg)](https://hex.pm/packages/membrane_generator_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_generator_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_generator_plugin) | | + +##### Raw audio + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_portaudio_plugin` | Raw audio retriever and player based on PortAudio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_portaudio_plugin.svg)](https://hex.pm/packages/membrane_portaudio_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_portaudio_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_portaudio_plugin) | | +| `membrane_ffmpeg_swresample_plugin` | Plugin performing audio conversion, resampling and channel mixing, using SWResample module of FFmpeg library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swresample_plugin.svg)](https://hex.pm/packages/membrane_ffmpeg_swresample_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swresample_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ffmpeg_swresample_plugin) | | +| `membrane_audiometer_plugin` | Elements for measuring the level of the audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audiometer_plugin.svg)](https://hex.pm/packages/membrane_audiometer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audiometer_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_audiometer_plugin) | | +| `membrane_audio_mix_plugin` | Elements for mixing audio streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_mix_plugin.svg)](https://hex.pm/packages/membrane_audio_mix_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_mix_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_audio_mix_plugin) | | +| `membrane_element_fade` | [Experimental] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-fade) | | + +##### Raw video + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_sdl_plugin` | Membrane video player based on SDL | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_sdl_plugin.svg)](https://hex.pm/packages/membrane_sdl_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_sdl_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_sdl_plugin) | | +| `membrane_raw_video_parser_plugin` | Plugin for parsing raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_parser_plugin.svg)](https://hex.pm/packages/membrane_raw_video_parser_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_parser_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_raw_video_parser_plugin) | | +| `membrane_ffmpeg_swscale_plugin` | Plugin for scaling raw video streams and converting raw video format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swscale_plugin.svg)](https://hex.pm/packages/membrane_ffmpeg_swscale_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swscale_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ffmpeg_swscale_plugin) | | +| `membrane_framerate_converter_plugin` | Plugin for adjusting the framerate of raw video stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_framerate_converter_plugin.svg)](https://hex.pm/packages/membrane_framerate_converter_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_framerate_converter_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_framerate_converter_plugin) | | +| `membrane_video_merger_plugin` | Plugin for cutting and merging raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_merger_plugin.svg)](https://hex.pm/packages/membrane_video_merger_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_merger_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_video_merger_plugin) | | +| `membrane_camera_capture_plugin` | This plugin can be used to capture video stream from an input device | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_camera_capture_plugin.svg)](https://hex.pm/packages/membrane_camera_capture_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_camera_capture_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_camera_capture_plugin) | | +| `membrane_ffmpeg_video_filter_plugin` | This plugin contains elements providing video filters based on ffmpeg video filter feature | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_video_filter_plugin.svg)](https://hex.pm/packages/membrane_ffmpeg_video_filter_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_video_filter_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ffmpeg_video_filter_plugin) | | +| `membrane_video_compositor_plugin` | [Alpha] WGPU based plugin for composing, transforming and editing multiple raw videos in real time | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_video_compositor_plugin) | | +| `membrane_video_mixer_plugin` | [Experimental] [Third-Party] Element which mixes multiple video inputs to a single output using ffmpeg filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_mixer_plugin.svg)](https://hex.pm/packages/membrane_video_mixer_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_video_mixer_plugin) | | + +#### External APIs + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_element_gcloud_speech_to_text` | Plugin providing speech recognition via Google Cloud Speech-to-Text API | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_gcloud_speech_to_text.svg)](https://hex.pm/packages/membrane_element_gcloud_speech_to_text) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_gcloud_speech_to_text) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_element_gcloud_speech_to_text) | | +| `membrane_element_ibm_speech_to_text` | Plugin providing speech recognition via IBM Cloud Speech-to-Text service | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_ibm_speech_to_text.svg)](https://hex.pm/packages/membrane_element_ibm_speech_to_text) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_ibm_speech_to_text) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_element_ibm_speech_to_text) | | +| `membrane_s3_plugin` | [Third-Party] Plugin providing sink that writes to Amazon S3 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_s3_plugin.svg)](https://hex.pm/packages/membrane_s3_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_s3_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/YuzuTen/membrane_s3_plugin) | | +| `membrane_transcription` | [Third-Party] [Experimental] Plugin based on Whisper allowing creating transcriptions | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/lawik/membrane_transcription) | | +| `xturn_membrane` | [Third-Party] [Experimental] Experimental Membrane source / sink for XTurn | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/xirsys/xturn-membrane) | | + + +### Formats + +| Package | Description | Links | +|---|---|---| +| `membrane_raw_audio_format` | Raw audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_format.svg)](https://hex.pm/packages/membrane_raw_audio_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_raw_audio_format) | +| `membrane_raw_video_format` | Raw video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_format.svg)](https://hex.pm/packages/membrane_raw_video_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_raw_video_format) | +| `membrane_aac_format` | Advanced Audio Codec format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_format.svg)](https://hex.pm/packages/membrane_aac_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_aac_format) | +| `membrane_mp4_format` | MPEG-4 container format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_format.svg)](https://hex.pm/packages/membrane_mp4_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp4_format) | +| `membrane_opus_format` | Opus audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_format.svg)](https://hex.pm/packages/membrane_opus_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_opus_format) | +| `membrane_rtp_format` | Real-time Transport Protocol format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_format.svg)](https://hex.pm/packages/membrane_rtp_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_format) | +| `membrane_mpegaudio_format` | MPEG audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegaudio_format.svg)](https://hex.pm/packages/membrane_mpegaudio_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegaudio_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mpegaudio_format) | +| `membrane_h264_format` | H264 video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_format.svg)](https://hex.pm/packages/membrane_h264_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_h264_format) | +| `membrane_cmaf_format` | CMAF definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_cmaf_format.svg)](https://hex.pm/packages/membrane_cmaf_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_cmaf_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_cmaf_format) | +| `membrane_matroska_format` | Matroska format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_format.svg)](https://hex.pm/packages/membrane_matroska_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_matroska_format) | +| `membrane_vp8_format` | VP8 Format Description | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp8_format.svg)](https://hex.pm/packages/membrane_vp8_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp8_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_vp8_format) | +| `membrane_vp9_format` | VP9 Format Description | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp9_format.svg)](https://hex.pm/packages/membrane_vp9_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp9_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_vp9_format) | + + +### Apps, protocols & plugins' utilities + +| Package | Description | Links | Used By | +|---|---|---|---| +| `ex_sdp` | Parser and serializer for Session Description Protocol | [![Hex.pm](https://img.shields.io/hexpm/v/ex_sdp.svg)](https://hex.pm/packages/ex_sdp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_sdp) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_sdp) | | +| `ex_libnice` | Libnice-based Interactive Connectivity Establishment (ICE) protocol support for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libnice.svg)](https://hex.pm/packages/ex_libnice) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libnice) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_libnice) | | +| `ex_libsrtp` | Elixir bindings for [libsrtp](https://github.com/cisco/libsrtp) | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libsrtp.svg)](https://hex.pm/packages/ex_libsrtp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libsrtp) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_libsrtp) | | +| `ex_dtls` | DTLS and DTLS-SRTP handshake library for Elixir, based on OpenSSL | [![Hex.pm](https://img.shields.io/hexpm/v/ex_dtls.svg)](https://hex.pm/packages/ex_dtls) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_dtls) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_dtls) | | +| `membrane_rtsp` | RTSP client for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtsp.svg)](https://hex.pm/packages/membrane_rtsp) [![API Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtsp/) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtsp) | | +| `membrane_common_audiomix` | [Experimental] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-common-audiomix) | | +| `membrane_ffmpeg_generator` | FFmpeg video and audio generator for tests, benchmarks and demos. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_generator.svg)](https://hex.pm/packages/membrane_ffmpeg_generator) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_generator/) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_ffmpeg_generator) | | +| `membrane_telemetry_dashboard` | Introduction to integrating `membrane_timescaledb_reporter` repository with `membrane_dashboard` to monitor your pipeline behaviour | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_telemetry_dashboard) | | +| `membrane_webrtc_server` | Signalling server for WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_server.svg)](https://hex.pm/packages/membrane_webrtc_server) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_server) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/webrtc-server) | | + + +### Jellyfish + +Jellyfish is a GitHub organization containing Membrane WebRTC-related repositories, focusing on creating a standalone media server. + +#### Plugins +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_rtc_engine` | RTC Engine and its client library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtc_engine.svg)](https://hex.pm/packages/membrane_rtc_engine) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtc_engine) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtc_engine) | | +| `membrane_webrtc_plugin` | [Alpha] Plugin for sending and receiving media with WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/packages/membrane_webrtc_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_webrtc_plugin) | | +| `membrane_ice_plugin` | Plugin for ICE protocol | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ice_plugin.svg)](https://hex.pm/packages/membrane_ice_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ice_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ice_plugin) | | + +#### Libraries +| Package | Description | Links | Used By | +|---|---|---|---| +| `fake_turn` | STUN and TURN library for Erlang / Elixir | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/fake_turn) | | +| `membrane_rtc_engine_timescaledb` | Functions which allow storing `Membrane.RTC.Engine` metrics reports in a database | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtc_engine_timescaledb.svg)](https://hex.pm/packages/membrane_rtc_engine_timescaledb) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtc_engine_timescaledb) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtc_engine_timescaledb) | | +| `jellyfish ` | [In progress] Standalone media server | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/jellyfish-dev/jellyfish) | | + + +#### RTC Engine clients + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane-webrtc-js` | JS/TS client library for Membrane RTC Engine | [![NPM version](https://img.shields.io/npm/v/@membraneframework/membrane-webrtc-js)](https://www.npmjs.com/package/@membraneframework/membrane-webrtc-js) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-webrtc-js/) | | +| `membrane-webrtc-ios` | Membrane WebRTC client compatible with Membrane RTC Engine | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-webrtc-ios) | | +| `membrane-webrtc-android` | Membrane WebRTC client compatible with Membrane RTC Engine | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-webrtc-android) | | +| `react-native-membrane-webrtc` | React Native wrapper for `membrane-webrtc-ios` and `membrane-webrtc-android` | [![NPM version](https://img.shields.io/npm/v/@membraneframework/react-native-membrane-webrtc)](https://www.npmjs.com/package/@membraneframework/react-native-membrane-webrtc) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/react-native-membrane-webrtc) | | + +#### Book +| Package | Description | Links | +|---|---|---| +| `Jellybook` | Theoretical concepts behind general purpose media server. | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/jellyfish-dev/book) | + + +### RTC Engine based applications + +| Package | Description | Links | Used By | +|---|---|---|---| +| `membrane_videoroom` | Video conferencing platform using WebRTC | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_videoroom/) | | +| `membrane_live` | [Alpha] Webinar app in React, Phoenix and Membrane | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_live/) | | + + +### Tutorials + +| Package | Description | Links | +|---|---|---| +| `membrane_tutorials` | Repository with tutorials text | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_tutorials) | +| `membrane_basic_pipeline_tutorial` | Code used in the comprehensive basic pipeline tutorial | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_basic_pipeline_tutorial) | +| `membrane_videoroom_tutorial` | Code used in the videroom tutorial | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_videoroom_tutorial) | +| `membrane_webrtc_tutorial` | Code used in the webrtc tutorial | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_webrtc_tutorial) | + +### No longer mantained + +| Package | Description | Links | +|---|---|---| +| `membrane_libnice_plugin` | Replaced by `membrane_ice_plugin` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_libnice_plugin.svg)](https://hex.pm/packages/membrane_libnice_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_libnice_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_libnice_plugin) | +| `membrane_element_httpoison` | Replaced by `membrane_element_hackney` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_httpoison.svg)](https://hex.pm/packages/membrane_element_httpoison) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_libnice_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_element_httpoison) | +| `membrane_dtls_plugin` | DTLS and DTLS-SRTP handshake implementation for Membrane ICE plugin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_dtls_plugin.svg)](https://hex.pm/packages/membrane_dtls_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_httpoison) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_element_httpoison) | +| `membrane_loggers` | Replaced by the `Membrane.Logger` in Membrane Core | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_loggers.svg)](https://hex.pm/packages/membrane_loggers) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_loggers) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_loggers) | +| `membrane_caps_audio_flac` | [Suspended] FLAC audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_caps_audio_flac.svg)](https://hex.pm/packages/membrane_caps_audio_flac) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_caps_audio_flac) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-caps-audio-flac) | +| `membrane_remote_stream_format` | Content of this package has been moved to `membrane_core` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_remote_stream_format.svg)](https://hex.pm/packages/membrane_remote_stream_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_remote_stream_format) | +| `membrane_element_rtp_jitter_buffer`| Package has become part of `membrane_rtp_plugin` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_rtp_jitter_buffer.svg)](https://hex.pm/packages/membrane_element_rtp_jitter_buffer) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_rtp_jitter_buffer) | +| `membrane_bin_rtp` | Package has become part of `membrane_rtp_plugin` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_bin_rtp.svg)](https://hex.pm/packages/membrane_bin_rtp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_bin_rtp) | +| `membrane_element_icecast` | [Experimental] Element capable of sending a stream into Icecast streaming server | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-icecast) | +| `membrane_element_live_audiomixer` | Simple mixer that combines audio from different sources | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-live-audiomixer) | +| `membrane_element_msdk_h264` | [Experimental] Hardware-accelerated H.264 encoder based on IntelMediaSDK | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-msdk-h264) | +| `membrane_rtp_aac_plugin` | [Alpha] RTP AAC depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_aac_plugin.svg)](https://hex.pm/packages/membrane_rtp_aac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_aac_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_rtp_aac_plugin) | +| `membrane_element_flac_encoder` | [Suspended] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-flac-encoder) | +| `membrane_protocol_icecast` | [Suspended] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-protocol-icecast) | +| `membrane_server_icecast` | [Suspended] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-server-icecast) | + ## Copyright and License Copyright 2018, [Software Mansion](https://swmansion.com/?utm_source=git&utm_medium=readme&utm_campaign=membrane) diff --git a/example.livemd b/example.livemd new file mode 100644 index 000000000..bf3537bb0 --- /dev/null +++ b/example.livemd @@ -0,0 +1,33 @@ +# Membrane Quick Start + +```elixir +Logger.configure(level: :info) +Mix.install([ + :membrane_hackney_plugin, + :membrane_mp3_mad_plugin, + :membrane_portaudio_plugin, +]) +``` + +## Play mp3 + +```elixir +import Membrane.ChildrenSpec +alias Membrane.RCPipeline + +mp3_url = "https://raw.githubusercontent.com/membraneframework/membrane_demo/master/simple_pipeline/sample.mp3" + +pipeline = RCPipeline.start_link!() + +RCPipeline.exec_actions(pipeline, spec: + child(%Membrane.Hackney.Source{location: mp3_url, hackney_opts: [follow_redirect: true]}) + |> child(Membrane.MP3.MAD.Decoder) + |> child(:player, Membrane.PortAudio.Sink) +) +``` + +## Terminate the pipeline + +```elixir +RCPipeline.terminate(pipeline) +``` From bec9472b1d760065055082e0151ba64ee3961d9f Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Wed, 30 Aug 2023 11:56:22 +0200 Subject: [PATCH 03/14] update example --- README.md | 2 +- example.livemd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0c29f20c0..8cfec2622 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This is an [Elixir](elixir-lang.org) snippet, that streams an mp3 via HTTP and p - Option 1: Click the button below: - [![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fmembraneframework%2F.github%2Fblob%2Freadme%2Fprofile%2Fquick_start.livemd) + [![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2Fmembraneframework%2Fmembrane_core%2Fblob%2Freadme%2Fexample.livemd) It will install [Livebook](livebook.dev), an interactive notebook similar to Jupyter, and it'll open the snippet in there for you. Then just click the 'run' button in there. diff --git a/example.livemd b/example.livemd index bf3537bb0..0b811c691 100644 --- a/example.livemd +++ b/example.livemd @@ -22,7 +22,7 @@ pipeline = RCPipeline.start_link!() RCPipeline.exec_actions(pipeline, spec: child(%Membrane.Hackney.Source{location: mp3_url, hackney_opts: [follow_redirect: true]}) |> child(Membrane.MP3.MAD.Decoder) - |> child(:player, Membrane.PortAudio.Sink) + |> child(Membrane.PortAudio.Sink) ) ``` From 7c2b3286fc07052dea5a1ea0bc2aa52e64a5a387 Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Mon, 4 Sep 2023 19:07:24 +0200 Subject: [PATCH 04/14] add package list generator --- README.md | 349 +++++++++++++++------------------------ update_packages_list.exs | 285 ++++++++++++++++++++++++++++++++ 2 files changed, 417 insertions(+), 217 deletions(-) create mode 100644 update_packages_list.exs diff --git a/README.md b/README.md index 8cfec2622..951546580 100644 --- a/README.md +++ b/README.md @@ -128,232 +128,147 @@ If you have any problems with Membrane Framework feel free to contact us via [Di ## All packages -### Media agnostic packages -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_core` | The core of the framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/packages/membrane_core) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_core) | | -| `membrane_common_c` | Utilities for the native parts of Membrane | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_common_c.svg)](https://hex.pm/packages/membrane_common_c) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_common_c) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_common_c) | | -| `membrane_telemetry_metrics` | Tool for generating metrics | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_telemetry_metrics.svg)](https://hex.pm/packages/membrane_telemetry_metrics) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_telemetry_metrics) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_telemetry_metrics) | | -| `membrane_opentelemetry` | Wrapper of OpenTelemetry functions for Membrane Multimedia Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opentelemetry.svg)](https://hex.pm/packages/membrane_opentelemetry) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_opentelemetry) | | -| `bundlex` | Tool for compiling C/C++ code within Mix projects | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/packages/bundlex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/bundlex) | | -| `unifex` | Tool automatically generating NIF and CNode interfaces between C/C++ and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/unifex) | | -| `bunch` | Extension of Elixir standard library | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/packages/bunch) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/bunch) | | -| `sebex` | The ultimate assistant in Membrane Framework releasing & development | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/sebex) | | -| `Beamchmark` | Tool for measuring BEAM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/packages/beamchmark) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/beamchmark) | | + + +### General +| Package | Description | Links | +| --- | --- | --- | +| [membrane_core](https://github.com/membraneframework/membrane_core) | The core of the Membrane Framework, advanced multimedia processing framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/api/packages/membrane_core)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core/) | +| [kino_membrane](https://github.com/membraneframework/kino_membrane) | Utilities for introspecting Membrane pipelines in Livebook | [![Hex.pm](https://img.shields.io/hexpm/v/kino_membrane.svg)](https://hex.pm/api/packages/kino_membrane)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/kino_membrane/) | +| [docker_membrane](https://github.com/membraneframework-labs/docker_membrane) | [Labs] A docker image based on Ubuntu, with Erlang, Elixir and libraries necessary to test and run the Membrane Framework. | | +| [membrane_demo](https://github.com/membraneframework/membrane_demo) | Examples of using the Membrane Framework | | +| [membrane_tutorials](https://github.com/membraneframework/membrane_tutorials) | Repository which contains text and assets used in Membrane Framework tutorials. | | ### Plugins - -Membrane plugins are packages which provide the elements and bins that can be used in pipelines built with the Membrane Framework. These plugins can provide various multimedia processing capabilities and help in dealing with various formats, -codecs, protocols, containers and external APIs. - -#### Media agnostic - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_file_plugin` | Plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/packages/membrane_file_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_file_plugin) | | -| `membrane_udp_plugin` | Plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/packages/membrane_udp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin) [![![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_udp_plugin) | | -| `membrane_hackney_plugin` | HTTP sink and source based on Hackney library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hackney_plugin.svg)](https://hex.pm/packages/membrane_hackney_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hackney_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_hackney_plugin) | | -| `membrane_scissors_plugin` | Element for cutting off parts of the stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_scissors_plugin.svg)](https://hex.pm/packages/membrane_scissors_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_scissors_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_scissors_plugin) | | -| `membrane_tee_plugin ` | Plugin for splitting data from a single input to multiple outputs | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_tee_plugin.svg)](https://hex.pm/packages/membrane_tee_plugin ) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_tee_plugin ) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_tee_plugin) | | -| `membrane_funnel_plugin` | Plugin for merging multiple input streams into a single output | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_funnel_plugin.svg)](https://hex.pm/packages/membrane_funnel_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_funnel_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_funnel_plugin) | | -| `membrane_realtimer_plugin` | Membrane element limiting playback speed to realtime, according to buffers' timestamps | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_realtimer_plugin.svg)](https://hex.pm/packages/membrane_realtimer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_realtimer_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_realtimer_plugin) | | -| `membrane_stream_plugin` | Plugin for dumping and restoring a Membrane Stream to and from a binary format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_stream_plugin.svg)](https://hex.pm/packages/membrane_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_stream_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_stream_plugin) | | -| `membrane_fake_plugin` | Plugin with fake sink elements that consume & drop incoming data | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_fake_plugin.svg)](https://hex.pm/packages/membrane_fake_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_fake_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_fake_plugin) | | -| `membrane_pcap_plugin` | [Experimental] Plugin for reading files in pcap format | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_pcap_plugin) | | -| `membrane_live_framerate_converter_plugin` | [Third-Party] [Experimental] Plugin for producing a stable output framerate | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_live_framerate_converter_plugin) | | -| `membrane_node_proxy` | [Third-Party] [Experimental] Plugin providing a mechanism for starting and connecting sources and sinks that span Erlang nodes | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/geometerio/membrane_node_proxy) | | - -#### Media network protocols & containers - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_rtp_plugin` | Membrane bins and elements for handling RTP and RTCP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_plugin.svg)](https://hex.pm/packages/membrane_rtp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_plugin) | | -| `membrane_rtp_h264_plugin` | RTP payloader and depayloader for H264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_h264_plugin.svg)](https://hex.pm/packages/membrane_rtp_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_h264_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_h264_plugin) | | -| `membrane_rtp_vp8_plugin` | RTP payloader and depayloader for VP8 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_vp8_plugin.svg)](https://hex.pm/packages/membrane_rtp_vp8_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_vp8_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_vp8_plugin) | | -| `membrane_rtp_vp9_plugin` | RTP payloader and depayloader for VP9 | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_rtp_vp9_plugin) | | -| `membrane_rtp_mpegaudio_plugin` | RTP MPEG Audio depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_mpegaudio_plugin.svg)](https://hex.pm/packages/membrane_rtp_mpegaudio_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_mpegaudio_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_mpegaudio_plugin) | | -| `membrane_rtp_opus_plugin` | RTP payloader and depayloader for OPUS audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_opus_plugin.svg)](https://hex.pm/packages/membrane_rtp_opus_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_opus_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_opus_plugin) | | -| `membrane_rtmp_plugin` | Plugin for receiving, demuxing, parsing and streaming RTMP streams. Includes TCP server for handling connections| [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtmp_plugin.svg)](https://hex.pm/packages/membrane_rtmp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtmp_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtmp_plugin) | | -| `membrane_mpegts_plugin` | MPEG-TS demuxer | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegts_plugin.svg)](https://hex.pm/packages/membrane_mpegts_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegts_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mpegts_plugin) | | -| `membrane_mp4_plugin` | Utilities for MP4 container parsing and serialization and elements for muxing the stream to CMAF | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_plugin.svg)](https://hex.pm/packages/membrane_mp4_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp4_plugin) | | -| `membrane_http_adaptive_stream_plugin` | Plugin generating manifests for HLS (DASH support planned) | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_http_adaptive_stream_plugin.svg)](https://hex.pm/packages/membrane_http_adaptive_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_http_adaptive_stream_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin) | | -| `membrane_matroska_plugin` | Plugin for muxing audio and video streams to Matroska container and demuxing matroska stream to audio and video | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_plugin.svg)](https://hex.pm/packages/membrane_matroska_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_matroska_plugin) | | -| `membrane_flv_plugin` | Plugin for muxing audio and video streams to FLV format and demuxing FLV stream to audio and video | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flv_plugin.svg)](https://hex.pm/packages/membrane_flv_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flv_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_flv_plugin) | | -| `membrane_ivf_plugin` | Plugin for serializing and deserializng Indeo Video Format stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ivf_plugin.svg)](https://hex.pm/packages/membrane_ivf_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ivf_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ivf_plugin) | | -| `membrane_ogg_plugin` | [Experimental] Ogg demuxer and parser | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_ogg_plugin) | | -| `membrane_quic_plugin` | [Experimental] Plugin containing elements for sending and receiving data over QUIC. It contains also QUIC server | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/mickel8/membrane_quic_plugin) | | -| `membrane_hls_plugin` | [Third-Party] [Alpha] Membrane.HLS.Source element for HTTP Live Streaming (HLS) playlist files | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_hls_plugin) | | -| `membrane_ogg_plugin` | [Third-Party] [Alpha] Ogg plugin based on the libogg | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/ledhed2222/membrane_ogg_plugin) | | - +#### General purpose +| Package | Description | Links | +| --- | --- | --- | +| [membrane_file_plugin](https://github.com/membraneframework/membrane_file_plugin) | Membrane plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/api/packages/membrane_file_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin/) | +| [membrane_udp_plugin](https://github.com/membraneframework/membrane_udp_plugin) | Membrane plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/api/packages/membrane_udp_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin/) | +| [membrane_hackney_plugin](https://github.com/membraneframework/membrane_hackney_plugin) | HTTP sink and source based on Hackney | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hackney_plugin.svg)](https://hex.pm/api/packages/membrane_hackney_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hackney_plugin/) | +| [membrane_scissors_plugin](https://github.com/membraneframework/membrane_scissors_plugin) | Element for cutting off parts of the stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_scissors_plugin.svg)](https://hex.pm/api/packages/membrane_scissors_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_scissors_plugin/) | +| [membrane_tee_plugin](https://github.com/membraneframework/membrane_tee_plugin) | Membrane plugin for splitting data from a single input to multiple outputs | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_tee_plugin.svg)](https://hex.pm/api/packages/membrane_tee_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_tee_plugin/) | +| [membrane_funnel_plugin](https://github.com/membraneframework/membrane_funnel_plugin) | Membrane plugin for merging multiple input streams into a single output | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_funnel_plugin.svg)](https://hex.pm/api/packages/membrane_funnel_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_funnel_plugin/) | +| [membrane_realtimer_plugin](https://github.com/membraneframework/membrane_realtimer_plugin) | Membrane element limiting playback speed to realtime, according to buffers' timestamps | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_realtimer_plugin.svg)](https://hex.pm/api/packages/membrane_realtimer_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_realtimer_plugin/) | +| [membrane_stream_plugin](https://github.com/membraneframework/membrane_stream_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_stream_plugin.svg)](https://hex.pm/api/packages/membrane_stream_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_stream_plugin/) | +| [membrane_fake_plugin](https://github.com/membraneframework/membrane_fake_plugin) | Fake Membrane sinks that drop incoming data | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_fake_plugin.svg)](https://hex.pm/api/packages/membrane_fake_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_fake_plugin/) | +| [membrane_pcap_plugin](https://github.com/membraneframework-labs/membrane_pcap_plugin) | [Labs] | | +| [membrane_live_framerate_converter_plugin](https://github.com/kim-company/membrane_live_framerate_converter_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that drops or duplicates frames to match a target framerate. Designed for realtime applications | | +| [membrane_template_plugin](https://github.com/membraneframework/membrane_template_plugin) | Template for Membrane Elements | | +#### Streaming protocols +| Package | Description | Links | +| --- | --- | --- | +| [membrane_webrtc_plugin](https://github.com/jellyfish-dev/membrane_webrtc_plugin) | [Maintainer: [jellyfish-dev](https://github.com/jellyfish-dev)] | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/api/packages/membrane_webrtc_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin/) | +| [membrane_rtmp_plugin](https://github.com/membraneframework/membrane_rtmp_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtmp_plugin.svg)](https://hex.pm/api/packages/membrane_rtmp_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtmp_plugin/) | +| [membrane_http_adaptive_stream_plugin](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin) | Plugin generating manifests for HLS (DASH support planned) | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_http_adaptive_stream_plugin.svg)](https://hex.pm/api/packages/membrane_http_adaptive_stream_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_http_adaptive_stream_plugin/) | +| [membrane_rtp_plugin](https://github.com/membraneframework/membrane_rtp_plugin) | Membrane bins and elements for sending and receiving RTP/SRTP and RTCP/SRTCP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_plugin/) | +| [membrane_rtp_h264_plugin](https://github.com/membraneframework/membrane_rtp_h264_plugin) | Membrane RTP payloader and depayloader for H264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_h264_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_h264_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_h264_plugin/) | +| [membrane_rtp_vp8_plugin](https://github.com/membraneframework/membrane_rtp_vp8_plugin) | RTP VP8 plugin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_vp8_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_vp8_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_vp8_plugin/) | +| [membrane_rtp_vp9_plugin](https://github.com/membraneframework-labs/membrane_rtp_vp9_plugin) | [Labs] | | +| [membrane_rtp_mpegaudio_plugin](https://github.com/membraneframework/membrane_rtp_mpegaudio_plugin) | Membrane RTP MPEG Audio depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_mpegaudio_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_mpegaudio_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_mpegaudio_plugin/) | +| [membrane_rtp_opus_plugin](https://github.com/membraneframework/membrane_rtp_opus_plugin) | Membrane RTP payloader and depayloader for OPUS audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_opus_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_opus_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_opus_plugin/) | +| [membrane_quic_plugin](https://github.com/mickel8/membrane_quic_plugin) | [Maintainer: [mickel8](https://github.com/mickel8)] | | +| [membrane_mpeg_ts_plugin](https://github.com/kim-company/membrane_mpeg_ts_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that demuxes MPEG-TS streams | | +| [membrane_hls_plugin](https://github.com/kim-company/membrane_hls_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Plugin providing a `Membrane.HLS.Source` element for HTTP Live Streaming (HLS). | | +#### Containers +| Package | Description | Links | +| --- | --- | --- | +| [membrane_mp4_plugin](https://github.com/membraneframework/membrane_mp4_plugin) | Utilities for MP4 container parsing and serialization and elements for muxing the stream to CMAF | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_plugin.svg)](https://hex.pm/api/packages/membrane_mp4_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_plugin/) | +| [membrane_matroska_plugin](https://github.com/membraneframework/membrane_matroska_plugin) | Matroska muxer and demuxer | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_plugin.svg)](https://hex.pm/api/packages/membrane_matroska_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_plugin/) | +| [membrane_flv_plugin](https://github.com/membraneframework/membrane_flv_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flv_plugin.svg)](https://hex.pm/api/packages/membrane_flv_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flv_plugin/) | +| [membrane_ivf_plugin](https://github.com/membraneframework/membrane_ivf_plugin) | Plugin for converting video stream into IVF format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ivf_plugin.svg)](https://hex.pm/api/packages/membrane_ivf_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ivf_plugin/) | +| [membrane_ogg_plugin](https://github.com/membraneframework/membrane_ogg_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ogg_plugin.svg)](https://hex.pm/api/packages/membrane_ogg_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ogg_plugin/) | #### Audio codecs - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_aac_plugin` | AAC parser and complementary elements for AAC codec | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_plugin.svg)](https://hex.pm/packages/membrane_aac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_aac_plugin) | | -| `membrane_aac_fdk_plugin` | AAC decoder and encoder based on FDK library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_fdk_plugin.svg)](https://hex.pm/packages/membrane_aac_fdk_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_fdk_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_aac_fdk_plugin) | | -| `membrane_flac_plugin` | Parser for files in FLAC bitstream format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_plugin.svg)](https://hex.pm/packages/membrane_flac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_flac_plugin) | | -| `membrane_mp3_lame_plugin` | Membrane MP3 encoder based on Lame | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_lame_plugin.svg)](https://hex.pm/packages/membrane_mp3_lame_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_lame_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp3_lame_plugin) | | -| `membrane_mp3_mad_plugin` | Membrane MP3 decoder based on MAD | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_mad_plugin.svg)](https://hex.pm/packages/membrane_mp3_mad_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_mad_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp3_mad_plugin) | | -| `membrane_element_mpegaudioparse` | Element capable of parsing bytestream into MPEG audio frames | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_mpegaudioparse.svg)](https://hex.pm/packages/membrane_element_mpegaudioparse) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_mpegaudioparse) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-mpegaudioparse) | | -| `membrane_opus_plugin` | Opus encoder, decoder and parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_plugin.svg)](https://hex.pm/packages/membrane_opus_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_opus_plugin) | | -| `membrane_wav_plugin` | WAV parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_wav_plugin.svg)](https://hex.pm/packages/membrane_wav_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_wav_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_wav_plugin) | | - - +| Package | Description | Links | +| --- | --- | --- | +| [membrane_aac_plugin](https://github.com/membraneframework/membrane_aac_plugin) | AAC parser and complementary elements for AAC codec | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_plugin.svg)](https://hex.pm/api/packages/membrane_aac_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_plugin/) | +| [membrane_aac_fdk_plugin](https://github.com/membraneframework/membrane_aac_fdk_plugin) | Membrane AAC decoder and encoder based on FDK library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_fdk_plugin.svg)](https://hex.pm/api/packages/membrane_aac_fdk_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_fdk_plugin/) | +| [membrane_flac_plugin](https://github.com/membraneframework/membrane_flac_plugin) | Parser for files in FLAC bitstream format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_plugin.svg)](https://hex.pm/api/packages/membrane_flac_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_plugin/) | +| [membrane_mp3_lame_plugin](https://github.com/membraneframework/membrane_mp3_lame_plugin) | Membrane MP3 encoder based on Lame | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_lame_plugin.svg)](https://hex.pm/api/packages/membrane_mp3_lame_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_lame_plugin/) | +| [membrane_mp3_mad_plugin](https://github.com/membraneframework/membrane_mp3_mad_plugin) | Membrane MP3 decoder based on MAD. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_mad_plugin.svg)](https://hex.pm/api/packages/membrane_mp3_mad_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_mad_plugin/) | +| [membrane_opus_plugin](https://github.com/membraneframework/membrane_opus_plugin) | Membrane Opus encoder and decoder | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_plugin.svg)](https://hex.pm/api/packages/membrane_opus_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_plugin/) | +| [membrane_wav_plugin](https://github.com/membraneframework/membrane_wav_plugin) | Plugin providing elements handling audio in WAV file format. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_wav_plugin.svg)](https://hex.pm/api/packages/membrane_wav_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_wav_plugin/) | #### Video codecs - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_h264_ffmpeg_plugin` | Membrane H264 parser, decoder and encoder based on FFmpeg and x264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_ffmpeg_plugin.svg)](https://hex.pm/packages/membrane_h264_ffmpeg_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_ffmpeg_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_h264_ffmpeg_plugin) | | -| `membrane_h264_plugin` | Pure Elixir Membrane H264 parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_plugin.svg)](https://hex.pm/packages/membrane_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_h264_plugin) | | -| `turbojpeg` | [Third-party] libjpeg-turbo bindings for Elixir by Binary Noggin | [![Hex.pm](https://img.shields.io/hexpm/v/turbojpeg.svg)](https://hex.pm/packages/turbojpeg) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/turbojpeg/readme.html) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/binarynoggin/elixir-turbojpeg) | | -| `membrane_subtitle_mixer_plugin`| [Third-party] [Alpha] Plugin that uses CEA708 to merge subtitles directly in H264 packets | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_subtitle_mixer_plugin) | | -| `membrane_mpeg_ts_plugin` | [Third-party] [Alpha] MPEG-TS Demuxer | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_mpeg_ts_plugin) | | - - -#### Raw - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_generator_plugin` | Video and audio samples generator | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_generator_plugin.svg)](https://hex.pm/packages/membrane_generator_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_generator_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_generator_plugin) | | - -##### Raw audio - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_portaudio_plugin` | Raw audio retriever and player based on PortAudio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_portaudio_plugin.svg)](https://hex.pm/packages/membrane_portaudio_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_portaudio_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_portaudio_plugin) | | -| `membrane_ffmpeg_swresample_plugin` | Plugin performing audio conversion, resampling and channel mixing, using SWResample module of FFmpeg library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swresample_plugin.svg)](https://hex.pm/packages/membrane_ffmpeg_swresample_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swresample_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ffmpeg_swresample_plugin) | | -| `membrane_audiometer_plugin` | Elements for measuring the level of the audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audiometer_plugin.svg)](https://hex.pm/packages/membrane_audiometer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audiometer_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_audiometer_plugin) | | -| `membrane_audio_mix_plugin` | Elements for mixing audio streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_mix_plugin.svg)](https://hex.pm/packages/membrane_audio_mix_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_mix_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_audio_mix_plugin) | | -| `membrane_element_fade` | [Experimental] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-fade) | | - -##### Raw video - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_sdl_plugin` | Membrane video player based on SDL | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_sdl_plugin.svg)](https://hex.pm/packages/membrane_sdl_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_sdl_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_sdl_plugin) | | -| `membrane_raw_video_parser_plugin` | Plugin for parsing raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_parser_plugin.svg)](https://hex.pm/packages/membrane_raw_video_parser_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_parser_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_raw_video_parser_plugin) | | -| `membrane_ffmpeg_swscale_plugin` | Plugin for scaling raw video streams and converting raw video format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swscale_plugin.svg)](https://hex.pm/packages/membrane_ffmpeg_swscale_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swscale_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ffmpeg_swscale_plugin) | | -| `membrane_framerate_converter_plugin` | Plugin for adjusting the framerate of raw video stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_framerate_converter_plugin.svg)](https://hex.pm/packages/membrane_framerate_converter_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_framerate_converter_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_framerate_converter_plugin) | | -| `membrane_video_merger_plugin` | Plugin for cutting and merging raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_merger_plugin.svg)](https://hex.pm/packages/membrane_video_merger_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_merger_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_video_merger_plugin) | | -| `membrane_camera_capture_plugin` | This plugin can be used to capture video stream from an input device | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_camera_capture_plugin.svg)](https://hex.pm/packages/membrane_camera_capture_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_camera_capture_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_camera_capture_plugin) | | -| `membrane_ffmpeg_video_filter_plugin` | This plugin contains elements providing video filters based on ffmpeg video filter feature | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_video_filter_plugin.svg)](https://hex.pm/packages/membrane_ffmpeg_video_filter_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_video_filter_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ffmpeg_video_filter_plugin) | | -| `membrane_video_compositor_plugin` | [Alpha] WGPU based plugin for composing, transforming and editing multiple raw videos in real time | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_video_compositor_plugin) | | -| `membrane_video_mixer_plugin` | [Experimental] [Third-Party] Element which mixes multiple video inputs to a single output using ffmpeg filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_mixer_plugin.svg)](https://hex.pm/packages/membrane_video_mixer_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/kim-company/membrane_video_mixer_plugin) | | - +| Package | Description | Links | +| --- | --- | --- | +| [membrane_h264_plugin](https://github.com/membraneframework/membrane_h264_plugin) | Membrane h264 parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_plugin.svg)](https://hex.pm/api/packages/membrane_h264_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_plugin/) | +| [membrane_h264_ffmpeg_plugin](https://github.com/membraneframework/membrane_h264_ffmpeg_plugin) | Membrane H264 parser, decoder and encoder based on FFmpeg and x264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_ffmpeg_plugin.svg)](https://hex.pm/api/packages/membrane_h264_ffmpeg_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_ffmpeg_plugin/) | +| [elixir-turbojpeg](https://github.com/BinaryNoggin/elixir-turbojpeg) | [Maintainer: [BinaryNoggin](https://github.com/BinaryNoggin)] libjpeg-turbo bindings for Elixir | | +| [membrane_subtitle_mixer_plugin](https://github.com/kim-company/membrane_subtitle_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that uses CEA708 to merge subtitles directly in H264 packets. | | +#### Raw audio & video +| Package | Description | Links | +| --- | --- | --- | +| [membrane_generator_plugin](https://github.com/membraneframework/membrane_generator_plugin) | Video and audio samples generator | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_generator_plugin.svg)](https://hex.pm/api/packages/membrane_generator_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_generator_plugin/) | +**Raw audio** +| Package | Description | Links | +| --- | --- | --- | +| [membrane_raw_audio_parser_plugin](https://github.com/membraneframework/membrane_raw_audio_parser_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_audio_parser_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_parser_plugin/) | +| [membrane_portaudio_plugin](https://github.com/membraneframework/membrane_portaudio_plugin) | Raw audio retriever and player based on PortAudio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_portaudio_plugin.svg)](https://hex.pm/api/packages/membrane_portaudio_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_portaudio_plugin/) | +| [membrane_audio_mix_plugin](https://github.com/membraneframework/membrane_audio_mix_plugin) | Plugin providing an element mixing raw audio frames. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_mix_plugin.svg)](https://hex.pm/api/packages/membrane_audio_mix_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_mix_plugin/) | +| [membrane_audio_filler_plugin](https://github.com/membraneframework/membrane_audio_filler_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_filler_plugin.svg)](https://hex.pm/api/packages/membrane_audio_filler_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_filler_plugin/) | +| [membrane_ffmpeg_swresample_plugin](https://github.com/membraneframework/membrane_ffmpeg_swresample_plugin) | Plugin performing audio conversion, resampling and channel mixing, using SWResample module of FFmpeg library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swresample_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_swresample_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swresample_plugin/) | +| [membrane_audiometer_plugin](https://github.com/membraneframework/membrane_audiometer_plugin) | Elements for measuring the level of the audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audiometer_plugin.svg)](https://hex.pm/api/packages/membrane_audiometer_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audiometer_plugin/) | +**Raw video** +| Package | Description | Links | +| --- | --- | --- | +| [membrane_raw_video_parser_plugin](https://github.com/membraneframework/membrane_raw_video_parser_plugin) | Membrane plugin for parsing raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_video_parser_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_parser_plugin/) | +| [membrane_video_merger_plugin](https://github.com/membraneframework/membrane_video_merger_plugin) | Membrane raw video cutter, merger and cut & merge bin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_merger_plugin.svg)](https://hex.pm/api/packages/membrane_video_merger_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_merger_plugin/) | +| [membrane_video_compositor_plugin](https://github.com/membraneframework/membrane_video_compositor_plugin) | Membrane plugin that accepts multiple video inputs, transforms them according to provided transformations and composes them into a single output video. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_compositor_plugin.svg)](https://hex.pm/api/packages/membrane_video_compositor_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_compositor_plugin/) | +| [membrane_camera_capture_plugin](https://github.com/membraneframework/membrane_camera_capture_plugin) | A set of elements allowing for capturing local media such as camera or microphone | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_camera_capture_plugin.svg)](https://hex.pm/api/packages/membrane_camera_capture_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_camera_capture_plugin/) | +| [membrane_framerate_converter_plugin](https://github.com/membraneframework/membrane_framerate_converter_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_framerate_converter_plugin.svg)](https://hex.pm/api/packages/membrane_framerate_converter_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_framerate_converter_plugin/) | +| [membrane_sdl_plugin](https://github.com/membraneframework/membrane_sdl_plugin) | Membrane video player based on SDL | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_sdl_plugin.svg)](https://hex.pm/api/packages/membrane_sdl_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_sdl_plugin/) | +| [membrane_ffmpeg_swscale_plugin](https://github.com/membraneframework/membrane_ffmpeg_swscale_plugin) | Plugin providing an element scaling raw video frames, using SWScale module of FFmpeg library. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swscale_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_swscale_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swscale_plugin/) | +| [membrane_ffmpeg_video_filter_plugin](https://github.com/membraneframework/membrane_ffmpeg_video_filter_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_video_filter_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_video_filter_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_video_filter_plugin/) | +| [membrane_video_mixer_plugin](https://github.com/kim-company/membrane_video_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that mixes a variable number of input videos into one output using ffmpeg filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_mixer_plugin.svg)](https://hex.pm/api/packages/membrane_video_mixer_plugin) | #### External APIs - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_element_gcloud_speech_to_text` | Plugin providing speech recognition via Google Cloud Speech-to-Text API | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_gcloud_speech_to_text.svg)](https://hex.pm/packages/membrane_element_gcloud_speech_to_text) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_gcloud_speech_to_text) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_element_gcloud_speech_to_text) | | -| `membrane_element_ibm_speech_to_text` | Plugin providing speech recognition via IBM Cloud Speech-to-Text service | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_ibm_speech_to_text.svg)](https://hex.pm/packages/membrane_element_ibm_speech_to_text) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_ibm_speech_to_text) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_element_ibm_speech_to_text) | | -| `membrane_s3_plugin` | [Third-Party] Plugin providing sink that writes to Amazon S3 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_s3_plugin.svg)](https://hex.pm/packages/membrane_s3_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_s3_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/YuzuTen/membrane_s3_plugin) | | -| `membrane_transcription` | [Third-Party] [Experimental] Plugin based on Whisper allowing creating transcriptions | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/lawik/membrane_transcription) | | -| `xturn_membrane` | [Third-Party] [Experimental] Experimental Membrane source / sink for XTurn | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/xirsys/xturn-membrane) | | - - +| Package | Description | Links | +| --- | --- | --- | +| [membrane_element_gcloud_speech_to_text](https://github.com/membraneframework/membrane_element_gcloud_speech_to_text) | Membrane plugin providing speech recognition via Google Cloud Speech-to-Text API | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_gcloud_speech_to_text.svg)](https://hex.pm/api/packages/membrane_element_gcloud_speech_to_text)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_gcloud_speech_to_text/) | +| [membrane_element_ibm_speech_to_text](https://github.com/membraneframework/membrane_element_ibm_speech_to_text) | Membrane plugin providing speech recognition via IBM Cloud Speech-to-Text service | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_ibm_speech_to_text.svg)](https://hex.pm/api/packages/membrane_element_ibm_speech_to_text)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_ibm_speech_to_text/) | +| [membrane_s3_plugin](https://github.com/YuzuTen/membrane_s3_plugin) | [Maintainer: [YuzuTen](https://github.com/YuzuTen)] Membrane framework plugin to support S3 sources/destinations | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_s3_plugin.svg)](https://hex.pm/api/packages/membrane_s3_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_s3_plugin/) | +| [membrane_transcription](https://github.com/lawik/membrane_transcription) | [Maintainer: [lawik](https://github.com/lawik)] Prototype transcription for Membrane | | ### Formats - | Package | Description | Links | -|---|---|---| -| `membrane_raw_audio_format` | Raw audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_format.svg)](https://hex.pm/packages/membrane_raw_audio_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_raw_audio_format) | -| `membrane_raw_video_format` | Raw video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_format.svg)](https://hex.pm/packages/membrane_raw_video_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_raw_video_format) | -| `membrane_aac_format` | Advanced Audio Codec format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_format.svg)](https://hex.pm/packages/membrane_aac_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_aac_format) | -| `membrane_mp4_format` | MPEG-4 container format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_format.svg)](https://hex.pm/packages/membrane_mp4_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mp4_format) | -| `membrane_opus_format` | Opus audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_format.svg)](https://hex.pm/packages/membrane_opus_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_opus_format) | -| `membrane_rtp_format` | Real-time Transport Protocol format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_format.svg)](https://hex.pm/packages/membrane_rtp_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtp_format) | -| `membrane_mpegaudio_format` | MPEG audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegaudio_format.svg)](https://hex.pm/packages/membrane_mpegaudio_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegaudio_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_mpegaudio_format) | -| `membrane_h264_format` | H264 video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_format.svg)](https://hex.pm/packages/membrane_h264_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_h264_format) | -| `membrane_cmaf_format` | CMAF definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_cmaf_format.svg)](https://hex.pm/packages/membrane_cmaf_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_cmaf_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_cmaf_format) | -| `membrane_matroska_format` | Matroska format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_format.svg)](https://hex.pm/packages/membrane_matroska_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_matroska_format) | -| `membrane_vp8_format` | VP8 Format Description | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp8_format.svg)](https://hex.pm/packages/membrane_vp8_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp8_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_vp8_format) | -| `membrane_vp9_format` | VP9 Format Description | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp9_format.svg)](https://hex.pm/packages/membrane_vp9_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp9_format) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_vp9_format) | - - -### Apps, protocols & plugins' utilities - -| Package | Description | Links | Used By | -|---|---|---|---| -| `ex_sdp` | Parser and serializer for Session Description Protocol | [![Hex.pm](https://img.shields.io/hexpm/v/ex_sdp.svg)](https://hex.pm/packages/ex_sdp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_sdp) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_sdp) | | -| `ex_libnice` | Libnice-based Interactive Connectivity Establishment (ICE) protocol support for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libnice.svg)](https://hex.pm/packages/ex_libnice) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libnice) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_libnice) | | -| `ex_libsrtp` | Elixir bindings for [libsrtp](https://github.com/cisco/libsrtp) | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libsrtp.svg)](https://hex.pm/packages/ex_libsrtp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libsrtp) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_libsrtp) | | -| `ex_dtls` | DTLS and DTLS-SRTP handshake library for Elixir, based on OpenSSL | [![Hex.pm](https://img.shields.io/hexpm/v/ex_dtls.svg)](https://hex.pm/packages/ex_dtls) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_dtls) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/ex_dtls) | | -| `membrane_rtsp` | RTSP client for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtsp.svg)](https://hex.pm/packages/membrane_rtsp) [![API Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtsp/) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtsp) | | -| `membrane_common_audiomix` | [Experimental] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-common-audiomix) | | -| `membrane_ffmpeg_generator` | FFmpeg video and audio generator for tests, benchmarks and demos. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_generator.svg)](https://hex.pm/packages/membrane_ffmpeg_generator) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_generator/) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_ffmpeg_generator) | | -| `membrane_telemetry_dashboard` | Introduction to integrating `membrane_timescaledb_reporter` repository with `membrane_dashboard` to monitor your pipeline behaviour | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_telemetry_dashboard) | | -| `membrane_webrtc_server` | Signalling server for WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_server.svg)](https://hex.pm/packages/membrane_webrtc_server) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_server) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/webrtc-server) | | - - -### Jellyfish - -Jellyfish is a GitHub organization containing Membrane WebRTC-related repositories, focusing on creating a standalone media server. - -#### Plugins -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_rtc_engine` | RTC Engine and its client library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtc_engine.svg)](https://hex.pm/packages/membrane_rtc_engine) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtc_engine) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtc_engine) | | -| `membrane_webrtc_plugin` | [Alpha] Plugin for sending and receiving media with WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/packages/membrane_webrtc_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_webrtc_plugin) | | -| `membrane_ice_plugin` | Plugin for ICE protocol | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ice_plugin.svg)](https://hex.pm/packages/membrane_ice_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ice_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_ice_plugin) | | - -#### Libraries -| Package | Description | Links | Used By | -|---|---|---|---| -| `fake_turn` | STUN and TURN library for Erlang / Elixir | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/fake_turn) | | -| `membrane_rtc_engine_timescaledb` | Functions which allow storing `Membrane.RTC.Engine` metrics reports in a database | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtc_engine_timescaledb.svg)](https://hex.pm/packages/membrane_rtc_engine_timescaledb) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtc_engine_timescaledb) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_rtc_engine_timescaledb) | | -| `jellyfish ` | [In progress] Standalone media server | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/jellyfish-dev/jellyfish) | | - - -#### RTC Engine clients - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane-webrtc-js` | JS/TS client library for Membrane RTC Engine | [![NPM version](https://img.shields.io/npm/v/@membraneframework/membrane-webrtc-js)](https://www.npmjs.com/package/@membraneframework/membrane-webrtc-js) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-webrtc-js/) | | -| `membrane-webrtc-ios` | Membrane WebRTC client compatible with Membrane RTC Engine | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-webrtc-ios) | | -| `membrane-webrtc-android` | Membrane WebRTC client compatible with Membrane RTC Engine | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-webrtc-android) | | -| `react-native-membrane-webrtc` | React Native wrapper for `membrane-webrtc-ios` and `membrane-webrtc-android` | [![NPM version](https://img.shields.io/npm/v/@membraneframework/react-native-membrane-webrtc)](https://www.npmjs.com/package/@membraneframework/react-native-membrane-webrtc) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/react-native-membrane-webrtc) | | - -#### Book +| --- | --- | --- | +| [membrane_rtp_format](https://github.com/membraneframework/membrane_rtp_format) | Real-time Transport Protocol format for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_format.svg)](https://hex.pm/api/packages/membrane_rtp_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_format/) | +| [membrane_cmaf_format](https://github.com/membraneframework/membrane_cmaf_format) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_cmaf_format.svg)](https://hex.pm/api/packages/membrane_cmaf_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_cmaf_format/) | +| [membrane_matroska_format](https://github.com/membraneframework/membrane_matroska_format) | Matroska Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_format.svg)](https://hex.pm/api/packages/membrane_matroska_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_format/) | +| [membrane_mp4_format](https://github.com/membraneframework/membrane_mp4_format) | MPEG-4 container Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_format.svg)](https://hex.pm/api/packages/membrane_mp4_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_format/) | +| [membrane_raw_audio_format](https://github.com/membraneframework/membrane_raw_audio_format) | Raw audio format definition for the Membrane Multimedia Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_format.svg)](https://hex.pm/api/packages/membrane_raw_audio_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_format/) | +| [membrane_raw_video_format](https://github.com/membraneframework/membrane_raw_video_format) | Membrane Multimedia Framework: Raw video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_format.svg)](https://hex.pm/api/packages/membrane_raw_video_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_format/) | +| [membrane_aac_format](https://github.com/membraneframework/membrane_aac_format) | Advanced Audio Codec Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_format.svg)](https://hex.pm/api/packages/membrane_aac_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_format/) | +| [membrane_opus_format](https://github.com/membraneframework/membrane_opus_format) | Opus audio format definition for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_format.svg)](https://hex.pm/api/packages/membrane_opus_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_format/) | +| [membrane_flac_format](https://github.com/membraneframework/membrane_flac_format) | FLAC audio format description for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_format.svg)](https://hex.pm/api/packages/membrane_flac_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_format/) | +| [membrane_mpegaudio_format](https://github.com/membraneframework/membrane_mpegaudio_format) | MPEG audio format definition for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegaudio_format.svg)](https://hex.pm/api/packages/membrane_mpegaudio_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegaudio_format/) | +| [membrane_h264_format](https://github.com/membraneframework/membrane_h264_format) | Membrane Multimedia Framework: H264 video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_format.svg)](https://hex.pm/api/packages/membrane_h264_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_format/) | +| [membrane_vp8_format](https://github.com/membraneframework/membrane_vp8_format) | VP8 Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp8_format.svg)](https://hex.pm/api/packages/membrane_vp8_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp8_format/) | +| [membrane_vp9_format](https://github.com/membraneframework/membrane_vp9_format) | VP9 Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp9_format.svg)](https://hex.pm/api/packages/membrane_vp9_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp9_format/) | +### Standalone media libs | Package | Description | Links | -|---|---|---| -| `Jellybook` | Theoretical concepts behind general purpose media server. | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/jellyfish-dev/book) | - - -### RTC Engine based applications - -| Package | Description | Links | Used By | -|---|---|---|---| -| `membrane_videoroom` | Video conferencing platform using WebRTC | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_videoroom/) | | -| `membrane_live` | [Alpha] Webinar app in React, Phoenix and Membrane | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_live/) | | - - -### Tutorials - -| Package | Description | Links | -|---|---|---| -| `membrane_tutorials` | Repository with tutorials text | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_tutorials) | -| `membrane_basic_pipeline_tutorial` | Code used in the comprehensive basic pipeline tutorial | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_basic_pipeline_tutorial) | -| `membrane_videoroom_tutorial` | Code used in the videroom tutorial | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_videoroom_tutorial) | -| `membrane_webrtc_tutorial` | Code used in the webrtc tutorial | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_webrtc_tutorial) | - -### No longer mantained - +| --- | --- | --- | +| [video_compositor](https://github.com/membraneframework/video_compositor) | Application for real-time video processing / transforming / composing | | +| [ex_sdp](https://github.com/membraneframework/ex_sdp) | Parser and serializer for Session Description Protocol | [![Hex.pm](https://img.shields.io/hexpm/v/ex_sdp.svg)](https://hex.pm/api/packages/ex_sdp)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_sdp/) | +| [ex_libnice](https://github.com/membraneframework/ex_libnice) | Libnice-based Interactive Connectivity Establishment (ICE) protocol support for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libnice.svg)](https://hex.pm/api/packages/ex_libnice)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libnice/) | +| [ex_libsrtp](https://github.com/membraneframework/ex_libsrtp) | Elixir bindings for libsrtp | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libsrtp.svg)](https://hex.pm/api/packages/ex_libsrtp)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libsrtp/) | +| [ex_dtls](https://github.com/membraneframework/ex_dtls) | DTLS and DTLS-SRTP handshake library for Elixir, based on OpenSSL | [![Hex.pm](https://img.shields.io/hexpm/v/ex_dtls.svg)](https://hex.pm/api/packages/ex_dtls)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_dtls/) | +| [membrane_rtsp](https://github.com/membraneframework/membrane_rtsp) | RTSP client for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtsp.svg)](https://hex.pm/api/packages/membrane_rtsp)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtsp/) | +| [membrane_ffmpeg_generator](https://github.com/membraneframework-labs/membrane_ffmpeg_generator) | [Labs] FFmpeg video and audio generator for tests, benchmarks and demos. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_generator.svg)](https://hex.pm/api/packages/membrane_ffmpeg_generator)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_generator/) | +| [membrane_telemetry_dashboard](https://github.com/membraneframework/membrane_telemetry_dashboard) | | | +| [webrtc-server](https://github.com/membraneframework/webrtc-server) | Signaling server for WebRTC | | +### Utils | Package | Description | Links | -|---|---|---| -| `membrane_libnice_plugin` | Replaced by `membrane_ice_plugin` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_libnice_plugin.svg)](https://hex.pm/packages/membrane_libnice_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_libnice_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_libnice_plugin) | -| `membrane_element_httpoison` | Replaced by `membrane_element_hackney` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_httpoison.svg)](https://hex.pm/packages/membrane_element_httpoison) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_libnice_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_element_httpoison) | -| `membrane_dtls_plugin` | DTLS and DTLS-SRTP handshake implementation for Membrane ICE plugin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_dtls_plugin.svg)](https://hex.pm/packages/membrane_dtls_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_httpoison) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_element_httpoison) | -| `membrane_loggers` | Replaced by the `Membrane.Logger` in Membrane Core | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_loggers.svg)](https://hex.pm/packages/membrane_loggers) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_loggers) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane_loggers) | -| `membrane_caps_audio_flac` | [Suspended] FLAC audio format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_caps_audio_flac.svg)](https://hex.pm/packages/membrane_caps_audio_flac) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_caps_audio_flac) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-caps-audio-flac) | -| `membrane_remote_stream_format` | Content of this package has been moved to `membrane_core` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_remote_stream_format.svg)](https://hex.pm/packages/membrane_remote_stream_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_remote_stream_format) | -| `membrane_element_rtp_jitter_buffer`| Package has become part of `membrane_rtp_plugin` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_rtp_jitter_buffer.svg)](https://hex.pm/packages/membrane_element_rtp_jitter_buffer) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_rtp_jitter_buffer) | -| `membrane_bin_rtp` | Package has become part of `membrane_rtp_plugin` | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_bin_rtp.svg)](https://hex.pm/packages/membrane_bin_rtp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_bin_rtp) | -| `membrane_element_icecast` | [Experimental] Element capable of sending a stream into Icecast streaming server | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-icecast) | -| `membrane_element_live_audiomixer` | Simple mixer that combines audio from different sources | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-live-audiomixer) | -| `membrane_element_msdk_h264` | [Experimental] Hardware-accelerated H.264 encoder based on IntelMediaSDK | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-msdk-h264) | -| `membrane_rtp_aac_plugin` | [Alpha] RTP AAC depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_aac_plugin.svg)](https://hex.pm/packages/membrane_rtp_aac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_aac_plugin) [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework-labs/membrane_rtp_aac_plugin) | -| `membrane_element_flac_encoder` | [Suspended] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-element-flac-encoder) | -| `membrane_protocol_icecast` | [Suspended] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-protocol-icecast) | -| `membrane_server_icecast` | [Suspended] | [![GitHub](https://api.iconify.design/octicon:logo-github-16.svg?color=gray&height=20)](https://github.com/membraneframework/membrane-server-icecast) | +| --- | --- | --- | +| [unifex](https://github.com/membraneframework/unifex) | Tool for generating interfaces between native C code and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | +| [bundlex](https://github.com/membraneframework/bundlex) | Multiplatform app bundler tool for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/api/packages/bundlex)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bundlex/) | +| [beamchmark](https://github.com/membraneframework/beamchmark) | Elixir tool for benchmarking EVM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/api/packages/beamchmark)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark/) | +| [bunch](https://github.com/membraneframework/bunch) | A bunch of helper functions, intended to make life easier | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/api/packages/bunch)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch/) | +| [bunch_native](https://github.com/membraneframework/bunch_native) | Native part of the Bunch package | [![Hex.pm](https://img.shields.io/hexpm/v/bunch_native.svg)](https://hex.pm/api/packages/bunch_native)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch_native/) | +| [shmex](https://github.com/membraneframework/shmex) | Elixir bindings for shared memory | [![Hex.pm](https://img.shields.io/hexpm/v/shmex.svg)](https://hex.pm/api/packages/shmex)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/shmex/) | +| [membrane_common_c](https://github.com/membraneframework/membrane_common_c) | Membrane Multimedia Framework: Common C Routines | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_common_c.svg)](https://hex.pm/api/packages/membrane_common_c)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_common_c/) | +| [membrane_telemetry_metrics](https://github.com/membraneframework/membrane_telemetry_metrics) | Membrane tool for generating metrics | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_telemetry_metrics.svg)](https://hex.pm/api/packages/membrane_telemetry_metrics)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_telemetry_metrics/) | +| [membrane_opentelemetry](https://github.com/membraneframework-labs/membrane_opentelemetry) | [Labs] | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opentelemetry.svg)](https://hex.pm/api/packages/membrane_opentelemetry)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry/) | + + ## Copyright and License diff --git a/update_packages_list.exs b/update_packages_list.exs new file mode 100644 index 000000000..e3208a1c5 --- /dev/null +++ b/update_packages_list.exs @@ -0,0 +1,285 @@ +Mix.install([{:req, "~> 0.4.0"}, :kino]) + +require Logger + +# define packages structure +packages = + [ + {:md, "### General"}, + "membrane_core", + "kino_membrane", + "docker_membrane", + "membrane_demo", + "membrane_tutorials", + {:md, "### Plugins"}, + {:md, "#### General purpose"}, + "membrane_file_plugin", + "membrane_udp_plugin", + "membrane_hackney_plugin", + "membrane_scissors_plugin", + "membrane_tee_plugin", + "membrane_funnel_plugin", + "membrane_realtimer_plugin", + "membrane_stream_plugin", + "membrane_fake_plugin", + "membrane_pcap_plugin", + "kim-company/membrane_live_framerate_converter_plugin", + "membrane_template_plugin", + {:md, "#### Streaming protocols"}, + "membrane_webrtc_plugin", + "membrane_rtmp_plugin", + "membrane_http_adaptive_stream_plugin", + "membrane_rtp_plugin", + "membrane_rtp_h264_plugin", + "membrane_rtp_vp8_plugin", + "membrane_rtp_vp9_plugin", + "membrane_rtp_mpegaudio_plugin", + "membrane_rtp_opus_plugin", + "mickel8/membrane_quic_plugin", + "kim-company/membrane_mpeg_ts_plugin", + "kim-company/membrane_hls_plugin", + {:md, "#### Containers"}, + "membrane_mp4_plugin", + "membrane_matroska_plugin", + "membrane_flv_plugin", + "membrane_ivf_plugin", + "membrane_ogg_plugin", + {:md, "#### Audio codecs"}, + "membrane_aac_plugin", + "membrane_aac_fdk_plugin", + "membrane_flac_plugin", + "membrane_mp3_lame_plugin", + "membrane_mp3_mad_plugin", + "membrane_opus_plugin", + "membrane_wav_plugin", + {:md, "#### Video codecs"}, + "membrane_h264_plugin", + "membrane_h264_ffmpeg_plugin", + "binarynoggin/elixir-turbojpeg", + "kim-company/membrane_subtitle_mixer_plugin", + {:md, "#### Raw audio & video"}, + "membrane_generator_plugin", + {:md, "**Raw audio**"}, + "membrane_raw_audio_parser_plugin", + "membrane_portaudio_plugin", + "membrane_audio_mix_plugin", + "membrane_audio_filler_plugin", + "membrane_ffmpeg_swresample_plugin", + "membrane_audiometer_plugin", + {:md, "**Raw video**"}, + "membrane_raw_video_parser_plugin", + "membrane_video_merger_plugin", + "membrane_video_compositor_plugin", + "membrane_camera_capture_plugin", + "membrane_framerate_converter_plugin", + "membrane_sdl_plugin", + "membrane_ffmpeg_swscale_plugin", + "membrane_ffmpeg_video_filter_plugin", + "kim-company/membrane_video_mixer_plugin", + {:md, "#### External APIs"}, + "membrane_element_gcloud_speech_to_text", + "membrane_element_ibm_speech_to_text", + "YuzuTen/membrane_s3_plugin", + "lawik/membrane_transcription", + {:md, "### Formats"}, + "membrane_rtp_format", + "membrane_cmaf_format", + "membrane_matroska_format", + "membrane_mp4_format", + "membrane_raw_audio_format", + "membrane_raw_video_format", + "membrane_aac_format", + "membrane_opus_format", + "membrane_flac_format", + "membrane_mpegaudio_format", + "membrane_h264_format", + "membrane_vp8_format", + "membrane_vp9_format", + {:md, "### Standalone media libs"}, + "video_compositor", + "ex_sdp", + "ex_libnice", + "ex_libsrtp", + "ex_dtls", + "membrane_rtsp", + "membrane_ffmpeg_generator", + "membrane_telemetry_dashboard", + "webrtc-server", + {:md, "### Utils"}, + "unifex", + "bundlex", + "beamchmark", + "bunch", + "bunch_native", + "shmex", + "membrane_common_c", + "membrane_telemetry_metrics", + "membrane_opentelemetry" + ] + |> Enum.map(fn + {:md, markdown} -> + %{type: :markdown, content: markdown} + + package when is_binary(package) -> + case String.split(package, "/", parts: 2) do + [owner, name] -> %{type: :package, name: name, owner: owner} + [name] -> %{type: :package, name: name, owner: nil} + end + end) + +# to prevent exceeding API request rate +gh_req_timeout = 500 + +# for debugging, allows mocking requests for particular repos +gh_req_mock = false + +# fetch repos from the known organizations +repos = + ["membraneframework", "membraneframework-labs", "jellyfish-dev"] + |> Enum.flat_map(fn org -> + Process.sleep(gh_req_timeout) + + Req.get!( + "https://api.github.com/orgs/#{org}/repos?per_page=100", + decode_json: [keys: :atoms] + ).body + end) + |> Map.new(&{&1.name, &1}) + + +# find repos from the membraneframework organization that aren't in the list + +package_names = + packages |> Enum.filter(&(&1.type == :package)) |> Enum.map(& &1.name) |> MapSet.new() + +lacking_repos = + repos + |> Map.values() + |> Enum.filter(&(&1.owner.login == "membraneframework")) + |> Enum.map(& &1.name) + |> Enum.reject(&(&1 in package_names)) + |> Enum.reject( + &Enum.any?( + [ + "circleci-orb", + "guide", + "design-system", + ~r/.*_tutorial/, + "membrane_resources", + "membrane_gigachad", + "static", + "membrane_videoroom", + ".github", + "membraneframework.github.io" + ], + fn repo -> &1 =~ repo end + ) + ) + +unless Enum.empty?(lacking_repos) do + Logger.warning(""" + The following repositories from the membraneframework organization aren't mentioned in the package list: + #{Enum.join(lacking_repos, ",\n")} + """) +end + +# equip packages with the data from GH and Hex +packages = + Enum.map(packages, fn + %{type: :package, name: name, owner: owner} = package -> + repo = + case Map.fetch(repos, name) do + {:ok, repo} -> + repo + + :error when owner != nil and gh_req_mock -> + %{owner: %{login: :mock}, html_url: :mock, description: :mock} + + :error when owner != nil -> + Process.sleep(gh_req_timeout) + IO.puts("Fetching https://api.github.com/repos/#{owner}/#{name}") + + Req.get!("https://api.github.com/repos/#{owner}/#{name}", decode_json: [keys: :atoms]).body + + :error -> + raise "Package #{inspect(name)} repo not found, please specify owner." + end + + hex = Req.get!("https://hex.pm/api/packages/#{name}", decode_json: [keys: :atoms]) + hex_present = hex.status == 200 + + Map.merge(package, %{ + owner: repo.owner.login, + url: repo.html_url, + description: repo.description, + hex_url: if(hex_present, do: hex.body.url), + hexdocs_url: if(hex_present, do: hex.body.docs_html_url) + }) + + other -> + other + end) + +# generate packages list in markdown + +header = """ +| Package | Description | Links | +| --- | --- | --- | +""" + +packages_md = + packages + |> Enum.map_reduce(%{header_present: false}, fn + %{type: :markdown, content: content}, acc -> + {content, %{acc | header_present: false}} + + %{type: :package} = package, acc -> + prefix = + case package.owner do + "membraneframework-labs" -> "[Labs] " + "membraneframework" -> "" + _other -> "[Maintainer: [#{package.owner}](https://github.com/#{package.owner})] " + end + + hex_badge = + if package.hex_url, + do: + "[![Hex.pm](https://img.shields.io/hexpm/v/#{package.name}.svg)](#{package.hex_url})" + + hexdocs_badge = + if package.hexdocs_url, + do: + "[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](#{package.hexdocs_url})" + + url = "[#{package.name}](#{package.url})" + + result = """ + #{if acc.header_present, do: "", else: header}\ + | #{url} | #{prefix}#{package.description} | #{hex_badge}#{hexdocs_badge} |\ + """ + + {result, %{acc | header_present: true}} + end) + |> elem(0) + |> Enum.join("\n") + +packages_md = + """ + + + + #{packages_md} + + \ + """ + +# replace packages list in the readme + +readme_path = "README.md" + +File.read!(readme_path) +|> String.replace( + ~r/(.|\n)*/m, + packages_md +) +|> then(&File.write(readme_path, &1)) From 632198936bfcf1f9dc06da21e598976f393483ce Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Fri, 15 Sep 2023 11:16:36 +0200 Subject: [PATCH 05/14] update readme and example to match the guide --- README.md | 41 ++++-- example.livemd | 27 ++-- update_packages.livemd | 288 --------------------------------------- update_packages_list.exs | 2 +- 4 files changed, 45 insertions(+), 313 deletions(-) delete mode 100644 update_packages.livemd diff --git a/README.md b/README.md index 951546580..091f021e6 100644 --- a/README.md +++ b/README.md @@ -36,22 +36,29 @@ Mix.install([ :membrane_portaudio_plugin, ]) -import Membrane.ChildrenSpec -alias Membrane.RCPipeline +defmodule MyPipeline 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 mp3_url = "https://raw.githubusercontent.com/membraneframework/membrane_demo/master/simple_pipeline/sample.mp3" -pipeline = RCPipeline.start_link!() - -RCPipeline.exec_actions(pipeline, spec: - child(%Membrane.Hackney.Source{location: mp3_url, hackney_opts:[follow_redirect: true]}) - |> child(Membrane.MP3.MAD.Decoder) - |> child(Membrane.PortAudio.Sink) -) +Membrane.Pipeline.start_link(MyPipeline, mp3_url) ``` -This is an [Elixir](elixir-lang.org) snippet, that streams an mp3 via HTTP and plays it on your speaker. To run it, do the following: -- Install libmad and portaudio. Membrane uses these libs to decode the mp3 and to access your speaker, respectively. You can use these commands: +This is an [Elixir](elixir-lang.org) snippet, that streams an mp3 via HTTP and plays it on your speaker. Here's how to run it: +- Install [libmad](https://github.com/markjeee/libmad) and [portaudio](https://github.com/PortAudio/portaudio). Membrane uses these libs to decode the mp3 and to access your speaker, respectively. You can use these commands: - On Mac OS: `brew install libmad portaudio pkg-config` - On Debian: `apt install libmad0-dev portaudio19-dev` @@ -71,13 +78,19 @@ To learn step-by-step what exactly happens here, follow [this tutorial](https:// The best place to learn Membrane is the [membrane.stream/learn](membrane.stream/learn) website and the [membrane_demo](github.com/membraneframework/membrane_demo) repository. Try them out, then hack something exciting! -## Usage +## Structure of the framework + +The most basic media processing entities of Membrane are `Element`s. An element might be able, for example, to mux incoming audio and video streams into MP4, or play raw audio using your sound card. You can create elements yourself, or choose from the ones provided by the framework. + +Elements can be organized into a pipeline - a sequence of linked elements that perform a specific task. For example, a pipeline might receive an incoming RTSP stream from a webcam and convert it to an HLS stream, or act as a selective forwarding unit (SFU) to implement your own videoconferencing room. The [Quick start](#quick-start) section above shows how to create a simple pipeline. + +### Membrane packages -Membrane API is mostly based on media processing pipelines. To create one, create an Elixir project, script or livebook and add some plugins to dependencies. Plugins provide elements that you can use in your pipeline, as demonstrated in the 'Quick start' section above. +To embrace modularity, Membrane is delivered to you in multiple packages, including plugins, formats, core and standalone libraries. The complete list of all the Membrane packages maintained by the Membrane team is available [here](https://github.com/membraneframework/membrane_core/Membrane-packages). **Plugins** -Each plugin lives in a `membrane_X_plugin` repository, where X can be a protocol, codec, container or functionality, for example [mebrane_opus_plugin](github.com/membraneframework/membrane_opus_plugin). Plugins wrapping a tool or library are named `membrane_X_LIBRARYNAME_plugin` or just `membrane_LIBRARYNAME_plugin`, like [membrane_mp3_mad_plugin](github.com/membraneframework/membrane_mp3_mad_plugin). Plugins are published on [hex.pm](hex.pm), for example [hex.pm/packages/membrane_opus_plugin](hex.pm/pakcages/membrane_opus_plugin) and docs are at [hexdocs](hexdocs.pm), like [hexdocs.pm/membrane_opus_plugin](hexdocs.pm/membrane_opus_plugin). Some plugins require native libraries installed in your OS. Those requirements, along with usage examples are outlined in each plugin's readme. +Plugins provide elements that you can use in your pipeline. Each plugin lives in a `membrane_X_plugin` repository, where X can be a protocol, codec, container or functionality, for example [mebrane_opus_plugin](github.com/membraneframework/membrane_opus_plugin). Plugins wrapping a tool or library are named `membrane_X_LIBRARYNAME_plugin` or just `membrane_LIBRARYNAME_plugin`, like [membrane_mp3_mad_plugin](github.com/membraneframework/membrane_mp3_mad_plugin). Plugins are published on [hex.pm](hex.pm), for example [hex.pm/packages/membrane_opus_plugin](hex.pm/pakcages/membrane_opus_plugin) and docs are at [hexdocs](hexdocs.pm), like [hexdocs.pm/membrane_opus_plugin](hexdocs.pm/membrane_opus_plugin). Some plugins require native libraries installed in your OS. Those requirements, along with usage examples are outlined in each plugin's readme. **Formats** diff --git a/example.livemd b/example.livemd index 0b811c691..454c49b24 100644 --- a/example.livemd +++ b/example.livemd @@ -12,22 +12,29 @@ Mix.install([ ## Play mp3 ```elixir -import Membrane.ChildrenSpec -alias Membrane.RCPipeline +defmodule MyPipeline 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 mp3_url = "https://raw.githubusercontent.com/membraneframework/membrane_demo/master/simple_pipeline/sample.mp3" -pipeline = RCPipeline.start_link!() - -RCPipeline.exec_actions(pipeline, spec: - child(%Membrane.Hackney.Source{location: mp3_url, hackney_opts: [follow_redirect: true]}) - |> child(Membrane.MP3.MAD.Decoder) - |> child(Membrane.PortAudio.Sink) -) +Membrane.Pipeline.start_link(MyPipeline, mp3_url) ``` ## Terminate the pipeline ```elixir -RCPipeline.terminate(pipeline) +Membrane.Pipeline.terminate(pipeline) ``` diff --git a/update_packages.livemd b/update_packages.livemd deleted file mode 100644 index d8fb009c4..000000000 --- a/update_packages.livemd +++ /dev/null @@ -1,288 +0,0 @@ -# Update packages - -```elixir -Mix.install([{:req, "~> 0.4.0"}, :kino]) -``` - -## Section - -```elixir -packages = - [ - {:md, "### General"}, - "membrane_core", - "kino_membrane", - "docker_membrane", - "membrane_demo", - "membrane_tutorials", - {:md, "### Plugins"}, - {:md, "#### General purpose"}, - "membrane_file_plugin", - "membrane_udp_plugin", - "membrane_hackney_plugin", - "membrane_scissors_plugin", - "membrane_tee_plugin", - "membrane_funnel_plugin", - "membrane_realtimer_plugin", - "membrane_stream_plugin", - "membrane_fake_plugin", - "membrane_pcap_plugin", - "kim-company/membrane_live_framerate_converter_plugin", - "membrane_template_plugin", - {:md, "#### Streaming protocols"}, - "membrane_webrtc_plugin", - "membrane_rtmp_plugin", - "membrane_http_adaptive_stream_plugin", - "membrane_rtp_plugin", - "membrane_rtp_h264_plugin", - "membrane_rtp_vp8_plugin", - "membrane_rtp_vp9_plugin", - "membrane_rtp_mpegaudio_plugin", - "membrane_rtp_opus_plugin", - "mickel8/membrane_quic_plugin", - "kim-company/membrane_mpeg_ts_plugin", - "kim-company/membrane_hls_plugin", - {:md, "#### Containers"}, - "membrane_mp4_plugin", - "membrane_matroska_plugin", - "membrane_flv_plugin", - "membrane_ivf_plugin", - "membrane_ogg_plugin", - {:md, "#### Audio codecs"}, - "membrane_aac_plugin", - "membrane_aac_fdk_plugin", - "membrane_flac_plugin", - "membrane_mp3_lame_plugin", - "membrane_mp3_mad_plugin", - "membrane_opus_plugin", - "membrane_wav_plugin", - {:md, "#### Video codecs"}, - "membrane_h264_plugin", - "membrane_h264_ffmpeg_plugin", - "binarynoggin/elixir-turbojpeg", - "kim-company/membrane_subtitle_mixer_plugin", - {:md, "#### Raw audio & video"}, - "membrane_generator_plugin", - {:md, "**Raw audio**"}, - "membrane_raw_audio_parser_plugin", - "membrane_portaudio_plugin", - "membrane_audio_mix_plugin", - "membrane_audio_filler_plugin", - "membrane_ffmpeg_swresample_plugin", - "membrane_audiometer_plugin", - {:md, "**Raw video**"}, - "membrane_raw_video_parser_plugin", - "membrane_video_merger_plugin", - "membrane_video_compositor_plugin", - "membrane_camera_capture_plugin", - "membrane_framerate_converter_plugin", - "membrane_sdl_plugin", - "membrane_ffmpeg_swscale_plugin", - "membrane_ffmpeg_video_filter_plugin", - "kim-company/membrane_video_mixer_plugin", - {:md, "#### External APIs"}, - "membrane_element_gcloud_speech_to_text", - "membrane_element_ibm_speech_to_text", - "YuzuTen/membrane_s3_plugin", - "lawik/membrane_transcription", - {:md, "### Formats"}, - "membrane_raw_audio_format", - "membrane_raw_video_format", - "membrane_aac_format", - "membrane_mp4_format", - "membrane_opus_format", - "membrane_rtp_format", - "membrane_mpegaudio_format", - "membrane_h264_format", - "membrane_cmaf_format", - "membrane_matroska_format", - "membrane_vp8_format", - "membrane_vp9_format", - {:md, "### Standalone media libs"}, - "video_compositor", - "ex_sdp", - "ex_libnice", - "ex_libsrtp", - "ex_dtls", - "membrane_rtsp", - "membrane_ffmpeg_generator", - "membrane_telemetry_dashboard", - "webrtc-server", - {:md, "### Utils"}, - "unifex", - "bundlex", - "beamchmark", - "bunch", - "bunch_native", - "shmex", - "membrane_common_c", - "membrane_telemetry_metrics", - "membrane_opentelemetry" - ] - |> Enum.map(fn - {:md, markdown} -> - %{type: :markdown, content: markdown} - - package when is_binary(package) -> - case String.split(package, "/", parts: 2) do - [owner, name] -> %{type: :package, name: name, owner: owner} - [name] -> %{type: :package, name: name, owner: nil} - end - end) -``` - -```elixir -gh_req_timeout = 500 -gh_req_mock = false - -repos = - ["membraneframework", "membraneframework-labs", "jellyfish-dev"] - |> Enum.flat_map(fn org -> - Process.sleep(gh_req_timeout) - - Req.get!( - "https://api.github.com/orgs/#{org}/repos?per_page=100", - decode_json: [keys: :atoms] - ).body - end) - |> Map.new(&{&1.name, &1}) -``` - -```elixir -package_names = - packages |> Enum.filter(&(&1.type == :package)) |> Enum.map(& &1.name) |> MapSet.new() - -lacking_repos = - repos - |> Map.values() - |> Enum.filter(&(&1.owner.login == "membraneframework")) - |> Enum.map(& &1.name) - |> Enum.reject(&(&1 in package_names)) - |> Enum.reject( - &Enum.any?( - [ - "circleci-orb", - "guide", - "design-system", - ~r/.*_tutorial/, - "membrane_resources", - "membrane_gigachad", - "static", - "membrane_videoroom", - ".github", - "membraneframework.github.io" - ], - fn repo -> &1 =~ repo end - ) - ) - -require Logger - -Logger.warning( - "The following repositories from membraneframework organisation aren't mentioned in the package list: -#{Enum.join(lacking_repos, ",\n")} -" -) -``` - -```elixir -packages = - Enum.map(packages, fn - %{type: :package, name: name, owner: owner} = package -> - repo = - case Map.fetch(repos, name) do - {:ok, repo} -> - repo - - :error when owner != nil and gh_req_mock -> - %{owner: %{login: :mock}, html_url: :mock, description: :mock} - - :error when owner != nil -> - Process.sleep(gh_req_timeout) - IO.puts("Fetching https://api.github.com/repos/#{owner}/#{name}") - - Req.get!("https://api.github.com/repos/#{owner}/#{name}", decode_json: [keys: :atoms]).body - - :error -> - raise "Package #{inspect(name)} repo not found, please specify owner." - end - - hex = Req.get!("https://hex.pm/api/packages/#{name}", decode_json: [keys: :atoms]) - hex_present = hex.status == 200 - - Map.merge(package, %{ - owner: repo.owner.login, - url: repo.html_url, - description: repo.description, - hex_url: if(hex_present, do: hex.body.url), - hexdocs_url: if(hex_present, do: hex.body.docs_html_url) - }) - - other -> - other - end) -``` - -```elixir -header = """ -| Package | Description | Links | -| --- | --- | --- | -""" - -result = - packages - |> Enum.map_reduce(%{header_present: false}, fn - %{type: :markdown, content: content}, acc -> - {content, %{acc | header_present: false}} - - %{type: :package} = package, acc -> - prefix = - case package.owner do - "membraneframework-labs" -> "[Labs] " - "membraneframework" -> "" - _other -> "[Maintainer: [#{package.owner}](https://github.com/#{package.owner})] " - end - - hex_badge = - if package.hex_url, - do: - "[![Hex.pm](https://img.shields.io/hexpm/v/#{package.name}.svg)](#{package.hex_url})" - - hexdocs_badge = - if package.hexdocs_url, - do: - "[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](#{package.hexdocs_url})" - - url = "[#{package.name}](#{package.url})" - - result = """ - #{if acc.header_present, do: "", else: header}\ - | #{url} | #{prefix}#{package.description} | #{hex_badge}#{hexdocs_badge} |\ - """ - - {result, %{acc | header_present: true}} - end) - |> elem(0) - |> Enum.join("\n") - -packages_md = - """ - - - - #{result} - - - """ -``` - -```elixir -readme = File.read!("/Users/matheksm/Desktop/sm/membrane/membrane_core/README.md") - -String.replace( - readme, - ~r/(.|\n)*/m, - packages_md -) -|> Kino.Markdown.new() -``` diff --git a/update_packages_list.exs b/update_packages_list.exs index e3208a1c5..ec3de90a3 100644 --- a/update_packages_list.exs +++ b/update_packages_list.exs @@ -1,4 +1,4 @@ -Mix.install([{:req, "~> 0.4.0"}, :kino]) +Mix.install([{:req, "~> 0.4.0"}]) require Logger From 95a47458fc3b630878516981ab292ec1c2db0f75 Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Fri, 15 Sep 2023 11:48:02 +0200 Subject: [PATCH 06/14] fix readme urls --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 091f021e6..b8c37805e 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Membrane is a versatile multimedia streaming & processing framework. You can use - seamlessly scale and recover from errors, - do whatever you imagine if you implement it yourself :D Membrane makes it easy to plug in your code at almost any point of processing. -The abbreviations above don't ring any bells? Visit [membrane.stream/learn](membrane.stream/learn) and let Membrane introduce you to the multimedia world! +The abbreviations above don't ring any bells? Visit [membrane.stream/learn](https://membrane.stream/learn) and let Membrane introduce you to the multimedia world! Want a generic media server, instead of building a custom one? Try [Jellyfish](https://github.com/jellyfish-dev/jellyfish) - it's built on top of Membrane and provides many of its features via simple, WebSocket API. We'll soon [provide it as a SAAS](https://membrane.stream/cloud) too. @@ -76,7 +76,7 @@ To learn step-by-step what exactly happens here, follow [this tutorial](https:// ## Learning -The best place to learn Membrane is the [membrane.stream/learn](membrane.stream/learn) website and the [membrane_demo](github.com/membraneframework/membrane_demo) repository. Try them out, then hack something exciting! +The best place to learn Membrane is the [membrane.stream/learn](https://membrane.stream/learn) website and the [membrane_demo](https://github.com/membraneframework/membrane_demo) repository. Try them out, then hack something exciting! ## Structure of the framework @@ -90,15 +90,15 @@ To embrace modularity, Membrane is delivered to you in multiple packages, includ **Plugins** -Plugins provide elements that you can use in your pipeline. Each plugin lives in a `membrane_X_plugin` repository, where X can be a protocol, codec, container or functionality, for example [mebrane_opus_plugin](github.com/membraneframework/membrane_opus_plugin). Plugins wrapping a tool or library are named `membrane_X_LIBRARYNAME_plugin` or just `membrane_LIBRARYNAME_plugin`, like [membrane_mp3_mad_plugin](github.com/membraneframework/membrane_mp3_mad_plugin). Plugins are published on [hex.pm](hex.pm), for example [hex.pm/packages/membrane_opus_plugin](hex.pm/pakcages/membrane_opus_plugin) and docs are at [hexdocs](hexdocs.pm), like [hexdocs.pm/membrane_opus_plugin](hexdocs.pm/membrane_opus_plugin). Some plugins require native libraries installed in your OS. Those requirements, along with usage examples are outlined in each plugin's readme. +Plugins provide elements that you can use in your pipeline. Each plugin lives in a `membrane_X_plugin` repository, where X can be a protocol, codec, container or functionality, for example [mebrane_opus_plugin](https://github.com/membraneframework/membrane_opus_plugin). Plugins wrapping a tool or library are named `membrane_X_LIBRARYNAME_plugin` or just `membrane_LIBRARYNAME_plugin`, like [membrane_mp3_mad_plugin](https://github.com/membraneframework/membrane_mp3_mad_plugin). Plugins are published on [hex.pm](https://hex.pm), for example [hex.pm/packages/membrane_opus_plugin](https://hex.pm/pakcages/membrane_opus_plugin) and docs are at [hexdocs](https://hexdocs.pm), like [hexdocs.pm/membrane_opus_plugin](https://hexdocs.pm/membrane_opus_plugin). Some plugins require native libraries installed in your OS. Those requirements, along with usage examples are outlined in each plugin's readme. **Formats** -Apart from plugins, Membrane has stream formats, which live in `membrane_X_format` repositories, where X is usually a codec or container, for example [mebrane_opus_format](github.com/membraneframework/mebrane_opus_format). Stream formats are published the same way as packages and are used by elements to define what kind of stream can be sent or received. They also provide utility functions to deal with a given codec/container. +Apart from plugins, Membrane has stream formats, which live in `membrane_X_format` repositories, where X is usually a codec or container, for example [mebrane_opus_format](https://github.com/membraneframework/mebrane_opus_format). Stream formats are published the same way as packages and are used by elements to define what kind of stream can be sent or received. They also provide utility functions to deal with a given codec/container. **Core** -The API for creating pipelines (and custom elements too) is provided by [membrane_core](github.com/membraneframework/membrane_core). To install it, add the following line to your `deps` in `mix.exs` and run `mix deps.get` +The API for creating pipelines (and custom elements too) is provided by [membrane_core](https://github.com/membraneframework/membrane_core). To install it, add the following line to your `deps` in `mix.exs` and run `mix deps.get` ```elixir {:membrane_core, "~> 0.12.0"} @@ -112,7 +112,7 @@ Or, if you'd like to try the latest release candidate, use this version: **Standalone libraries** -Last but not least, Membrane provides tools and libraries that can be used standalone and don't depend on the membrane_core, for example [video_compositor](github.com/membraneframework/video_compositor), [ex_sdp](github.com/membraneframework/ex_sdp) or [unifex](github.com/membraneframework/unifex). +Last but not least, Membrane provides tools and libraries that can be used standalone and don't depend on the membrane_core, for example [video_compositor](https://github.com/membraneframework/video_compositor), [ex_sdp](https://github.com/membraneframework/ex_sdp) or [unifex](https://github.com/membraneframework/unifex). ## Goals From bf7bdd01c1085c78bf69f687ef3f0b98724c28fa Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Fri, 15 Sep 2023 12:29:44 +0200 Subject: [PATCH 07/14] update packages list --- README.md | 206 +++++++++++++++++++++------------------ update_packages_list.exs | 6 +- 2 files changed, 113 insertions(+), 99 deletions(-) diff --git a/README.md b/README.md index b8c37805e..796eceedb 100644 --- a/README.md +++ b/README.md @@ -144,142 +144,156 @@ If you have any problems with Membrane Framework feel free to contact us via [Di + ### General | Package | Description | Links | | --- | --- | --- | -| [membrane_core](https://github.com/membraneframework/membrane_core) | The core of the Membrane Framework, advanced multimedia processing framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/api/packages/membrane_core)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core/) | -| [kino_membrane](https://github.com/membraneframework/kino_membrane) | Utilities for introspecting Membrane pipelines in Livebook | [![Hex.pm](https://img.shields.io/hexpm/v/kino_membrane.svg)](https://hex.pm/api/packages/kino_membrane)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/kino_membrane/) | -| [docker_membrane](https://github.com/membraneframework-labs/docker_membrane) | [Labs] A docker image based on Ubuntu, with Erlang, Elixir and libraries necessary to test and run the Membrane Framework. | | -| [membrane_demo](https://github.com/membraneframework/membrane_demo) | Examples of using the Membrane Framework | | -| [membrane_tutorials](https://github.com/membraneframework/membrane_tutorials) | Repository which contains text and assets used in Membrane Framework tutorials. | | +| [membrane_core](https://github.com/membraneframework/membrane_core) | The core of the Membrane Framework, advanced multimedia processing framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/api/packages/membrane_core) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core/) | +| [kino_membrane](https://github.com/membraneframework/kino_membrane) | Utilities for introspecting Membrane pipelines in Livebook | [![Hex.pm](https://img.shields.io/hexpm/v/kino_membrane.svg)](https://hex.pm/api/packages/kino_membrane) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/kino_membrane/) | +| [docker_membrane](https://github.com/membraneframework-labs/docker_membrane) | [Labs] A docker image based on Ubuntu, with Erlang, Elixir and libraries necessary to test and run the Membrane Framework. | | +| [membrane_demo](https://github.com/membraneframework/membrane_demo) | Examples of using the Membrane Framework | | +| [membrane_tutorials](https://github.com/membraneframework/membrane_tutorials) | Repository which contains text and assets used in Membrane Framework tutorials. | | + ### Plugins + #### General purpose | Package | Description | Links | | --- | --- | --- | -| [membrane_file_plugin](https://github.com/membraneframework/membrane_file_plugin) | Membrane plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/api/packages/membrane_file_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin/) | -| [membrane_udp_plugin](https://github.com/membraneframework/membrane_udp_plugin) | Membrane plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/api/packages/membrane_udp_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin/) | -| [membrane_hackney_plugin](https://github.com/membraneframework/membrane_hackney_plugin) | HTTP sink and source based on Hackney | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hackney_plugin.svg)](https://hex.pm/api/packages/membrane_hackney_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hackney_plugin/) | -| [membrane_scissors_plugin](https://github.com/membraneframework/membrane_scissors_plugin) | Element for cutting off parts of the stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_scissors_plugin.svg)](https://hex.pm/api/packages/membrane_scissors_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_scissors_plugin/) | -| [membrane_tee_plugin](https://github.com/membraneframework/membrane_tee_plugin) | Membrane plugin for splitting data from a single input to multiple outputs | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_tee_plugin.svg)](https://hex.pm/api/packages/membrane_tee_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_tee_plugin/) | -| [membrane_funnel_plugin](https://github.com/membraneframework/membrane_funnel_plugin) | Membrane plugin for merging multiple input streams into a single output | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_funnel_plugin.svg)](https://hex.pm/api/packages/membrane_funnel_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_funnel_plugin/) | -| [membrane_realtimer_plugin](https://github.com/membraneframework/membrane_realtimer_plugin) | Membrane element limiting playback speed to realtime, according to buffers' timestamps | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_realtimer_plugin.svg)](https://hex.pm/api/packages/membrane_realtimer_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_realtimer_plugin/) | -| [membrane_stream_plugin](https://github.com/membraneframework/membrane_stream_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_stream_plugin.svg)](https://hex.pm/api/packages/membrane_stream_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_stream_plugin/) | -| [membrane_fake_plugin](https://github.com/membraneframework/membrane_fake_plugin) | Fake Membrane sinks that drop incoming data | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_fake_plugin.svg)](https://hex.pm/api/packages/membrane_fake_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_fake_plugin/) | -| [membrane_pcap_plugin](https://github.com/membraneframework-labs/membrane_pcap_plugin) | [Labs] | | -| [membrane_live_framerate_converter_plugin](https://github.com/kim-company/membrane_live_framerate_converter_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that drops or duplicates frames to match a target framerate. Designed for realtime applications | | -| [membrane_template_plugin](https://github.com/membraneframework/membrane_template_plugin) | Template for Membrane Elements | | +| [membrane_file_plugin](https://github.com/membraneframework/membrane_file_plugin) | Membrane plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/api/packages/membrane_file_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin/) | +| [membrane_udp_plugin](https://github.com/membraneframework/membrane_udp_plugin) | Membrane plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/api/packages/membrane_udp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin/) | +| [membrane_hackney_plugin](https://github.com/membraneframework/membrane_hackney_plugin) | HTTP sink and source based on Hackney | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hackney_plugin.svg)](https://hex.pm/api/packages/membrane_hackney_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hackney_plugin/) | +| [membrane_scissors_plugin](https://github.com/membraneframework/membrane_scissors_plugin) | Element for cutting off parts of the stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_scissors_plugin.svg)](https://hex.pm/api/packages/membrane_scissors_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_scissors_plugin/) | +| [membrane_tee_plugin](https://github.com/membraneframework/membrane_tee_plugin) | Membrane plugin for splitting data from a single input to multiple outputs | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_tee_plugin.svg)](https://hex.pm/api/packages/membrane_tee_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_tee_plugin/) | +| [membrane_funnel_plugin](https://github.com/membraneframework/membrane_funnel_plugin) | Membrane plugin for merging multiple input streams into a single output | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_funnel_plugin.svg)](https://hex.pm/api/packages/membrane_funnel_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_funnel_plugin/) | +| [membrane_realtimer_plugin](https://github.com/membraneframework/membrane_realtimer_plugin) | Membrane element limiting playback speed to realtime, according to buffers' timestamps | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_realtimer_plugin.svg)](https://hex.pm/api/packages/membrane_realtimer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_realtimer_plugin/) | +| [membrane_stream_plugin](https://github.com/membraneframework/membrane_stream_plugin) | Plugin for recording the entire stream sent through Membrane pads into a binary format and replaying it | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_stream_plugin.svg)](https://hex.pm/api/packages/membrane_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_stream_plugin/) | +| [membrane_fake_plugin](https://github.com/membraneframework/membrane_fake_plugin) | Fake Membrane sinks that drop incoming data | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_fake_plugin.svg)](https://hex.pm/api/packages/membrane_fake_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_fake_plugin/) | +| [membrane_pcap_plugin](https://github.com/membraneframework-labs/membrane_pcap_plugin) | [Labs] Membrane PCAP source, capable of reading captured packets in pcap format | | +| [membrane_live_framerate_converter_plugin](https://github.com/kim-company/membrane_live_framerate_converter_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that drops or duplicates frames to match a target framerate. Designed for realtime applications | | +| [membrane_template_plugin](https://github.com/membraneframework/membrane_template_plugin) | Template for Membrane Elements | | + #### Streaming protocols | Package | Description | Links | | --- | --- | --- | -| [membrane_webrtc_plugin](https://github.com/jellyfish-dev/membrane_webrtc_plugin) | [Maintainer: [jellyfish-dev](https://github.com/jellyfish-dev)] | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/api/packages/membrane_webrtc_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin/) | -| [membrane_rtmp_plugin](https://github.com/membraneframework/membrane_rtmp_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtmp_plugin.svg)](https://hex.pm/api/packages/membrane_rtmp_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtmp_plugin/) | -| [membrane_http_adaptive_stream_plugin](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin) | Plugin generating manifests for HLS (DASH support planned) | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_http_adaptive_stream_plugin.svg)](https://hex.pm/api/packages/membrane_http_adaptive_stream_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_http_adaptive_stream_plugin/) | -| [membrane_rtp_plugin](https://github.com/membraneframework/membrane_rtp_plugin) | Membrane bins and elements for sending and receiving RTP/SRTP and RTCP/SRTCP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_plugin/) | -| [membrane_rtp_h264_plugin](https://github.com/membraneframework/membrane_rtp_h264_plugin) | Membrane RTP payloader and depayloader for H264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_h264_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_h264_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_h264_plugin/) | -| [membrane_rtp_vp8_plugin](https://github.com/membraneframework/membrane_rtp_vp8_plugin) | RTP VP8 plugin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_vp8_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_vp8_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_vp8_plugin/) | -| [membrane_rtp_vp9_plugin](https://github.com/membraneframework-labs/membrane_rtp_vp9_plugin) | [Labs] | | -| [membrane_rtp_mpegaudio_plugin](https://github.com/membraneframework/membrane_rtp_mpegaudio_plugin) | Membrane RTP MPEG Audio depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_mpegaudio_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_mpegaudio_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_mpegaudio_plugin/) | -| [membrane_rtp_opus_plugin](https://github.com/membraneframework/membrane_rtp_opus_plugin) | Membrane RTP payloader and depayloader for OPUS audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_opus_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_opus_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_opus_plugin/) | -| [membrane_quic_plugin](https://github.com/mickel8/membrane_quic_plugin) | [Maintainer: [mickel8](https://github.com/mickel8)] | | -| [membrane_mpeg_ts_plugin](https://github.com/kim-company/membrane_mpeg_ts_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that demuxes MPEG-TS streams | | -| [membrane_hls_plugin](https://github.com/kim-company/membrane_hls_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Plugin providing a `Membrane.HLS.Source` element for HTTP Live Streaming (HLS). | | +| [membrane_webrtc_plugin](https://github.com/jellyfish-dev/membrane_webrtc_plugin) | [Maintainer: [jellyfish-dev](https://github.com/jellyfish-dev)] Membrane plugin for sending and receiving media with WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/api/packages/membrane_webrtc_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin/) | +| [membrane_rtmp_plugin](https://github.com/membraneframework/membrane_rtmp_plugin) | RTMP server & client | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtmp_plugin.svg)](https://hex.pm/api/packages/membrane_rtmp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtmp_plugin/) | +| [membrane_http_adaptive_stream_plugin](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin) | Plugin generating manifests for HLS (DASH support planned) | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_http_adaptive_stream_plugin.svg)](https://hex.pm/api/packages/membrane_http_adaptive_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_http_adaptive_stream_plugin/) | +| [membrane_rtp_plugin](https://github.com/membraneframework/membrane_rtp_plugin) | Membrane bins and elements for sending and receiving RTP/SRTP and RTCP/SRTCP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_plugin/) | +| [membrane_rtp_h264_plugin](https://github.com/membraneframework/membrane_rtp_h264_plugin) | Membrane RTP payloader and depayloader for H264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_h264_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_h264_plugin/) | +| [membrane_rtp_vp8_plugin](https://github.com/membraneframework/membrane_rtp_vp8_plugin) | Membrane elements for payloading and depayloading VP8 into RTP | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_vp8_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_vp8_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_vp8_plugin/) | +| [membrane_rtp_vp9_plugin](https://github.com/membraneframework-labs/membrane_rtp_vp9_plugin) | [Labs] Membrane elements for payloading and depayloading VP9 into RTP | | +| [membrane_rtp_mpegaudio_plugin](https://github.com/membraneframework/membrane_rtp_mpegaudio_plugin) | Membrane RTP MPEG Audio depayloader | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_mpegaudio_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_mpegaudio_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_mpegaudio_plugin/) | +| [membrane_rtp_opus_plugin](https://github.com/membraneframework/membrane_rtp_opus_plugin) | Membrane RTP payloader and depayloader for OPUS audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_opus_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_opus_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_opus_plugin/) | +| [membrane_quic_plugin](https://github.com/mickel8/membrane_quic_plugin) | [Maintainer: [mickel8](https://github.com/mickel8)] | | +| [membrane_mpeg_ts_plugin](https://github.com/kim-company/membrane_mpeg_ts_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that demuxes MPEG-TS streams | | +| [membrane_hls_plugin](https://github.com/kim-company/membrane_hls_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Plugin providing a `Membrane.HLS.Source` element for HTTP Live Streaming (HLS). | | + #### Containers | Package | Description | Links | | --- | --- | --- | -| [membrane_mp4_plugin](https://github.com/membraneframework/membrane_mp4_plugin) | Utilities for MP4 container parsing and serialization and elements for muxing the stream to CMAF | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_plugin.svg)](https://hex.pm/api/packages/membrane_mp4_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_plugin/) | -| [membrane_matroska_plugin](https://github.com/membraneframework/membrane_matroska_plugin) | Matroska muxer and demuxer | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_plugin.svg)](https://hex.pm/api/packages/membrane_matroska_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_plugin/) | -| [membrane_flv_plugin](https://github.com/membraneframework/membrane_flv_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flv_plugin.svg)](https://hex.pm/api/packages/membrane_flv_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flv_plugin/) | -| [membrane_ivf_plugin](https://github.com/membraneframework/membrane_ivf_plugin) | Plugin for converting video stream into IVF format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ivf_plugin.svg)](https://hex.pm/api/packages/membrane_ivf_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ivf_plugin/) | -| [membrane_ogg_plugin](https://github.com/membraneframework/membrane_ogg_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ogg_plugin.svg)](https://hex.pm/api/packages/membrane_ogg_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ogg_plugin/) | +| [membrane_mp4_plugin](https://github.com/membraneframework/membrane_mp4_plugin) | Utilities for MP4 container parsing and serialization and elements for muxing the stream to CMAF | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_plugin.svg)](https://hex.pm/api/packages/membrane_mp4_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_plugin/) | +| [membrane_matroska_plugin](https://github.com/membraneframework/membrane_matroska_plugin) | Matroska muxer and demuxer | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_plugin.svg)](https://hex.pm/api/packages/membrane_matroska_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_plugin/) | +| [membrane_flv_plugin](https://github.com/membraneframework/membrane_flv_plugin) | Muxer and demuxer elements for FLV format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flv_plugin.svg)](https://hex.pm/api/packages/membrane_flv_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flv_plugin/) | +| [membrane_ivf_plugin](https://github.com/membraneframework/membrane_ivf_plugin) | Plugin for converting video stream into IVF format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ivf_plugin.svg)](https://hex.pm/api/packages/membrane_ivf_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ivf_plugin/) | +| [membrane_ogg_plugin](https://github.com/membraneframework/membrane_ogg_plugin) | Plugin for depayloading an Ogg file into an Opus stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ogg_plugin.svg)](https://hex.pm/api/packages/membrane_ogg_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ogg_plugin/) | + #### Audio codecs | Package | Description | Links | | --- | --- | --- | -| [membrane_aac_plugin](https://github.com/membraneframework/membrane_aac_plugin) | AAC parser and complementary elements for AAC codec | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_plugin.svg)](https://hex.pm/api/packages/membrane_aac_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_plugin/) | -| [membrane_aac_fdk_plugin](https://github.com/membraneframework/membrane_aac_fdk_plugin) | Membrane AAC decoder and encoder based on FDK library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_fdk_plugin.svg)](https://hex.pm/api/packages/membrane_aac_fdk_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_fdk_plugin/) | -| [membrane_flac_plugin](https://github.com/membraneframework/membrane_flac_plugin) | Parser for files in FLAC bitstream format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_plugin.svg)](https://hex.pm/api/packages/membrane_flac_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_plugin/) | -| [membrane_mp3_lame_plugin](https://github.com/membraneframework/membrane_mp3_lame_plugin) | Membrane MP3 encoder based on Lame | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_lame_plugin.svg)](https://hex.pm/api/packages/membrane_mp3_lame_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_lame_plugin/) | -| [membrane_mp3_mad_plugin](https://github.com/membraneframework/membrane_mp3_mad_plugin) | Membrane MP3 decoder based on MAD. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_mad_plugin.svg)](https://hex.pm/api/packages/membrane_mp3_mad_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_mad_plugin/) | -| [membrane_opus_plugin](https://github.com/membraneframework/membrane_opus_plugin) | Membrane Opus encoder and decoder | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_plugin.svg)](https://hex.pm/api/packages/membrane_opus_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_plugin/) | -| [membrane_wav_plugin](https://github.com/membraneframework/membrane_wav_plugin) | Plugin providing elements handling audio in WAV file format. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_wav_plugin.svg)](https://hex.pm/api/packages/membrane_wav_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_wav_plugin/) | +| [membrane_aac_plugin](https://github.com/membraneframework/membrane_aac_plugin) | AAC parser and complementary elements for AAC codec | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_plugin.svg)](https://hex.pm/api/packages/membrane_aac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_plugin/) | +| [membrane_aac_fdk_plugin](https://github.com/membraneframework/membrane_aac_fdk_plugin) | Membrane AAC decoder and encoder based on FDK library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_fdk_plugin.svg)](https://hex.pm/api/packages/membrane_aac_fdk_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_fdk_plugin/) | +| [membrane_flac_plugin](https://github.com/membraneframework/membrane_flac_plugin) | Parser for files in FLAC bitstream format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_plugin.svg)](https://hex.pm/api/packages/membrane_flac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_plugin/) | +| [membrane_mp3_lame_plugin](https://github.com/membraneframework/membrane_mp3_lame_plugin) | Membrane MP3 encoder based on Lame | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_lame_plugin.svg)](https://hex.pm/api/packages/membrane_mp3_lame_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_lame_plugin/) | +| [membrane_mp3_mad_plugin](https://github.com/membraneframework/membrane_mp3_mad_plugin) | Membrane MP3 decoder based on MAD. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp3_mad_plugin.svg)](https://hex.pm/api/packages/membrane_mp3_mad_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp3_mad_plugin/) | +| [membrane_opus_plugin](https://github.com/membraneframework/membrane_opus_plugin) | Membrane Opus encoder and decoder | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_plugin.svg)](https://hex.pm/api/packages/membrane_opus_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_plugin/) | +| [membrane_wav_plugin](https://github.com/membraneframework/membrane_wav_plugin) | Plugin providing elements handling audio in WAV file format. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_wav_plugin.svg)](https://hex.pm/api/packages/membrane_wav_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_wav_plugin/) | + #### Video codecs | Package | Description | Links | | --- | --- | --- | -| [membrane_h264_plugin](https://github.com/membraneframework/membrane_h264_plugin) | Membrane h264 parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_plugin.svg)](https://hex.pm/api/packages/membrane_h264_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_plugin/) | -| [membrane_h264_ffmpeg_plugin](https://github.com/membraneframework/membrane_h264_ffmpeg_plugin) | Membrane H264 parser, decoder and encoder based on FFmpeg and x264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_ffmpeg_plugin.svg)](https://hex.pm/api/packages/membrane_h264_ffmpeg_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_ffmpeg_plugin/) | -| [elixir-turbojpeg](https://github.com/BinaryNoggin/elixir-turbojpeg) | [Maintainer: [BinaryNoggin](https://github.com/BinaryNoggin)] libjpeg-turbo bindings for Elixir | | -| [membrane_subtitle_mixer_plugin](https://github.com/kim-company/membrane_subtitle_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that uses CEA708 to merge subtitles directly in H264 packets. | | +| [membrane_h264_plugin](https://github.com/membraneframework/membrane_h264_plugin) | Membrane h264 parser | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_plugin.svg)](https://hex.pm/api/packages/membrane_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_plugin/) | +| [membrane_h264_ffmpeg_plugin](https://github.com/membraneframework/membrane_h264_ffmpeg_plugin) | Membrane H264 decoder and encoder based on FFmpeg and x264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_ffmpeg_plugin.svg)](https://hex.pm/api/packages/membrane_h264_ffmpeg_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_ffmpeg_plugin/) | +| [elixir-turbojpeg](https://github.com/BinaryNoggin/elixir-turbojpeg) | [Maintainer: [BinaryNoggin](https://github.com/BinaryNoggin)] libjpeg-turbo bindings for Elixir | | +| [membrane_subtitle_mixer_plugin](https://github.com/kim-company/membrane_subtitle_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that uses CEA708 to merge subtitles directly in H264 packets. | | + #### Raw audio & video | Package | Description | Links | | --- | --- | --- | -| [membrane_generator_plugin](https://github.com/membraneframework/membrane_generator_plugin) | Video and audio samples generator | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_generator_plugin.svg)](https://hex.pm/api/packages/membrane_generator_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_generator_plugin/) | +| [membrane_generator_plugin](https://github.com/membraneframework/membrane_generator_plugin) | Video and audio samples generator | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_generator_plugin.svg)](https://hex.pm/api/packages/membrane_generator_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_generator_plugin/) | + **Raw audio** | Package | Description | Links | | --- | --- | --- | -| [membrane_raw_audio_parser_plugin](https://github.com/membraneframework/membrane_raw_audio_parser_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_audio_parser_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_parser_plugin/) | -| [membrane_portaudio_plugin](https://github.com/membraneframework/membrane_portaudio_plugin) | Raw audio retriever and player based on PortAudio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_portaudio_plugin.svg)](https://hex.pm/api/packages/membrane_portaudio_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_portaudio_plugin/) | -| [membrane_audio_mix_plugin](https://github.com/membraneframework/membrane_audio_mix_plugin) | Plugin providing an element mixing raw audio frames. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_mix_plugin.svg)](https://hex.pm/api/packages/membrane_audio_mix_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_mix_plugin/) | -| [membrane_audio_filler_plugin](https://github.com/membraneframework/membrane_audio_filler_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_filler_plugin.svg)](https://hex.pm/api/packages/membrane_audio_filler_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_filler_plugin/) | -| [membrane_ffmpeg_swresample_plugin](https://github.com/membraneframework/membrane_ffmpeg_swresample_plugin) | Plugin performing audio conversion, resampling and channel mixing, using SWResample module of FFmpeg library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swresample_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_swresample_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swresample_plugin/) | -| [membrane_audiometer_plugin](https://github.com/membraneframework/membrane_audiometer_plugin) | Elements for measuring the level of the audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audiometer_plugin.svg)](https://hex.pm/api/packages/membrane_audiometer_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audiometer_plugin/) | +| [membrane_raw_audio_parser_plugin](https://github.com/membraneframework/membrane_raw_audio_parser_plugin) | Membrane element for parsing raw audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_audio_parser_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_parser_plugin/) | +| [membrane_portaudio_plugin](https://github.com/membraneframework/membrane_portaudio_plugin) | Raw audio retriever and player based on PortAudio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_portaudio_plugin.svg)](https://hex.pm/api/packages/membrane_portaudio_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_portaudio_plugin/) | +| [membrane_audio_mix_plugin](https://github.com/membraneframework/membrane_audio_mix_plugin) | Plugin providing an element mixing raw audio frames. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_mix_plugin.svg)](https://hex.pm/api/packages/membrane_audio_mix_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_mix_plugin/) | +| [membrane_audio_filler_plugin](https://github.com/membraneframework/membrane_audio_filler_plugin) | Element for filling missing buffers in audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audio_filler_plugin.svg)](https://hex.pm/api/packages/membrane_audio_filler_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audio_filler_plugin/) | +| [membrane_ffmpeg_swresample_plugin](https://github.com/membraneframework/membrane_ffmpeg_swresample_plugin) | Plugin performing audio conversion, resampling and channel mixing, using SWResample module of FFmpeg library | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swresample_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_swresample_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swresample_plugin/) | +| [membrane_audiometer_plugin](https://github.com/membraneframework/membrane_audiometer_plugin) | Elements for measuring the level of the audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audiometer_plugin.svg)](https://hex.pm/api/packages/membrane_audiometer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audiometer_plugin/) | + **Raw video** | Package | Description | Links | | --- | --- | --- | -| [membrane_raw_video_parser_plugin](https://github.com/membraneframework/membrane_raw_video_parser_plugin) | Membrane plugin for parsing raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_video_parser_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_parser_plugin/) | -| [membrane_video_merger_plugin](https://github.com/membraneframework/membrane_video_merger_plugin) | Membrane raw video cutter, merger and cut & merge bin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_merger_plugin.svg)](https://hex.pm/api/packages/membrane_video_merger_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_merger_plugin/) | -| [membrane_video_compositor_plugin](https://github.com/membraneframework/membrane_video_compositor_plugin) | Membrane plugin that accepts multiple video inputs, transforms them according to provided transformations and composes them into a single output video. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_compositor_plugin.svg)](https://hex.pm/api/packages/membrane_video_compositor_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_compositor_plugin/) | -| [membrane_camera_capture_plugin](https://github.com/membraneframework/membrane_camera_capture_plugin) | A set of elements allowing for capturing local media such as camera or microphone | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_camera_capture_plugin.svg)](https://hex.pm/api/packages/membrane_camera_capture_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_camera_capture_plugin/) | -| [membrane_framerate_converter_plugin](https://github.com/membraneframework/membrane_framerate_converter_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_framerate_converter_plugin.svg)](https://hex.pm/api/packages/membrane_framerate_converter_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_framerate_converter_plugin/) | -| [membrane_sdl_plugin](https://github.com/membraneframework/membrane_sdl_plugin) | Membrane video player based on SDL | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_sdl_plugin.svg)](https://hex.pm/api/packages/membrane_sdl_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_sdl_plugin/) | -| [membrane_ffmpeg_swscale_plugin](https://github.com/membraneframework/membrane_ffmpeg_swscale_plugin) | Plugin providing an element scaling raw video frames, using SWScale module of FFmpeg library. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swscale_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_swscale_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swscale_plugin/) | -| [membrane_ffmpeg_video_filter_plugin](https://github.com/membraneframework/membrane_ffmpeg_video_filter_plugin) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_video_filter_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_video_filter_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_video_filter_plugin/) | -| [membrane_video_mixer_plugin](https://github.com/kim-company/membrane_video_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that mixes a variable number of input videos into one output using ffmpeg filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_mixer_plugin.svg)](https://hex.pm/api/packages/membrane_video_mixer_plugin) | +| [membrane_raw_video_parser_plugin](https://github.com/membraneframework/membrane_raw_video_parser_plugin) | Membrane plugin for parsing raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_video_parser_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_parser_plugin/) | +| [membrane_video_merger_plugin](https://github.com/membraneframework/membrane_video_merger_plugin) | Membrane raw video cutter, merger and cut & merge bin | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_merger_plugin.svg)](https://hex.pm/api/packages/membrane_video_merger_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_merger_plugin/) | +| [membrane_video_compositor_plugin](https://github.com/membraneframework/membrane_video_compositor_plugin) | Membrane plugin that accepts multiple video inputs, transforms them according to provided transformations and composes them into a single output video. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_compositor_plugin.svg)](https://hex.pm/api/packages/membrane_video_compositor_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_compositor_plugin/) | +| [membrane_camera_capture_plugin](https://github.com/membraneframework/membrane_camera_capture_plugin) | A set of elements allowing for capturing local media such as camera or microphone | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_camera_capture_plugin.svg)](https://hex.pm/api/packages/membrane_camera_capture_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_camera_capture_plugin/) | +| [membrane_framerate_converter_plugin](https://github.com/membraneframework/membrane_framerate_converter_plugin) | Element for converting frame rate of raw video stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_framerate_converter_plugin.svg)](https://hex.pm/api/packages/membrane_framerate_converter_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_framerate_converter_plugin/) | +| [membrane_sdl_plugin](https://github.com/membraneframework/membrane_sdl_plugin) | Membrane video player based on SDL | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_sdl_plugin.svg)](https://hex.pm/api/packages/membrane_sdl_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_sdl_plugin/) | +| [membrane_ffmpeg_swscale_plugin](https://github.com/membraneframework/membrane_ffmpeg_swscale_plugin) | Plugin providing an element scaling raw video frames, using SWScale module of FFmpeg library. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_swscale_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_swscale_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_swscale_plugin/) | +| [membrane_ffmpeg_video_filter_plugin](https://github.com/membraneframework/membrane_ffmpeg_video_filter_plugin) | FFmpeg-based video filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_video_filter_plugin.svg)](https://hex.pm/api/packages/membrane_ffmpeg_video_filter_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_video_filter_plugin/) | +| [membrane_video_mixer_plugin](https://github.com/kim-company/membrane_video_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that mixes a variable number of input videos into one output using ffmpeg filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_mixer_plugin.svg)](https://hex.pm/api/packages/membrane_video_mixer_plugin) | + #### External APIs | Package | Description | Links | | --- | --- | --- | -| [membrane_element_gcloud_speech_to_text](https://github.com/membraneframework/membrane_element_gcloud_speech_to_text) | Membrane plugin providing speech recognition via Google Cloud Speech-to-Text API | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_gcloud_speech_to_text.svg)](https://hex.pm/api/packages/membrane_element_gcloud_speech_to_text)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_gcloud_speech_to_text/) | -| [membrane_element_ibm_speech_to_text](https://github.com/membraneframework/membrane_element_ibm_speech_to_text) | Membrane plugin providing speech recognition via IBM Cloud Speech-to-Text service | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_ibm_speech_to_text.svg)](https://hex.pm/api/packages/membrane_element_ibm_speech_to_text)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_ibm_speech_to_text/) | -| [membrane_s3_plugin](https://github.com/YuzuTen/membrane_s3_plugin) | [Maintainer: [YuzuTen](https://github.com/YuzuTen)] Membrane framework plugin to support S3 sources/destinations | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_s3_plugin.svg)](https://hex.pm/api/packages/membrane_s3_plugin)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_s3_plugin/) | -| [membrane_transcription](https://github.com/lawik/membrane_transcription) | [Maintainer: [lawik](https://github.com/lawik)] Prototype transcription for Membrane | | +| [membrane_agora_plugin](https://github.com/membraneframework/membrane_agora_plugin) | Membrane Sink for Agora Server Gateway | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_agora_plugin.svg)](https://hex.pm/api/packages/membrane_agora_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_agora_plugin/) | +| [membrane_element_gcloud_speech_to_text](https://github.com/membraneframework/membrane_element_gcloud_speech_to_text) | Membrane plugin providing speech recognition via Google Cloud Speech-to-Text API | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_gcloud_speech_to_text.svg)](https://hex.pm/api/packages/membrane_element_gcloud_speech_to_text) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_gcloud_speech_to_text/) | +| [membrane_element_ibm_speech_to_text](https://github.com/membraneframework/membrane_element_ibm_speech_to_text) | Membrane plugin providing speech recognition via IBM Cloud Speech-to-Text service | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_element_ibm_speech_to_text.svg)](https://hex.pm/api/packages/membrane_element_ibm_speech_to_text) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_element_ibm_speech_to_text/) | +| [membrane_s3_plugin](https://github.com/YuzuTen/membrane_s3_plugin) | [Maintainer: [YuzuTen](https://github.com/YuzuTen)] Membrane framework plugin to support S3 sources/destinations | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_s3_plugin.svg)](https://hex.pm/api/packages/membrane_s3_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_s3_plugin/) | +| [membrane_transcription](https://github.com/lawik/membrane_transcription) | [Maintainer: [lawik](https://github.com/lawik)] Prototype transcription for Membrane | | + ### Formats | Package | Description | Links | | --- | --- | --- | -| [membrane_rtp_format](https://github.com/membraneframework/membrane_rtp_format) | Real-time Transport Protocol format for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_format.svg)](https://hex.pm/api/packages/membrane_rtp_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_format/) | -| [membrane_cmaf_format](https://github.com/membraneframework/membrane_cmaf_format) | | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_cmaf_format.svg)](https://hex.pm/api/packages/membrane_cmaf_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_cmaf_format/) | -| [membrane_matroska_format](https://github.com/membraneframework/membrane_matroska_format) | Matroska Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_format.svg)](https://hex.pm/api/packages/membrane_matroska_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_format/) | -| [membrane_mp4_format](https://github.com/membraneframework/membrane_mp4_format) | MPEG-4 container Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_format.svg)](https://hex.pm/api/packages/membrane_mp4_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_format/) | -| [membrane_raw_audio_format](https://github.com/membraneframework/membrane_raw_audio_format) | Raw audio format definition for the Membrane Multimedia Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_format.svg)](https://hex.pm/api/packages/membrane_raw_audio_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_format/) | -| [membrane_raw_video_format](https://github.com/membraneframework/membrane_raw_video_format) | Membrane Multimedia Framework: Raw video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_format.svg)](https://hex.pm/api/packages/membrane_raw_video_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_format/) | -| [membrane_aac_format](https://github.com/membraneframework/membrane_aac_format) | Advanced Audio Codec Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_format.svg)](https://hex.pm/api/packages/membrane_aac_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_format/) | -| [membrane_opus_format](https://github.com/membraneframework/membrane_opus_format) | Opus audio format definition for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_format.svg)](https://hex.pm/api/packages/membrane_opus_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_format/) | -| [membrane_flac_format](https://github.com/membraneframework/membrane_flac_format) | FLAC audio format description for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_format.svg)](https://hex.pm/api/packages/membrane_flac_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_format/) | -| [membrane_mpegaudio_format](https://github.com/membraneframework/membrane_mpegaudio_format) | MPEG audio format definition for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegaudio_format.svg)](https://hex.pm/api/packages/membrane_mpegaudio_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegaudio_format/) | -| [membrane_h264_format](https://github.com/membraneframework/membrane_h264_format) | Membrane Multimedia Framework: H264 video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_format.svg)](https://hex.pm/api/packages/membrane_h264_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_format/) | -| [membrane_vp8_format](https://github.com/membraneframework/membrane_vp8_format) | VP8 Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp8_format.svg)](https://hex.pm/api/packages/membrane_vp8_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp8_format/) | -| [membrane_vp9_format](https://github.com/membraneframework/membrane_vp9_format) | VP9 Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp9_format.svg)](https://hex.pm/api/packages/membrane_vp9_format)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp9_format/) | +| [membrane_rtp_format](https://github.com/membraneframework/membrane_rtp_format) | Real-time Transport Protocol format for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_format.svg)](https://hex.pm/api/packages/membrane_rtp_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_format/) | +| [membrane_cmaf_format](https://github.com/membraneframework/membrane_cmaf_format) | Membrane description for Common Media Application Format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_cmaf_format.svg)](https://hex.pm/api/packages/membrane_cmaf_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_cmaf_format/) | +| [membrane_matroska_format](https://github.com/membraneframework/membrane_matroska_format) | Matroska Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_matroska_format.svg)](https://hex.pm/api/packages/membrane_matroska_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_matroska_format/) | +| [membrane_mp4_format](https://github.com/membraneframework/membrane_mp4_format) | MPEG-4 container Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_format.svg)](https://hex.pm/api/packages/membrane_mp4_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_format/) | +| [membrane_raw_audio_format](https://github.com/membraneframework/membrane_raw_audio_format) | Raw audio format definition for the Membrane Multimedia Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_format.svg)](https://hex.pm/api/packages/membrane_raw_audio_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_format/) | +| [membrane_raw_video_format](https://github.com/membraneframework/membrane_raw_video_format) | Membrane Multimedia Framework: Raw video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_format.svg)](https://hex.pm/api/packages/membrane_raw_video_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_format/) | +| [membrane_aac_format](https://github.com/membraneframework/membrane_aac_format) | Advanced Audio Codec Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_format.svg)](https://hex.pm/api/packages/membrane_aac_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_format/) | +| [membrane_opus_format](https://github.com/membraneframework/membrane_opus_format) | Opus audio format definition for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opus_format.svg)](https://hex.pm/api/packages/membrane_opus_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opus_format/) | +| [membrane_flac_format](https://github.com/membraneframework/membrane_flac_format) | FLAC audio format description for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_flac_format.svg)](https://hex.pm/api/packages/membrane_flac_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_flac_format/) | +| [membrane_mpegaudio_format](https://github.com/membraneframework/membrane_mpegaudio_format) | MPEG audio format definition for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mpegaudio_format.svg)](https://hex.pm/api/packages/membrane_mpegaudio_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mpegaudio_format/) | +| [membrane_h264_format](https://github.com/membraneframework/membrane_h264_format) | Membrane Multimedia Framework: H264 video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h264_format.svg)](https://hex.pm/api/packages/membrane_h264_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h264_format/) | +| [membrane_vp8_format](https://github.com/membraneframework/membrane_vp8_format) | VP8 Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp8_format.svg)](https://hex.pm/api/packages/membrane_vp8_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp8_format/) | +| [membrane_vp9_format](https://github.com/membraneframework/membrane_vp9_format) | VP9 Membrane format | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_vp9_format.svg)](https://hex.pm/api/packages/membrane_vp9_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_vp9_format/) | + ### Standalone media libs | Package | Description | Links | | --- | --- | --- | -| [video_compositor](https://github.com/membraneframework/video_compositor) | Application for real-time video processing / transforming / composing | | -| [ex_sdp](https://github.com/membraneframework/ex_sdp) | Parser and serializer for Session Description Protocol | [![Hex.pm](https://img.shields.io/hexpm/v/ex_sdp.svg)](https://hex.pm/api/packages/ex_sdp)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_sdp/) | -| [ex_libnice](https://github.com/membraneframework/ex_libnice) | Libnice-based Interactive Connectivity Establishment (ICE) protocol support for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libnice.svg)](https://hex.pm/api/packages/ex_libnice)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libnice/) | -| [ex_libsrtp](https://github.com/membraneframework/ex_libsrtp) | Elixir bindings for libsrtp | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libsrtp.svg)](https://hex.pm/api/packages/ex_libsrtp)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libsrtp/) | -| [ex_dtls](https://github.com/membraneframework/ex_dtls) | DTLS and DTLS-SRTP handshake library for Elixir, based on OpenSSL | [![Hex.pm](https://img.shields.io/hexpm/v/ex_dtls.svg)](https://hex.pm/api/packages/ex_dtls)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_dtls/) | -| [membrane_rtsp](https://github.com/membraneframework/membrane_rtsp) | RTSP client for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtsp.svg)](https://hex.pm/api/packages/membrane_rtsp)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtsp/) | -| [membrane_ffmpeg_generator](https://github.com/membraneframework-labs/membrane_ffmpeg_generator) | [Labs] FFmpeg video and audio generator for tests, benchmarks and demos. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_generator.svg)](https://hex.pm/api/packages/membrane_ffmpeg_generator)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_generator/) | -| [membrane_telemetry_dashboard](https://github.com/membraneframework/membrane_telemetry_dashboard) | | | -| [webrtc-server](https://github.com/membraneframework/webrtc-server) | Signaling server for WebRTC | | +| [video_compositor](https://github.com/membraneframework/video_compositor) | Application for real-time video processing / transforming / composing | | +| [ex_sdp](https://github.com/membraneframework/ex_sdp) | Parser and serializer for Session Description Protocol | [![Hex.pm](https://img.shields.io/hexpm/v/ex_sdp.svg)](https://hex.pm/api/packages/ex_sdp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_sdp/) | +| [ex_libnice](https://github.com/membraneframework/ex_libnice) | Libnice-based Interactive Connectivity Establishment (ICE) protocol support for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libnice.svg)](https://hex.pm/api/packages/ex_libnice) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libnice/) | +| [ex_libsrtp](https://github.com/membraneframework/ex_libsrtp) | Elixir bindings for libsrtp | [![Hex.pm](https://img.shields.io/hexpm/v/ex_libsrtp.svg)](https://hex.pm/api/packages/ex_libsrtp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_libsrtp/) | +| [ex_dtls](https://github.com/membraneframework/ex_dtls) | DTLS and DTLS-SRTP handshake library for Elixir, based on OpenSSL | [![Hex.pm](https://img.shields.io/hexpm/v/ex_dtls.svg)](https://hex.pm/api/packages/ex_dtls) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_dtls/) | +| [membrane_rtsp](https://github.com/membraneframework/membrane_rtsp) | RTSP client for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtsp.svg)](https://hex.pm/api/packages/membrane_rtsp) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtsp/) | +| [membrane_ffmpeg_generator](https://github.com/membraneframework-labs/membrane_ffmpeg_generator) | [Labs] FFmpeg video and audio generator for tests, benchmarks and demos. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_generator.svg)](https://hex.pm/api/packages/membrane_ffmpeg_generator) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_generator/) | +| [webrtc-server](https://github.com/membraneframework/webrtc-server) | Signaling server for WebRTC | | + ### Utils | Package | Description | Links | | --- | --- | --- | -| [unifex](https://github.com/membraneframework/unifex) | Tool for generating interfaces between native C code and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | -| [bundlex](https://github.com/membraneframework/bundlex) | Multiplatform app bundler tool for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/api/packages/bundlex)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bundlex/) | -| [beamchmark](https://github.com/membraneframework/beamchmark) | Elixir tool for benchmarking EVM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/api/packages/beamchmark)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark/) | -| [bunch](https://github.com/membraneframework/bunch) | A bunch of helper functions, intended to make life easier | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/api/packages/bunch)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch/) | -| [bunch_native](https://github.com/membraneframework/bunch_native) | Native part of the Bunch package | [![Hex.pm](https://img.shields.io/hexpm/v/bunch_native.svg)](https://hex.pm/api/packages/bunch_native)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch_native/) | -| [shmex](https://github.com/membraneframework/shmex) | Elixir bindings for shared memory | [![Hex.pm](https://img.shields.io/hexpm/v/shmex.svg)](https://hex.pm/api/packages/shmex)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/shmex/) | -| [membrane_common_c](https://github.com/membraneframework/membrane_common_c) | Membrane Multimedia Framework: Common C Routines | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_common_c.svg)](https://hex.pm/api/packages/membrane_common_c)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_common_c/) | -| [membrane_telemetry_metrics](https://github.com/membraneframework/membrane_telemetry_metrics) | Membrane tool for generating metrics | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_telemetry_metrics.svg)](https://hex.pm/api/packages/membrane_telemetry_metrics)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_telemetry_metrics/) | -| [membrane_opentelemetry](https://github.com/membraneframework-labs/membrane_opentelemetry) | [Labs] | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opentelemetry.svg)](https://hex.pm/api/packages/membrane_opentelemetry)[![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry/) | +| [unifex](https://github.com/membraneframework/unifex) | Tool for generating interfaces between native C code and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | +| [bundlex](https://github.com/membraneframework/bundlex) | Multiplatform app bundler tool for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/api/packages/bundlex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bundlex/) | +| [beamchmark](https://github.com/membraneframework/beamchmark) | Elixir tool for benchmarking EVM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/api/packages/beamchmark) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark/) | +| [bunch](https://github.com/membraneframework/bunch) | A bunch of helper functions, intended to make life easier | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/api/packages/bunch) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch/) | +| [bunch_native](https://github.com/membraneframework/bunch_native) | Native part of the Bunch package | [![Hex.pm](https://img.shields.io/hexpm/v/bunch_native.svg)](https://hex.pm/api/packages/bunch_native) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch_native/) | +| [shmex](https://github.com/membraneframework/shmex) | Elixir bindings for shared memory | [![Hex.pm](https://img.shields.io/hexpm/v/shmex.svg)](https://hex.pm/api/packages/shmex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/shmex/) | +| [membrane_common_c](https://github.com/membraneframework/membrane_common_c) | Membrane Multimedia Framework: Common C Routines | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_common_c.svg)](https://hex.pm/api/packages/membrane_common_c) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_common_c/) | +| [membrane_telemetry_metrics](https://github.com/membraneframework/membrane_telemetry_metrics) | Membrane tool for generating metrics | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_telemetry_metrics.svg)](https://hex.pm/api/packages/membrane_telemetry_metrics) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_telemetry_metrics/) | +| [membrane_opentelemetry](https://github.com/membraneframework-labs/membrane_opentelemetry) | [Labs] Utilities for using OpenTelemetry with Membrane | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_opentelemetry.svg)](https://hex.pm/api/packages/membrane_opentelemetry) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_opentelemetry/) | diff --git a/update_packages_list.exs b/update_packages_list.exs index ec3de90a3..a5525e54b 100644 --- a/update_packages_list.exs +++ b/update_packages_list.exs @@ -77,6 +77,7 @@ packages = "membrane_ffmpeg_video_filter_plugin", "kim-company/membrane_video_mixer_plugin", {:md, "#### External APIs"}, + "membrane_agora_plugin", "membrane_element_gcloud_speech_to_text", "membrane_element_ibm_speech_to_text", "YuzuTen/membrane_s3_plugin", @@ -103,7 +104,6 @@ packages = "ex_dtls", "membrane_rtsp", "membrane_ffmpeg_generator", - "membrane_telemetry_dashboard", "webrtc-server", {:md, "### Utils"}, "unifex", @@ -231,7 +231,7 @@ packages_md = packages |> Enum.map_reduce(%{header_present: false}, fn %{type: :markdown, content: content}, acc -> - {content, %{acc | header_present: false}} + {"\n#{content}", %{acc | header_present: false}} %{type: :package} = package, acc -> prefix = @@ -255,7 +255,7 @@ packages_md = result = """ #{if acc.header_present, do: "", else: header}\ - | #{url} | #{prefix}#{package.description} | #{hex_badge}#{hexdocs_badge} |\ + | #{url} | #{prefix}#{package.description} | #{hex_badge} #{hexdocs_badge} |\ """ {result, %{acc | header_present: true}} From e5a449e9209b76ecf90022cdd31c849b902e3286 Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Fri, 15 Sep 2023 13:46:53 +0200 Subject: [PATCH 08/14] fix readme --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 796eceedb..67a7104a0 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,6 @@ --- -Multimedia processing framework that focuses on reliability, concurrency and scalability. - Membrane is a versatile multimedia streaming & processing framework. You can use it to build a media server of your need, that can: - stream via WebRTC, RTSP, RTMP, HLS, HTTP and other protocols, - transcode, mix and apply custom processing of video & audio, From b4fe12794fd5ecbf8853f32f9989249d5654dcfb Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Tue, 19 Sep 2023 12:21:10 +0200 Subject: [PATCH 09/14] format example --- example.livemd | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/example.livemd b/example.livemd index 454c49b24..8d0e54574 100644 --- a/example.livemd +++ b/example.livemd @@ -2,10 +2,11 @@ ```elixir Logger.configure(level: :info) + Mix.install([ :membrane_hackney_plugin, :membrane_mp3_mad_plugin, - :membrane_portaudio_plugin, + :membrane_portaudio_plugin ]) ``` @@ -19,7 +20,8 @@ defmodule MyPipeline do def handle_init(_ctx, mp3_url) do spec = child(%Membrane.Hackney.Source{ - location: mp3_url, hackney_opts: [follow_redirect: true] + location: mp3_url, + hackney_opts: [follow_redirect: true] }) |> child(Membrane.MP3.MAD.Decoder) |> child(Membrane.PortAudio.Sink) @@ -28,9 +30,10 @@ defmodule MyPipeline do end end -mp3_url = "https://raw.githubusercontent.com/membraneframework/membrane_demo/master/simple_pipeline/sample.mp3" +mp3_url = + "https://raw.githubusercontent.com/membraneframework/membrane_demo/master/simple_pipeline/sample.mp3" -Membrane.Pipeline.start_link(MyPipeline, mp3_url) +{:ok, _supervisor, pipeline} = Membrane.Pipeline.start_link(MyPipeline, mp3_url) ``` ## Terminate the pipeline From edcc97f6d667fcfe509afea17f30d14fb247e6cb Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Tue, 19 Sep 2023 14:50:13 +0200 Subject: [PATCH 10/14] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Feliks PobiedziƄski <38541925+FelonEkonom@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67a7104a0..d41dd6df0 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Apart from plugins, Membrane has stream formats, which live in `membrane_X_forma The API for creating pipelines (and custom elements too) is provided by [membrane_core](https://github.com/membraneframework/membrane_core). To install it, add the following line to your `deps` in `mix.exs` and run `mix deps.get` ```elixir -{:membrane_core, "~> 0.12.0"} +{:membrane_core, "~> 0.12.9"} ``` Or, if you'd like to try the latest release candidate, use this version: From 3980839e8dcb9b8ad1bd5169875e219d32d71009 Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Thu, 21 Sep 2023 10:53:06 +0200 Subject: [PATCH 11/14] fixes for CR --- .formatter.exs | 2 +- README.md | 16 +++++--- update_packages_list.exs | 86 +++++++++++++++++++++------------------- 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/.formatter.exs b/.formatter.exs index 8644b35e6..56ab8c4db 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -11,7 +11,7 @@ locals_without_parens = [ inputs: [ "{lib,test,config,benchmark}/**/*.{ex,exs}", - "mix.exs" + "*.exs" ], locals_without_parens: locals_without_parens, export: [ diff --git a/README.md b/README.md index d41dd6df0..8516a7981 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ [![API Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core/) [![CircleCI](https://circleci.com/gh/membraneframework/membrane_core.svg?style=svg)](https://circleci.com/gh/membraneframework/membrane_core) -### Let's meet on 13th October at [RTC.ON](https://rtcon.live) - the first conference about Membrane & multimedia! -### Learn more at [rtcon.live](https://rtcon.live) +### []() Let's meet on 13th October at [RTC.ON](https://rtcon.live) - the first conference about Membrane & multimedia! +### []() Learn more at [rtcon.live](https://rtcon.live) --- @@ -23,6 +23,8 @@ Want a generic media server, instead of building a custom one? Try [Jellyfish](h If you have questions or need consulting, we're for you at our [Discord](https://discord.gg/nwnfVSY), [forum](https://elixirforum.com/c/elixir-framework-forums/membrane-forum/), [GitHub discussions](https://github.com/orgs/membraneframework/discussions), [X (Twitter)](https://twitter.com/ElixirMembrane) and via [e-mail](mailto:info@membraneframework.org). +You can also [follow Membrane on X (Twitter)](https://twitter.com/ElixirMembrane) or [join our Discord](https://discord.gg/nwnfVSY) to be up to date and get involved in the community. + Membrane is maintained by [Software Mansion](swmansion.com). ## Quick start @@ -84,7 +86,7 @@ Elements can be organized into a pipeline - a sequence of linked elements that p ### Membrane packages -To embrace modularity, Membrane is delivered to you in multiple packages, including plugins, formats, core and standalone libraries. The complete list of all the Membrane packages maintained by the Membrane team is available [here](https://github.com/membraneframework/membrane_core/Membrane-packages). +To embrace modularity, Membrane is delivered to you in multiple packages, including plugins, formats, core and standalone libraries. The complete list of all the Membrane packages maintained by the Membrane team is available [here](#Membrane-packages). **Plugins** @@ -131,11 +133,11 @@ We welcome everyone to contribute to Membrane. Here are some ways to contribute: - Spread the word about Membrane! Even though multimedia are present everywhere today, media dev is still quite niche. Let it be no longer! - Create learning materials. We try our best but can cover only a limited number of Membrane use cases. - Improve docs. We know it's not the most exciting part, but if you had a hard time understanding the docs, you're the best person to fix them ;) -- Contribute code - plugins, features and bug fixes. It's best to contact us before, so we can provide our help & assistance, and agree on important matters. For details see the [contribution guide](CONTRIBUTING.md) +- Contribute code - plugins, features and bug fixes. It's best to contact us before, so we can provide our help & assistance, and agree on important matters. For details see the [contribution guide](CONTRIBUTING.md). ## Support and questions -If you have any problems with Membrane Framework feel free to contact us via [Discord](https://discord.gg/nwnfVSY), [forum](https://elixirforum.com/c/elixir-framework-forums/membrane-forum/), [GitHub discussions](https://github.com/orgs/membraneframework/discussions), [X (Twitter)](https://twitter.com/ElixirMembrane) or [e-mail](mailto:info@membraneframework.org). +If you have any questions regarding Membrane Framework or need consulting, feel free to contact us via [Discord](https://discord.gg/nwnfVSY), [forum](https://elixirforum.com/c/elixir-framework-forums/membrane-forum/), [GitHub discussions](https://github.com/orgs/membraneframework/discussions), [X (Twitter)](https://twitter.com/ElixirMembrane) or [e-mail](mailto:info@membraneframework.org). ## All packages @@ -147,6 +149,7 @@ If you have any problems with Membrane Framework feel free to contact us via [Di | Package | Description | Links | | --- | --- | --- | | [membrane_core](https://github.com/membraneframework/membrane_core) | The core of the Membrane Framework, advanced multimedia processing framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_core.svg)](https://hex.pm/api/packages/membrane_core) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_core/) | +| [membrane_rtc_engine](https://github.com/jellyfish-dev/membrane_rtc_engine) | [Maintainer: [jellyfish-dev](https://github.com/jellyfish-dev)] Customizable Real-time Communication Engine/SFU library focused on WebRTC. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtc_engine.svg)](https://hex.pm/api/packages/membrane_rtc_engine) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtc_engine/) | | [kino_membrane](https://github.com/membraneframework/kino_membrane) | Utilities for introspecting Membrane pipelines in Livebook | [![Hex.pm](https://img.shields.io/hexpm/v/kino_membrane.svg)](https://hex.pm/api/packages/kino_membrane) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/kino_membrane/) | | [docker_membrane](https://github.com/membraneframework-labs/docker_membrane) | [Labs] A docker image based on Ubuntu, with Erlang, Elixir and libraries necessary to test and run the Membrane Framework. | | | [membrane_demo](https://github.com/membraneframework/membrane_demo) | Examples of using the Membrane Framework | | @@ -158,7 +161,6 @@ If you have any problems with Membrane Framework feel free to contact us via [Di | Package | Description | Links | | --- | --- | --- | | [membrane_file_plugin](https://github.com/membraneframework/membrane_file_plugin) | Membrane plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/api/packages/membrane_file_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin/) | -| [membrane_udp_plugin](https://github.com/membraneframework/membrane_udp_plugin) | Membrane plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/api/packages/membrane_udp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin/) | | [membrane_hackney_plugin](https://github.com/membraneframework/membrane_hackney_plugin) | HTTP sink and source based on Hackney | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hackney_plugin.svg)](https://hex.pm/api/packages/membrane_hackney_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hackney_plugin/) | | [membrane_scissors_plugin](https://github.com/membraneframework/membrane_scissors_plugin) | Element for cutting off parts of the stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_scissors_plugin.svg)](https://hex.pm/api/packages/membrane_scissors_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_scissors_plugin/) | | [membrane_tee_plugin](https://github.com/membraneframework/membrane_tee_plugin) | Membrane plugin for splitting data from a single input to multiple outputs | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_tee_plugin.svg)](https://hex.pm/api/packages/membrane_tee_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_tee_plugin/) | @@ -176,6 +178,8 @@ If you have any problems with Membrane Framework feel free to contact us via [Di | [membrane_webrtc_plugin](https://github.com/jellyfish-dev/membrane_webrtc_plugin) | [Maintainer: [jellyfish-dev](https://github.com/jellyfish-dev)] Membrane plugin for sending and receiving media with WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/api/packages/membrane_webrtc_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin/) | | [membrane_rtmp_plugin](https://github.com/membraneframework/membrane_rtmp_plugin) | RTMP server & client | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtmp_plugin.svg)](https://hex.pm/api/packages/membrane_rtmp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtmp_plugin/) | | [membrane_http_adaptive_stream_plugin](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin) | Plugin generating manifests for HLS (DASH support planned) | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_http_adaptive_stream_plugin.svg)](https://hex.pm/api/packages/membrane_http_adaptive_stream_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_http_adaptive_stream_plugin/) | +| [membrane_ice_plugin](https://github.com/jellyfish-dev/membrane_ice_plugin) | [Maintainer: [jellyfish-dev](https://github.com/jellyfish-dev)] Membrane plugin for ICE protocol | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ice_plugin.svg)](https://hex.pm/api/packages/membrane_ice_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ice_plugin/) | +| [membrane_udp_plugin](https://github.com/membraneframework/membrane_udp_plugin) | Membrane plugin for sending and receiving UDP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_udp_plugin.svg)](https://hex.pm/api/packages/membrane_udp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_udp_plugin/) | | [membrane_rtp_plugin](https://github.com/membraneframework/membrane_rtp_plugin) | Membrane bins and elements for sending and receiving RTP/SRTP and RTCP/SRTCP streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_plugin/) | | [membrane_rtp_h264_plugin](https://github.com/membraneframework/membrane_rtp_h264_plugin) | Membrane RTP payloader and depayloader for H264 | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_h264_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_h264_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_h264_plugin/) | | [membrane_rtp_vp8_plugin](https://github.com/membraneframework/membrane_rtp_vp8_plugin) | Membrane elements for payloading and depayloading VP8 into RTP | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_vp8_plugin.svg)](https://hex.pm/api/packages/membrane_rtp_vp8_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_vp8_plugin/) | diff --git a/update_packages_list.exs b/update_packages_list.exs index a5525e54b..97af7ea2b 100644 --- a/update_packages_list.exs +++ b/update_packages_list.exs @@ -7,6 +7,7 @@ packages = [ {:md, "### General"}, "membrane_core", + "membrane_rtc_engine", "kino_membrane", "docker_membrane", "membrane_demo", @@ -14,7 +15,6 @@ packages = {:md, "### Plugins"}, {:md, "#### General purpose"}, "membrane_file_plugin", - "membrane_udp_plugin", "membrane_hackney_plugin", "membrane_scissors_plugin", "membrane_tee_plugin", @@ -29,6 +29,8 @@ packages = "membrane_webrtc_plugin", "membrane_rtmp_plugin", "membrane_http_adaptive_stream_plugin", + "membrane_ice_plugin", + "membrane_udp_plugin", "membrane_rtp_plugin", "membrane_rtp_h264_plugin", "membrane_rtp_vp8_plugin", @@ -137,49 +139,51 @@ gh_req_mock = false repos = ["membraneframework", "membraneframework-labs", "jellyfish-dev"] |> Enum.flat_map(fn org -> - Process.sleep(gh_req_timeout) - - Req.get!( - "https://api.github.com/orgs/#{org}/repos?per_page=100", - decode_json: [keys: :atoms] - ).body + Stream.iterate(1, &(&1 + 1)) + |> Stream.map(fn page -> + Process.sleep(gh_req_timeout) + url = "https://api.github.com/orgs/#{org}/repos?per_page=100&page=#{page}" + IO.puts("Fetching #{url}") + Req.get!(url, decode_json: [keys: :atoms]).body + end) + |> Enum.take_while(&(&1 != [])) + |> Enum.flat_map(& &1) end) |> Map.new(&{&1.name, &1}) - # find repos from the membraneframework organization that aren't in the list package_names = - packages |> Enum.filter(&(&1.type == :package)) |> Enum.map(& &1.name) |> MapSet.new() + packages |> Enum.filter(&(&1.type == :package)) |> MapSet.new(& &1.name) + +packages_blacklist = [ + "circleci-orb", + "guide", + "design-system", + ~r/.*_tutorial/, + "membrane_resources", + "membrane_gigachad", + "static", + "membrane_videoroom", + ".github", + "membraneframework.github.io", + "membrane_rtc_engine_timescaledb" +] lacking_repos = repos |> Map.values() - |> Enum.filter(&(&1.owner.login == "membraneframework")) - |> Enum.map(& &1.name) - |> Enum.reject(&(&1 in package_names)) - |> Enum.reject( - &Enum.any?( - [ - "circleci-orb", - "guide", - "design-system", - ~r/.*_tutorial/, - "membrane_resources", - "membrane_gigachad", - "static", - "membrane_videoroom", - ".github", - "membraneframework.github.io" - ], - fn repo -> &1 =~ repo end - ) - ) + |> Enum.filter(fn repo -> + repo.name not in package_names and + repo.owner.login in ["membraneframework", "jellyfish-dev"] and + (repo.owner.login == "membraneframework" or repo.name =~ ~r/^membrane_.*/) and + not Enum.any?(packages_blacklist, fn name -> repo.name =~ name end) + end) unless Enum.empty?(lacking_repos) do Logger.warning(""" - The following repositories from the membraneframework organization aren't mentioned in the package list: - #{Enum.join(lacking_repos, ",\n")} + The following repositories aren't mentioned in the package list: + #{Enum.map_join(lacking_repos, ",\n", & &1.name)} """) end @@ -197,23 +201,23 @@ packages = :error when owner != nil -> Process.sleep(gh_req_timeout) - IO.puts("Fetching https://api.github.com/repos/#{owner}/#{name}") - - Req.get!("https://api.github.com/repos/#{owner}/#{name}", decode_json: [keys: :atoms]).body + url = "https://api.github.com/repos/#{owner}/#{name}" + IO.puts("Fetching #{url}") + Req.get!(url, decode_json: [keys: :atoms]).body :error -> raise "Package #{inspect(name)} repo not found, please specify owner." end hex = Req.get!("https://hex.pm/api/packages/#{name}", decode_json: [keys: :atoms]) - hex_present = hex.status == 200 + is_hex_present = hex.status == 200 Map.merge(package, %{ owner: repo.owner.login, url: repo.html_url, description: repo.description, - hex_url: if(hex_present, do: hex.body.url), - hexdocs_url: if(hex_present, do: hex.body.docs_html_url) + hex_url: if(is_hex_present, do: hex.body.url), + hexdocs_url: if(is_hex_present, do: hex.body.docs_html_url) }) other -> @@ -229,9 +233,9 @@ header = """ packages_md = packages - |> Enum.map_reduce(%{header_present: false}, fn + |> Enum.map_reduce(%{is_header_present: false}, fn %{type: :markdown, content: content}, acc -> - {"\n#{content}", %{acc | header_present: false}} + {"\n#{content}", %{acc | is_header_present: false}} %{type: :package} = package, acc -> prefix = @@ -254,11 +258,11 @@ packages_md = url = "[#{package.name}](#{package.url})" result = """ - #{if acc.header_present, do: "", else: header}\ + #{if acc.is_header_present, do: "", else: header}\ | #{url} | #{prefix}#{package.description} | #{hex_badge} #{hexdocs_badge} |\ """ - {result, %{acc | header_present: true}} + {result, %{acc | is_header_present: true}} end) |> elem(0) |> Enum.join("\n") From b2597578eef63c4a77b47329f0a6e4e55ed89e25 Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Mon, 25 Sep 2023 13:32:42 +0200 Subject: [PATCH 12/14] add update packages list action --- .github/workflows/update-packages-list2.yml | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/update-packages-list2.yml diff --git a/.github/workflows/update-packages-list2.yml b/.github/workflows/update-packages-list2.yml new file mode 100644 index 000000000..559ae6a03 --- /dev/null +++ b/.github/workflows/update-packages-list2.yml @@ -0,0 +1,30 @@ +name: Update packages list +on: + schedule: + - cron: '0 0 1 1-12/3 *' # Run every three months + push: + branches: + - main + paths: + - .github/workflows/license.yml + +jobs: + test: + runs-on: elixir + name: Update packages list in README + steps: + - uses: actions/checkout@v3 + with: + token: ${{ secrets.BOT_TOKEN }} + - name: Update packages list + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + elixir update_packages_list.exs + git config user.name 'Membrane Bot' + git config user.email 'bot@membrane.stream' + git checkout -b auto-update-packages-list + git add README.md + git commit -m"auto update packages list in readme" + git push -u origin auto-update-packages-list + gh pr create -B master -H auto-update-packages-list --title 'Auto update packages list' \ No newline at end of file From 2d635e1131041673fdb9b1c00ac1065a032a788e Mon Sep 17 00:00:00 2001 From: Mateusz Front Date: Mon, 25 Sep 2023 13:38:37 +0200 Subject: [PATCH 13/14] wip --- .github/workflows/update-packages-list2.yml | 21 +++++++++++---------- README.md | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/update-packages-list2.yml b/.github/workflows/update-packages-list2.yml index 559ae6a03..88d375b3f 100644 --- a/.github/workflows/update-packages-list2.yml +++ b/.github/workflows/update-packages-list2.yml @@ -1,30 +1,31 @@ name: Update packages list on: schedule: - - cron: '0 0 1 1-12/3 *' # Run every three months + - cron: '0 0 1 1-12/1 *' # Run every month push: branches: - - main - paths: - - .github/workflows/license.yml + - update-action + workflow_dispatch: {} jobs: test: - runs-on: elixir + runs-on: ubuntu-latest name: Update packages list in README steps: - uses: actions/checkout@v3 + - uses: erlef/setup-beam@v1 with: - token: ${{ secrets.BOT_TOKEN }} + otp-version: '26.1' + elixir-version: '1.15.6' - name: Update packages list env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.BOT_TOKEN }} run: | elixir update_packages_list.exs git config user.name 'Membrane Bot' git config user.email 'bot@membrane.stream' git checkout -b auto-update-packages-list git add README.md - git commit -m"auto update packages list in readme" - git push -u origin auto-update-packages-list - gh pr create -B master -H auto-update-packages-list --title 'Auto update packages list' \ No newline at end of file + git commit -m"auto update packages list in readme" --allow-empty + git push -f -u origin auto-update-packages-list + gh pr create -B master -H auto-update-packages-list --title 'Auto update packages list' --body '' \ No newline at end of file diff --git a/README.md b/README.md index 8516a7981..ee917b319 100644 --- a/README.md +++ b/README.md @@ -287,7 +287,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel ### Utils | Package | Description | Links | | --- | --- | --- | -| [unifex](https://github.com/membraneframework/unifex) | Tool for generating interfaces between native C code and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | +| [unifex](https://github.com/membraneframework/unifex) | | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | | [bundlex](https://github.com/membraneframework/bundlex) | Multiplatform app bundler tool for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/api/packages/bundlex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bundlex/) | | [beamchmark](https://github.com/membraneframework/beamchmark) | Elixir tool for benchmarking EVM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/api/packages/beamchmark) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark/) | | [bunch](https://github.com/membraneframework/bunch) | A bunch of helper functions, intended to make life easier | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/api/packages/bunch) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch/) | From a323a8bff8e8b3666eef10b2165b458ae9dabcc9 Mon Sep 17 00:00:00 2001 From: Membrane Bot Date: Mon, 25 Sep 2023 14:42:55 +0000 Subject: [PATCH 14/14] auto update packages list in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee917b319..8516a7981 100644 --- a/README.md +++ b/README.md @@ -287,7 +287,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel ### Utils | Package | Description | Links | | --- | --- | --- | -| [unifex](https://github.com/membraneframework/unifex) | | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | +| [unifex](https://github.com/membraneframework/unifex) | Tool for generating interfaces between native C code and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | | [bundlex](https://github.com/membraneframework/bundlex) | Multiplatform app bundler tool for Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/bundlex.svg)](https://hex.pm/api/packages/bundlex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bundlex/) | | [beamchmark](https://github.com/membraneframework/beamchmark) | Elixir tool for benchmarking EVM performance | [![Hex.pm](https://img.shields.io/hexpm/v/beamchmark.svg)](https://hex.pm/api/packages/beamchmark) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/beamchmark/) | | [bunch](https://github.com/membraneframework/bunch) | A bunch of helper functions, intended to make life easier | [![Hex.pm](https://img.shields.io/hexpm/v/bunch.svg)](https://hex.pm/api/packages/bunch) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/bunch/) |