2016-05-31 35 views
5

Aşağıdaki kod bir dosyayı bir işleme akıtmaktadır. Ses/mp3 akışını html5 ses etiketi ile duyacak birçok kullanıcıya aktarmak istiyorum. File.stream! ile nasıl yapılabilir?Kullanıcılara Elixir Akışı Sesi

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

çıkışı:

< < 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, 200, 236, 16, 49, 149, 150, 133, 67, ... >> < 150, 54, 37, 254, 192, 218, 218, 26, 69, 231, 88, 124, 33, 129, 169, 66, 117, 52, 214, 134, 130, 103, 85, 130, 48, 6, 144, 221, 153, 132, 8, 181, 26, 27, 83, 140, 54, 117, 149, 7, 60, 144, 237, 248, 132, 12, 210, 51, 103, 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, 28, 50, 47, 144, 134, 53, 16, 64, 130, 192, 198, ... >> .....................................

Bu ikili verileri okumak ve ses etiketiyle duymak için JavaScript'i nasıl kullanabilirim?

cevap

2

Fiş tabanlı bir web çerçevesi kullanıyorsanız, oldukça basit bir şekilde ileri doğru olmalıdır. Bu, fişi doğrudan kullanıyorsanız veya phoenix içinde kullanıyorsanız (fişe dayalı) mümkündür.

Belki böyle bir fiş

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 

Belki sayfanıza O zaman bu

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

    get "/the_song", Audio, :song 
end 

gibi bir anka yönlendiriciye fişini takılmak istiyorum hile yapacağını

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

Teşekkürler! çalışır, ancak bir expection atar "[error] Çiftlik dinleyicisi Plugtest.HTTP ile başlayan bağlantı süreci: cowboy_protocol: start_link/4 neden #PID <0.261.0> nedeniyle çıkış: {{% File.Error {action:" stream ", yol: "./song.mp3", sebep:: enoent} .. "&& radyoyu nasıl radyo gibi yayınlayabilirim, böylece tüm bağlı kullanıcılar aynı saniyeden haber alır? Bu test için şarkıyı açabilirim ama çalma listesindeki bir sonraki şarkıya devam etmek istiyorum – IddoE

+0

Bu hata, dosyanın mevcut olmadığını söylüyor. Yolu çözmeniz gerekecek - göreceli yolları kullanmamanızı öneririz. Asıl amacınıza gelince, bu bir adımdır ama daha fazlasına ihtiyacınız var. Artık bir pubsub mimarisinden bahsediyorsun. Elixir'de bu şaşırtıcı derecede kolay olmalı. Dosya akışını çalıştıran ve tutan tek bir işlem isteyeceksiniz ve açık bağlantıların kaydını tutar. Bir GenServer iyi çalışacaktır. Akıştan gelen parçaları okurken, bildiği her bağlantıya yazmalıdır. – rozap

+0

tekrar teşekkürler @rozap, lütfen http://stackoverflow.com/questions/38551798 adresinden ilgili soruları kontrol edin. – IddoE