如何在不使用其Streaming服务器的情况下实现Adobe HTTP Streaming规范

时间:2010-12-14 19:10:51

标签: actionscript flash netstream http-streaming

从Flash 10.1开始,他们添加了通过appendBytes方法(在此处描述http://www.bytearray.org/?p=1689)将字节添加到NetStream对象的功能。这一新增的主要原因是Adobe最终支持视频的HTTP流媒体。这很棒,但您似乎需要使用Adobe Media Streaming Server(http://www.adobe.com/products/httpdynamicstreaming/)从现有视频中创建正确的视频块,以实现流畅的流式传输。

我曾经尝试在我交换NetStream对象(类似于此处http://video.leizhu.com/video.html)的情况下做一个被黑客攻击的HTTP流式版本,但是这些块之间总是暂时停顿。使用新的appendBytes,我尝试使用前一个站点的两段视频进行快速模拟,但即便如此,跳过仍然存在。

有没有人知道如何形成两个连续的.FLV文件,以便NetStream对象上的appendBytes方法创建一个漂亮的流畅视频,而段之间没有明显的跳过?

6 个答案:

答案 0 :(得分:9)

我能够使用Samuel描述的Adobe的文件打包工具来实现这一点。我没有使用NetStream对象,但我使用了OSMF Sample Player,我假设它在内部使用它。以下是不使用FMS的方法:

  1. http://www.adobe.com/products/httpdynamicstreaming/
  2. 获取用于Http Dynamic Streaming的Adobe文件打包程序
  3. 在包含H.264 / AAC的现有MP4文件上运行File Packager,如下所示: C:\ Program Files \ Adob​​e \ Flash Media Server 4 \ tools \ f4fpackager> f4fpackager.exe --input-file =“MyFile.mp4”--segment-duration = 30
  4. 这将导致30秒长的F4F文件,还有F4X和F4M文件。 F4F文件是您应该播放的正确分段(和碎片)MP4文件。 如果您想使用OSMF播放器进行测试,请执行以下操作:

    1. 获取Apache服务器
    2. http://www.adobe.com/products/httpdynamicstreaming/
    3. 获取Adobe的Http Origin Module for Apache
    4. 根据http://help.adobe.com/en_US/HTTPStreaming/1.0/Using/WS8d6ed60bd880807c48597a9e1265edd6cc0-8000.html
    5. 安装模块
    6. 将F4F,F4X和F4M文件放入httpdocs
    7. 下的vod目录中
    8. http://www.osmf.org/downloads/OSFMPlayer_zeri2.zip
    9. 获取“用于HTTP动态流的OSMF示例播放器”
    10. 将Sample Player放入httpdocs目录
    11. 在浏览器中加载示例播放器中的html文件,例如http://localhost/OSMFPlayer.html
    12. 按弹出按钮并输入F4M文件的URL,它应该播放
    13. 所以要回答原始问题Adobe的File Packager是要使用的文件分割器,您不需要购买FMS来使用它,它适用于FLV和MP4 / F4V文件。

答案 1 :(得分:1)

您无需使用他们的服务器。 Wowza支持Adobe的HTTP Streaming版本,您可以通过正确分割视频并在标准HTTP服务器上加载所有段来自行实现。

此处有关于Adobe HTTP Streaming的所有规范的链接:

http://help.adobe.com/en_US/HTTPStreaming/1.0/Using/WS9463dbe8dbe45c4c-1ae425bf126054c4d3f-7fff.html

试图破解客户端做一些自定义样式的http流将会更加麻烦。

请注意,HTTP Streaming不支持流式传输多个不同的视频,但会将单个文件流式传输到单独的段中。

  

文件打包程序

     

一种命令行工具,可将按需媒体文件转换为片段,并将片段写入F4F文件。 File Packager是一个离线工具。您可以使用文件打包程序加密文件以与Flash Access一起使用。有关更多信息,请参阅打包按需媒体。

     

File Packager可从adobe.com获得,并随Adobe®Flash®MediaServer一起安装到rootinstall / tools / f4fpackager文件夹。

Packager下载链接就在这里:下载用于HTTP动态流的文件打包器

http://www.adobe.com/products/httpdynamicstreaming/

答案 2 :(得分:1)

您可以使用F4Pack,它是围绕Adobe命令行工具的GUI,它允许您处理flv / f4v文件,以便它们可用于HTTP动态流。

答案 3 :(得分:1)

OSMF代码中发生这种情况的地方是HTTPNetStream类实现中定时器触发的状态机......可能是一个信息性的读取。我想当我写这篇文章时,我甚至会在那里写一些有用的评论。

就一般问题而言:

如果您将整个FLV文件读入ByteArray并将其传递给appendBytes,它将播放。如果你将FLV文件分成两半,并将前半部分作为字节数组传递,然后将后半部分作为字节数组传递,那么它也会发挥作用。

如果你希望能够在没有间隙的情况下在比特率之间切换,你需要在匹配的关键帧点分割你的FLV文件......并记住只有第一次调用appendBytes才有最初的FLV文件头(' F','L','V',标志,偏移)......其余的只是期望FLV字节序列的延续。

答案 4 :(得分:1)

我最近为node.js找到了一个类似的项目来实现m3u8转码(https://github.com/andrewschaaf/media-server),但是除了Wowza之外还没有听说过在Apache的Origin模块之外做的事情。由于有效载荷几乎相同,因此最好不要寻找一个好的mp4分段解决方案(很多),而不是寻找f4m分段。问题是moov原子特别是在较大的mp4视频上难以管理并放入其正确的初始(文件开头附近)位置。即使使用最佳的ffmpeg设置和'qtfaststart',你的搜索速度也会明显变慢,带宽使用效率低下(通常是贪婪),还有一些与擦除/时间相关的小问题,而这些都与flv / f4v播放无关。

在我的播放器中,我已经或打算在HTTP动态流(HDS)和MP4之间切换,基于加载和实时日志解析Apache使用awk / cron而不是授权Adobe的Access产品进行流保护..两者都有独特的'onmetadata'处理程序..但最后我收到的顺序时间/字节哈希几乎相当。只是MP4比较慢。所以mod_origin只是Flash客户端的同步器/请求路由器(通过http)。我还在寻找加速mp4-container-based播放的方法。我最近阅读了一个令人难以置信的解决方案并且被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和一个专有的闭源模块才能使用它。由于HDS只有1 - 2年的历史,开源实现的到来可能只是时间问题,而且它需要一些逆向工程,比如那个带有node.js + mpegts流的Andrew Chaaf家伙(现场与否)。 最后我可能最终只在我的UI下面使用OSMF,因为它似乎与HDS具有相似的优点,如果不是更多,那么Strobe如果你需要病态的可扩展HDS或MP4开放式播放器平台来实现你自己的自定义播放器。

答案 5 :(得分:0)

Adob​​e的F4F格式基于MP4文件,您是否可以使用F4V或MP4代替FLV文件? 有很多MP4文件分割器,但你需要确保文件中的时间戳是连续的,也许当它在文件内的音频或视频流中看到零时间戳时就会发生暂停。