我一直想要制作直播音频流媒体服务,有点像抽搐。现在在你说这太难了之前应该只使用已经存在的服务,我真的想知道如何从头开始实际做到这一点的细节。我做了一些研究,但我发现的结果非常模糊,或者指导我做了类似Wowza的事情。我已经看到了一些关于HTTP Live Streaming的内容,我想我理解了一般的想法:麦克风/摄像头将其馈送发送到编码器,编码器将m3u8格式的馈送发送到服务器,人们流式传输m3u8文件从服务器到他们的设备。但是我该怎么做呢?这背后的实际编程是什么?是否有必要使用像Wowza或Red5这样的服务?
答案 0 :(得分:11)
我做了一些研究,但我发现的结果非常模糊
不幸的是,你提出了一些非常模糊的问题,这就是你得到模糊答案的原因。让我把你的问题分解成碎片吧。如果您对具体问题有疑问,则应发布单独的特定问题,然后在评论中链接到该问题。
是否有必要使用Wowza或Red5等服务?
这些不是服务(好吧,Wowza提供了一些服务),但处理流媒体的服务器。他们接受您的源流并有效地将其传递给所有听众。是的,您需要某种类型的服务器才能通过互联网将流媒体传输给人们,并且它不需要是Wowza或Red5。根据您的具体需求,还有许多其他方法可以做到这一点。
让我们谈谈一个更简单的方法...... HTTP渐进式流媒体。您的客户端(Web浏览器,应用程序,互联网收音机等)可以在收到音频流时播放它们。他们不知道或不关心它的现场......他们所知道的只是他们提出了HTTP请求,收到了足够的数据来播放,并开始播放。他们也不知道或关心消息来源是什么......无论是将文件转码到流中还是有人用麦克风说话。重要的不是。在这种模式下,互联网广播流基本上就像一个似乎永远不会结束的音频文件。如果您查看SHOUTcast或Icecast,HTTP progressive就是他们所说的协议。
对于编码器,原始音频必须来自某个地方,例如音频捕获设备(麦克风,混音器等)或一堆音频文件。原始音频数据(通常是PCM)用编解码器(例如MP3)编码。这个编解码器的输出现在通过HTTP PUT请求发送到服务器(如果您正在使用Icecast ... hacky其他方法用于SHOUTcast,SOURCE用于旧Icecast)。服务器接收此数据,保留它的一个小缓冲区,并将其副本发送给连接的客户端。
如果您正在播放MP3,则服务器只会在数据输入时将数据立即发送回客户端。其他容器格式(如Ogg)需要在流捕获之前首先发送标头。此时,服务器基本上动态地将流数据复用到每个客户端的动态容器中。 (通常通过构建标题来完成,然后在正确的点处拼接其余的流。)
HTTP渐进式流式传输是有利的,因为它在您的浏览器中开箱即用,与旧设备和新设备兼容(我的旧Palm Pilot播放它们很好),并且只需要很少的服务器资源。
我已经看到了一些关于HTTP Live Streaming的内容
HLS是可用的协议之一。而不是像HTTP渐进式一样持续运行的流,而是一次记录编解码器输出几秒钟,保存一大块数据,并将其上传到服务器。然后,客户端可以按顺序下载这些块并播放它们。这种方法有很多开销,但人们选择它有一些关键原因:
客户端可以在分段符时切换到不同的流。如果客户端正在播放一些高清视频,但后来发现它没有带宽支持它,它可以开始下载SD视频。编码器通常被配置为以各种比特率提供块。与HLS一起使用的容器格式支持这种直接流连接,因为基本上通知编解码器以确保流在那时可以拼接。
HLS不需要特殊服务器。您可以通过SFTP或通常使用的任何方法将文件上传到Web服务器。没有什么可以安装在网页通常需要的东西上。
由于您将数据存储在服务器上,因此如果客户端可以处理它并且您拥有磁盘空间,则可以自动支持重播。
CDN发行。如果您想在S3存储桶前使用Cloudfront之类的东西,那么您可以以不同于分发任何其他文件的方式为AWS提供支持。
对HLS的一个很大的负面影响是客户支持。虽然HTTP渐进式流式传输自HTTP以来已经有效,但HLS是新的,客户并不擅长它。浏览器不直接支持它,需要使用MediaSource API和一些工艺JavaScript来处理播放。依赖标准框架的移动应用程序经常遇到麻烦......特别是Android 3.0有一些非常讨厌的HLS错误。随着时间的推移,情况会越来越好。
我还有其他类似的协议,但是它是MPEG DASH。分段完成类似于HLS,并且它正在迅速吞噬HLS的实际使用。
但我该怎么做呢?这背后的实际编程是什么?
你必须将这个问题分解成碎片来决定你想要达到的目标。特别是做什么?你想制作一个编码器吗?制作服务器?
我一直想制作一个现场音频流媒体服务,有点像抽搐。
为此,您不需要自己发明任何技术。你可以组装已经存在的碎片。让我们假设"像Twitch"表示以下内容:
要做到这一切,我会说: - 不要自己托管流,使用CDN。 - 使用MediaRecorder API进行编码。 (尚未广泛使用,但很快就会推出。)
我在这篇文章中没有达到字符限制......所以我希望能让你开始。请发布除此之外的具体问题。