【问题标题】:Elixir stream audio to usersElixir 将音频流式传输给用户
【发布时间】:2016-09-29 09:42:28
【问题描述】:

以下代码将文件流式传输到进程。 我想流式传输音频/mp3 对于许多将通过 html5 音频标签听到它的用户。 如何通过File.stream!完成?

defmodule Test do

    def start do
        p = spawn(Test, :say, [])
        send p, {self, "a message"}
    end

    def say do
        receive do
          {from, msg} ->
            IO.puts "Process #{inspect self} says: #{msg}"
            stream_bytes = 128
            File.stream!("./song.mp3", [], stream_bytes)
            |> Enum.each(fn chunk ->
                IO.inspect chunk
            end)
            say
        end
    end
end

$: iex test.ex

iex(1)> 测试开始

输出:

> > > > .....

我如何使用 JavaScript 读取这个二进制数据并通过音频标签听到它?

【问题讨论】:

  • 嗨,小问题。我有同样的要求。您对为此使用 elixir 感到高兴吗?

标签: streaming elixir html5-audio audio-streaming


【解决方案1】:

如果您使用的是基于插件的 Web 框架,它应该相当简单。如果您直接使用 plug 或在 phoenix 中使用它(基于 plug),这是可能的。

也许像这样的插件可以解决问题

defmodule Audio do
  @chunk_size 128

  def init(opts), do: opts

  def song(conn, _opts) do
    conn = conn
    |> send_chunked(200)
    |> put_resp_header("content-type", "audio/mpeg")

    File.stream!("/some/song/somewhere.mp3", [], @chunk_size)
    |> Enum.into(conn)
  end 
end

也许你想把你的插头连接到这样的凤凰路由器

defmodule MyApp.Router do
  use MyApp.Web, :router

  get "/the_song", Audio, :song
end

然后在你的页面中

<audio src="/the_song">
    Your browser does not support the <code>audio</code> element.
</audio>

【讨论】:

  • 谢谢!它可以工作,但会引发预期“[error] Ranch listener Plugtest.HTTP 的连接过程以 :cowboy_protocol:start_link/4 at #PID exit 开始,原因是:{{%File.Error{action:”stream ", path: "./song.mp3", reason: :enoent}.." && 我怎样才能像广播一样流式传输它,以便所有连接的用户都能从同一秒听到?对于这个测试,我可以循环播放歌曲,但我想继续播放列表中的下一首歌曲
  • 该错误表明该文件不存在。您需要解析路径 - 我建议不要使用相对路径。就您的实际目标而言,这是朝着它迈出的一步,但您需要更多。现在您正在谈论 pubsub 架构。在 Elixir 中,这应该非常容易。您需要一个正在运行并保持文件流的进程,并跟踪打开的连接。 GenServer 可以很好地工作。当它从流中读取块时,它应该写入它知道的每个连接。
  • 再次感谢@rozap,请在stackoverflow.com/questions/38551798查看相关问题
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
相关资源
最近更新 更多