如何在不使用其 Streaming 服务器的情况下实施 Adobe HTTP Streaming 规范
Posted
技术标签:
【中文标题】如何在不使用其 Streaming 服务器的情况下实施 Adobe HTTP Streaming 规范【英文标题】:How to implement the Adobe HTTP Streaming spec without using their Streaming server 【发布时间】:2011-05-25 11:54:12 【问题描述】:从 Flash 10.1 开始,他们添加了通过 appendBytes 方法将字节添加到 NetStream 对象的功能(在此处描述为 http://www.bytearray.org/?p=1689)。此次添加的主要原因是 Adobe 终于支持视频的 HTTP 流式传输。这很好,但您似乎需要使用 Adobe Media Streaming Server (http://www.adobe.com/products/httpdynamicstreaming/) 从现有视频创建正确的视频块,以实现流畅的流式传输。
过去,我曾尝试做一个破解版的 HTTP 流式传输,我换掉了 NetStream 对象(类似于这里的http://video.leizhu.com/video.html),但在块之间总是会有短暂的停顿。使用新的 appendBytes,我尝试对上一个站点的两个视频部分进行快速模拟,但即便如此,跳过仍然存在。
有谁知道需要如何格式化两个连续的 .FLV 文件,以便 NetStream 对象上的 appendBytes 方法创建一个流畅的视频,而片段之间没有明显的跳跃?
【问题讨论】:
我还没有收到完全满足要求的答复。第 1 步是将视频解析为 NetStream appentBytes() 可接受的块。第 2 步实际上是将这些块拼凑成连续的视频。我还没有找到有人一起破解这个的地方。我知道 OSMF 支持 HTTP 流,但在他们的代码中没有找到他们实际上是如何做到的。 这是一个棘手的问题,没有人真正提出完整的解决方案。您可能想查看 LongTail(JWPlayer 人员)公开的一些代码。对于所有形式的 HTTP 流,我对 OSMF 的体验一直很差,所以我建议你去别处看看。 【参考方案1】:我能够使用 Samuel 描述的 Adobe 的 File Packager Tool 来完成这项工作。我没有使用 NetStream 对象,但我使用了我假设在内部使用的 OSMF 示例播放器。以下是不使用 FMS 的方法:
-
从http://www.adobe.com/products/httpdynamicstreaming/ 获取用于 Http 动态流的 Adobe 文件打包程序
在包含 H.264/AAC 的现有 MP4 文件上运行文件打包程序,如下所示:
C:\Program Files\Adobe\Flash 媒体服务器 4\tools\f4fpackager>
f4fpackager.exe --input-file="MyFile.mp4" --segment-duration=30
这将产生 30 秒长的 F4F 文件,以及 F4X 和 F4M 文件。 F4F 文件是您应该播放的正确分段(和碎片)的 MP4 文件。 如果您想使用 OSMF 播放器对此进行测试,请执行以下操作:
-
获取 Apache 服务器
从http://www.adobe.com/products/httpdynamicstreaming/ 获取 Adobe 的 Apache Http Origin 模块
按照http://help.adobe.com/en_US/HTTPStreaming/1.0/Using/WS8d6ed60bd880807c48597a9e1265edd6cc0-8000.html安装模块
将F4F、F4X、F4M文件放入httpdocs下的vod目录
从http://www.osmf.org/downloads/OSFMPlayer_zeri2.zip 获取“用于 HTTP 动态流的 OSMF 示例播放器”
将示例播放器放在 httpdocs 目录中
在浏览器中从 Sample Player 加载 html 文件,例如 http://localhost/OSMFPlayer.html
按弹出按钮并输入您的 F4M 文件的 URL,它应该可以播放
所以要回答最初的问题 Adobe 的 File Packager 是要使用的文件拆分器,您无需购买 FMS 即可使用它,它适用于 FLV 和 MP4/F4V 文件。
【讨论】:
【参考方案2】:您不需要使用他们的服务器。 Wowza 支持 Adobe 的 HTTP Streaming 版本,您可以通过正确分割视频并将所有片段加载到标准 HTTP 服务器上来自己实现它。
Adobe 的 HTTP 流的所有规范的链接都在这里:
http://help.adobe.com/en_US/HTTPStreaming/1.0/Using/WS9463dbe8dbe45c4c-1ae425bf126054c4d3f-7fff.html
试图破解客户端来做一些自定义样式的http流会更麻烦。
请注意,HTTP 流式传输不支持流式传输多个不同的视频,而是流式传输被拆分为单独段的单个文件。
文件打包器
将点播媒体文件转换为片段并将片段写入 F4F 文件的命令行工具。 File Packager 是一个离线工具。您可以使用 File Packager 加密文件以供 Flash Access 使用。有关详细信息,请参阅打包点播媒体。
File Packager 可从 adobe.com 获得,它与 Adobe® Flash® Media Server 一起安装到 rootinstall/tools/f4fpackager 文件夹中。
Packager 下载链接就在这里:Download File Packager for HTTP Dynamic Streaming
http://www.adobe.com/products/httpdynamicstreaming/
【讨论】:
问题是我不知道如何分割视频以进行 HTTP 流。如果我只拍摄两个连续的视频文件,它就不能正常工作。我需要做一些低级别的事情,我们自己存储视频的 sn-ps。 你不能用它来播放两个连续的视频。它们必须是视频片段。 这就是我有点困惑的地方,你所说的视频片段是什么意思?如何创建这些细分。我已经看到像 slot3.com 这样的网站在哪里使用 .seg 文件创建文件,但这些似乎不是 FLV 文件,我不确定它是如何适应的。网络问题是如何将一个视频文件拆分为 2 个,那么我如何连续播放它们而没有间隙。我只想在 NetStream 对象上使用 appendByte 方法,根本没有后端媒体服务器(即只需加载两个文件并将它们扔到 NetStream 中)。 @Scott,我更新了我的答案以包含有关打包程序的信息以及指向 Adobe 命令行打包的链接。 感谢您的反馈,但似乎我需要安装他们的服务器才能使用打包程序。我正在尝试找到一些简单(且免费)的东西,可以让我将视频分成多个片段(仅 2 个用于概念验证)。然后我想在 NetStream 上使用 appendBytes 将这两者联系在一起。我可以找到如何将字节注入 NetStream,但找不到如何使这些字节符合要求,因此不会跳过。【参考方案3】:您可以使用F4Pack,它是一个围绕 Adobe 命令行工具的 GUI,可让您处理 flv/f4v 文件,以便将它们用于 HTTP 动态流。
【讨论】:
【参考方案4】:在 OSMF 代码中发生这种情况的地方是 HTTPNetStream 类实现内部的计时器触发状态机......可能是一个信息性阅读。我想我写的时候还放了一些有用的 cmets。
就一般问题而言:
如果您将整个 FLV 文件读入 ByteArray 并将其传递给 appendBytes,它将播放。如果您将该 FLV 文件分成两半,并将前半部分作为字节数组传递,然后将后半部分作为字节数组传递,那么也会播放。
如果您希望能够在比特率之间无缝切换,您需要在匹配的关键帧点处拆分您的 FLV 文件...并记住只有第一次调用 appendBytes 具有初始 FLV 文件头 (' F', 'L', 'V', flags, offset)...其余的只是期待 FLV 字节序列的延续。
【讨论】:
我在拆分成不同文件时遇到的问题是,当两个字节数组之间切换时,播放器会有明显的跳跃【参考方案5】:我最近发现了一个类似的 node.js 项目来实现 m3u8 转码 (https://github.com/andrewschaaf/media-server),但还没有听说过除了 Wowza 在 Apache 的 Origin 模块之外做它的项目。由于有效负载几乎相同,因此您最好寻找一个好的 mp4 分段解决方案(那里有很多),而不是寻找 f4m 分段。问题是 moov 原子,尤其是在较大的 mp4 视频上,难以管理并放置在其正确的初始(接近文件开头)位置。即使使用最佳的 ffmpeg 设置和“qtfaststart”,您最终也会遇到明显较慢的搜索、低效的带宽使用(通常是贪婪的),以及一些与使用 flv/f4v 播放时没有得到的擦洗/时间相关的小问题。
在我的播放器中,我已经或打算在 HTTP 动态流 (HDS) 和 MP4 之间切换处理程序..但最后我收到的排序时间/字节散列实际上是等效的。只是 MP4 比较慢。所以 mod_origin 只是 Flash 客户端(通过 http)的同步器/请求路由器。我仍在寻找加速基于 mp4 容器的播放的方法。我最近读到了一个令人难以置信的解决方案,对此我感到非常震惊http://zehfernando.com/2011/flash-video-frame-time-woes/ 视频编辑器(家伙)和 Flash 开发人员提出了他们自己的 mp4 时间编码解决方案,实际上(通过 Adobe Premiere 脚本)在底部添加了大约 50 像素每个视频帧都带有像帧条形码这样的视觉“二进制”标记。这些二进制值转换为高度准确的时间码值。因此,Flash 可以在绘制视频帧时(实时)分析它们,并从任何类型的 mp4 字节分段友好的网络服务器中准确确定播放器的位置以及需要哪些字节。问题是(也许我在这里错了)Flash 似乎在获取 moov 数据时任意选择,尤其是在大型视频文件(.5-1.5gigs)上。即使您确保通过 MP4Box 运行您的 mp4(即 MP4Box -frag 10000 -inter 0 movie.mp4),我想这也是 OSMF 和 HDS 处理得很好的问题 现在,尽管您需要 Apache 和专有的闭源模块来使用 imo,这很烦人。开源实现到来可能只是时间问题,因为 HDS 只有 1 到 2 年的历史,而且它只需要像 Andrew Chaaf 那个使用 node.js + mpegts 流(直播或不直播)的家伙那样进行一点逆向工程。 最后,我可能最终只在我的 UI 下使用 OSMF,因为它似乎具有与 HDS 相似的优点,如果不是更多的话,即 Strobe,如果你需要病态的可扩展 HDS 或 MP4 开放播放器平台来破解以实现你自己的自定义播放器。
【讨论】:
有很多独立的分割解决方案,但我正在寻找一个可以用来动态分割/分割视频的库(最好是 java 或带有 java hook)。我还没有见过这样的事情。此外,adobe 的 HDS 支持需要其专有格式。我只想一个接一个地播放两个已分割的视频片段,并且没有明显的闪光中断。【参考方案6】:Adobe 的 F4F 格式是基于 MP4 文件的,您可以使用 F4V 或 MP4 代替 FLV 文件吗? 周围有很多 MP4 文件拆分器,但您需要确保文件中的时间戳是连续的,当它在文件内的音频或视频流中看到零时间戳时,可能会发生暂停。
【讨论】:
是的,可以使用带有 h.264 编码视频的 MP4 容器。我无法找到任何地方来确保它正确拆分文件。我有将它们排入 NetStream 的代码,但似乎 NetStream 仍然在文件之间跳转。这个方法你能做到吗? FLV文件格式也有时间戳,也需要连续。 FLV 文件格式非常简单且开放:adobe.com/devnet/f4v.html。您可以尝试编写自己的拆分器。 如果根据@Grant 的说法有“大量的 MP4 文件拆分器”,我宁愿不编写自己的拆分器。必须有某种参考,以前有人尝试过这样做。 Flash 10.1 中添加了 appendByte 方法,现在可以使用重新组合流的部分。剩下的唯一一件事就是弄清楚如何发送分割视频,以便在不跳过的情况下重新组合。以上是关于如何在不使用其 Streaming 服务器的情况下实施 Adobe HTTP Streaming 规范的主要内容,如果未能解决你的问题,请参考以下文章
如何在不重新启动的情况下卸载 Windows 服务并删除其文件
如何在不保存文件的情况下制作打印屏幕并将其发送到 FTP 服务器?我的工作代码将文件保存到硬盘