如何在 Unix 上实现 HTTP Live Streaming 服务器?

Posted

技术标签:

【中文标题】如何在 Unix 上实现 HTTP Live Streaming 服务器?【英文标题】:How to implement HTTP Live Streaming server on Unix? 【发布时间】:2012-01-18 20:43:30 【问题描述】:

我刚刚意识到 Apple 需要 HTTP Live Streaming 才能在 iPhone 应用程序中观看视频。我以前没有意识到这一点......我现在正试图了解这涉及到什么,以便我可以决定是否要完成这项工作并以 3G 的形式提供视频,或者将视频播放限制为连接到 wi-fi 的用户.

我阅读了 Apple 提供的overview,现在了解到我的服务器需要对我的媒体文件进行分段和索引。我也明白我不必托管内容就可以流式传输它(我可以指向托管在其他地方的视频,对吗?)。

目前我还不清楚在我的服务器 (Ubuntu Hardy) 上实现什么来执行实际的动态分段和索引(再一次,我不托管我想投放的视频)。

我找到了link 解释如何安装 FFmpeg 和 X264,但我不知道这是否是最好的解决方案(因为我有一个 Ubuntu 服务器,我不能使用 Apple Live Streaming 工具,是吗?正确的?)。另外,我不明白我的服务器在什么时候知道需要转换视频并开始工作......

任何可以帮助我准确了解在服务器端做什么才能在我的 iPhone 应用程序上以 3G 流式传输视频的反馈,我们将不胜感激! (哦,这有什么不同,我的应用后端在 Rails 中)

【问题讨论】:

我建议 FMLE 和 red5(通过 rtmp)如果没有人我会稍后回答 感谢您的回复。我只想澄清一件事,我对录制的视频感兴趣,而不是现场表演。 您几乎必须托管内容才能从您的服务器流式传输它。您认为托管和服务之间的区别是什么?接受的答案与你的问题没有任何关系,所以我不知道你为什么接受它。 你说得对,我必须托管 HTTP-Live-Streaming-ready 内容(即分段内容,但不是原始内容)。在这一点上,接受的答案有效,是我拥有的最佳选择。如果您有更好的提议,请在下面写下您的笔记,我很乐意接受。 【参考方案1】:

如果您想从网络摄像头流式传输实时内容:FMLE(闪存媒体实时编码器)

如果你想流式传输静态内容(电影):ffmpeg & xuggle

red5:

您的媒体服务器可以是 red5(开源和免费)或 FMS 或 wowza。但是我只用了red5,其他的我不知道。你可以找到red5here。

您的服务器可以在任何地方,但您需要打开一些端口(至少 1935 用于 rtmp),5080 用于“管理面板”,您可以在列表中看到 9999。 (查看文档)Red5 是 java 中的媒体服务器,因此您需要 java jdk >= 1.6。

Red5 1.0 RC 可以在here 找到。您可以找到适用于 windows、osx 或 linux 的版本。我使用了压缩包版本。提取它并运行“red5.sh”。您应该能够通过http://localhost:5080/ 访问管理员,并且您还应该看到正在显示的视频。如果没有,那就是出了点问题,在这一切正常之前你不能走得更远。

使用 ffmpeg 流式传输:

你可以找到xuggle here,你可以找到更多关于这个here的信息

ffmpeg -i your_file.flv -re -acodec copy -vcodec copy -f flv rtmp://localhost_or_yourred5serverip/live/livestream

请记住,如果您想在网络上流式传输它,则只能在 flash 播放器中播放 flv 和 mp4(我认为)。流式传输后,您应该能够在“管理面板”here 中看到它。连接到您的服务器(rtmp://localhost/live/)并转到视图选项卡并输入“livestream”。您也可以使用 mplayer rtmp://localhost/live/livestream 来观看您的视频。

在 Flash 播放器中流式传输:

您可以使用 flowplayer(带有 rtmp 插件)或 jwplayer。

【讨论】:

这是一个后续问题:***.com/questions/8497541/…,以防您再次提供帮助!谢谢。【参考方案2】:

流式传输 HLS 的最简单方法是使用类似 Wowza 或 FMIS(两者都不便宜)。 Wowza 将接受输入(实时流或存储的 VOD 内容并即时进行分割。

【讨论】:

Wowza 有免费试用,值得一试【参考方案3】:

有多种竞争技术,但今天,如果您希望任何文件都可以在 Apple 设备(iPhone、iPad 等)上进行流式传输,那么 HLS 就是您的最佳选择。顺便说一句,大多数浏览器和 android 也支持它,所以这是一个不错的起点。但请注意,尽管名称如此,但它并不适合流式传输实时内容。

除非您想要实时视频,否则您真的不需要 red5 或 wowza 或 fms 或类似的东西。 HLS 基本上是一组以不同比特率编码的短视频片段(例如每个 5 分钟)和一个 m3u 播放列表,您可以在浏览器中提供给基于 Flash 或 html5 的播放器。段长度或编码方式由您决定。

这是我见过的关于如何选择分辨率、比特率、段大小等的最佳文章:http://www.streamingmedia.com/Articles/Editorial/Featured-Articles/Adaptive-Streaming-in-the-Field-73017.aspx

例如,您可以从那里创建一个目录结构,例如

/data/video/video_id/original.mp4 /data/video/video_id/quality1/chunk1.mp4 /data/video/video_id/quality1/chunk2.mp4 /data/video/video_id/quality2/chunk1.mp4 等等..

然后您需要为所有块和质量生成一个 m3u 播放列表,并由播放器自己实现质量之间的切换和播放下一个文件(大多数现代播放器已经拥有)。

我还强烈建议您查看:https://developer.apple.com/streaming/ - Apple 提供了许多免费工具来为 HTTP 实时流媒体准备视频和播放列表。

【讨论】:

谢谢 Roman,一个很好的链接(现场自适应流 - 作者 Jan Ozer)streamingmedia.com/Articles/Editorial/Featured-Articles/…

以上是关于如何在 Unix 上实现 HTTP Live Streaming 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 apache felix 上实现异步处理?

如何在 iPhone 上实现音频流 <50 毫秒的延迟

在Centos7 上实现编译HTTP(自用)

如何在加载数据时在 AsyncTask 上实现旋转 ProgressBar?

如何在 localhost 和 Web 服务器上实现绝对 URL?

如何在WebSocket上实现Ajax