使用 ruby​​ on rails 的在线音频流

Posted

技术标签:

【中文标题】使用 ruby​​ on rails 的在线音频流【英文标题】:Online audio stream using ruby on rails 【发布时间】:2012-09-05 23:00:02 【问题描述】:

我正在尝试编写可以在线流式传输音频(广播电台)的小型网站,但有几个问题: 1. 我是否必须将我所有的音乐文件索引到数据库中,或者我可以从文件系统中随机选择文件并播放它。 2. 我应该什么时候使用 ajax 来加载新歌(在最后完成之后,或者在从服务器获得文件链接的响应之前几秒钟?) 3. 是否值得使用 ajax 或者更好的 make list 来播放它的全部时间然后重新开始?

【问题讨论】:

【参考方案1】:

我认为你问错了问题。

您需要考虑如何在浏览器中播放音频(您将使用什么播放器?)。 您不需要 Ruby on Rails 将文件传递给客户端。可以直接从 Web 服务器(Apache 或 nginx)请求它们 Rails 仅用于在播放器旁边渲染网站,然后播放器将播放音频。根据您使用的播放器,您可以通过 javascript 控制它以从服务器请求下一首歌曲,或者只需将静态播放列表写入客户端,然后播放。

【讨论】:

最重要的是我会使用一些简单的 js 播放器 + html5 音频 api。但是我不确定我是否正确理解了您关于使用 Web 服务器请求文件的信息,您能否解释更多详细信息,或者指出我可以在哪里阅读有关此内容的信息。我找到了一些关于如何使用 php 制作广播流的信息,并且有很多代码对视图没有响应。我还想使用 ruby​​ 标签 gem 显示当前歌曲名称,它可以从文件中读取 id3 标签 嗯.. Ruby on Rails 是一个专注于向客户端呈现 HTML 的 Web 框架。 Web 服务器的主要目的(如 Apache 或 NginX)是将文件从服务器的文件系统提供给客户端。因此,如果您只是将 mp3 文件放在 Rails 应用程序的公共文件夹中,则可以从客户端访问它,而无需您做任何事情.. 好吧,我想我不会那样做,因为我需要巨大的托管空间。是否可以使用一些基于云的系统,如 dropbox 或 g-drive\skydrive 来托管音频文件,然后使用 RoR 使用它们? 如何存储数据完全取决于您。您甚至可以继续使用 SoundCloud 来托管数据,并且只将他们的音频播放器嵌入到您的网站中。Rails 仅服务于充当目录以访问音频源的网站。您将它存储在哪里取决于您...但是大量音频文件的虚拟主机并不便宜..免费服务只能带您到此为止..【参考方案2】:

关于流媒体我同意@Tigraine 现在, 单曲播放: 1 如果您想播放一首歌曲,那么在您的 ajax 调用操作中,在 json 响应中返回一个键值对,其中包含所请求歌曲的音频 URL。 对于播放列表: 2. 您应该返回一个数组,其中包含与添加到播放列表中相同排列的音频 URL。 然后在你的java脚本中声明变量 var current_song var total_song 在 js 音频播放器中,我们通常有方法检测歌曲何时完成,然后在歌曲完成时,您可以将歌曲计数器递增为 current_song+=0

当计数器结束时将其重置为 1: 示例代码是: 在这里,我使用的是 Jplayer,您可以使用任何其他播放器,它是最好且完全可定制的播放器之一。

 var current_song = 0;
    var total_songs;
    var song_id_array;

        $.ajax(
            url:"<%=url_for :controller => 'cont_x',:action => 'song_in_playlist'%>",
            data:'playlist_id=' + encodeURIComponent(playlist_id),
            cache:false,
            success:function (data) 
                song_id_array = data.array; //data.array variable contain's the audio URL's array of songs inside selected playlist which is returned by the action //
                total_songs = song_id_array.length;
            
        )
        current_song = 0;
        play_right_song(current_song);
    

    function play_right_song(current_song) 
        $("#jquery_jplayer_1").jPlayer("destroy");
        var audio_url_inside = song_id_array[current_song];
        $('#jquery_jplayer_1').jPlayer(
            ready:function (event) 
                $(this).jPlayer("setMedia", 
                    mp3:audio_url_inside
                ).jPlayer("play");
            ,
            ended:function ()  // The $.jPlayer.event.ended event
                current_song += 1;
                if (current_song >= total_songs) 
                    current_song = 0;
                
                play_right_song(current_song);
            ,
            swfPath:"<%= asset_path('Jplayer.swf')%>",
            supplied:"mp3"
        );
    

如果您想处理播放列表中的下一首和上一首歌曲,只需询问代码即可。我会更新答案。

【讨论】:

感谢您的回答。但我知道我需要流媒体服务器才能像在广播中一样播放音乐。

以上是关于使用 ruby​​ on rails 的在线音频流的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 mp4 中使用 ruby​​ on rails / web / html5 录制音频

选择 Ruby on Rails 作为基于浏览器的在线游戏的平台

Meetup北京|Ruby on Rails敏捷编程之道

如何在 Ruby 中将音频作为流播放

Ruby on Rails - 迭代 Twitter Gem 搜索结果的问题

ruby on rails模拟HTTP请求错误发生:end of file reached