2016-05-31 3 views
5

다음 코드는 파일을 프로세스로 스트리밍합니다. html5 오디오 태그를 통해 많은 사용자에게 오디오/mp3 을 스트리밍하고 싶습니다. 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)> Test.start

출력 :

< < 171, 46, 254, 26, 163, 32, 178 , 27, 0, 75, 17, 35, 4, 236, 51, 57, 5, 144, 154, 198, 166, 47, 62, 4, 61, 85, 67, 135, 16, 34, 82, 49 , 57, 176, 131, 96, 116, 152, 232, 24, 32, 140, 220, 67, 73, 128, 165, 178, 230, 202, ... >> < < 100, 220, 156 , 19 1, 38, 0, 161, 117, 80, 16, 102, 91, 22, 5,8,66,26,7,193,155,193,66,198,28,157,244,65,131, 204, 240, 5, 172, 143, 44, 173, 85, 144, 2, 157, 144, 145,97,2002361649149150,133,67 ... >> 128, 137, 254, 192, 218, 218, 26, 69, 231, 88, 124, 33,129,169,66,117,52,214,134,13010385130, 48 개, 6 개, 144 개, 221 개, 153 개, 132 개, 8 개, 181 개, 26 개, 27 개, 83 개, 140 개, 54 개, 117 개, 149 개, 116, ... >> < <57, 2, 143, 220, 198, 182, 22, 177, 231, 126, 187, 147, 33,9,1,5,164,2,36,105, 47, 255, 255, 255, 255, 255, 245, 54, 51, 225, 104, 98, 1 184, 148, 206, 50, 135, 230, 16, 64, 130, 192, 198, ... >> ..............

JavaScript를 사용하여이 바이너리 데이터를 읽고 오디오 태그를 통해들을 수 있습니까?

답변

2

플러그 기반 웹 프레임 워크를 사용하는 경우 비교적 간단합니다. 플러그를 직접 사용하거나 피닉스 (플러그 기반)에서 사용하는 경우 가능합니다.

어쩌면 이런 플러그가

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> 
+0

고마워요! [오류] 목장 청취자 Plugtest.HTTP는 연결 프로세스가 시작되었습니다 : #PID에서 Cowboy_protocol : start_link/4 <0.261.0> 종료 원인 : {{% File.Error {action : "stream", path : "./song.mp3", 이유 : : enoent} .. "&& 어떻게 모든 사람이 똑같은 순간부터들을 수 있도록 라디오처럼 스트리밍 할 수 있습니까? 이 테스트에서는 노래를 반복 할 수 있지만 재생 목록의 다음 노래로 계속 진행하려고합니다. – IddoE

+0

오류로 인해 파일이 존재하지 않는다고 표시됩니다. 당신은 경로를 해결해야합니다 - 나는 상대 경로를 사용하지 않는 것이 좋습니다. 실제 목표까지는이 단계가 있지만 더 많이 필요합니다. 이제 당신은 pubsub 아키텍처에 대해 이야기하고 있습니다. 엘릭서에서는 놀랍도록 쉬운 일입니다. 실행 중이며 파일 스트림을 보유하고 열려있는 연결을 추적하는 단일 프로세스가 필요합니다. GenServer가 잘 작동합니다. 스트림에서 청크를 읽는 동안 청크는 각 연결에 대해 알고 있어야합니다. – rozap

+0

다시 한번 감사드립니다. http://stackoverflow.com/questions/38551798에서 관련 질문을 확인하십시오. – IddoE

관련 문제