【问题标题】:Netstream and step() or seek()?Netstream 和 step() 还是 seek()?
【发布时间】:2012-02-20 17:22:23
【问题描述】:
我正在进行一个 AS3 项目,正在播放视频 (H264)。由于某些特殊原因,我想去某个职位。
a) 我尝试使用 NetStream.seek()。那里只涉及关键帧。在我目前的设置中,这意味着我可以每 1 秒找到一个位置。 (为了获得更好的分辨率,我必须用尽可能多的关键帧对电影进行编码,也就是每一帧都是一个关键帧)
- 这绝对不是我最喜欢的方式,因为我不想重新编码所有的视频。
b) 我尝试使用 NetStream.step()。这应该让我有机会从一个帧到另一个帧慢慢地走。但在文档中它说:
仅当数据从 Flash Media Server 3.5.3 或更高版本流式传输且 NetStream.inBufferSeek 为 true 时,此方法才可用。
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step()
这是否意味着 Air for Desktop 无法实现?当我尝试它时,没有任何效果。
任何建议,如何解决这个问题?
您好,谢谢!
尼古拉斯
【问题讨论】:
标签:
actionscript-3
actionscript
seek
netstream
【解决方案1】:
除非您有 Flash Media Server 托管您的视频,否则 Flash 视频只能提前几秒钟。从技术上讲,这意味着您可以让它在 Air 中按预期工作,但是,视频必须是流式传输的(愚蠢的 adobe...)。
你有两个选择:
1) 将素材作为影片剪辑导入。 Flash IDE 对此有一个向导,如果您专门在非 FlashIDE 环境中进行开发,您可以转换并导出为外部资源,例如 SWF 或 SWC。然后将其嵌入或运行时加载到您的应用程序中,使您可以访问 MovieClip 的每帧可步进方法。但是,这确实带来了一些音频同步问题 (iirc)。此外,向后擦洗也不是 MC 的强项。
2) 编写自己的视频对象,加载图像序列并按顺序显示每一帧。您必须设置自己的音频同步功能,但它可能是除 FLVComponent 或 NetStream 之外最直接的解决方案。
【解决方案2】:
我注意到 Flash 播放器 9 的磨砂效果很好且流畅,但在播放器 10+ 中,我发现没有磨砂问题。
我的解决方法是将调用 seek 函数的频率限制为
private var scrubInterval:Timer = new Timer(200);
private function videoScrubberTouch():void {
_ns.pause();
var bounds:Rectangle = new Rectangle(0,0,340,0);
scrubInterval.addEventListener(TimerEvent.TIMER, scrubTimeline);
scrubInterval.start();
videoThumb.startDrag(false, bounds);
}
private function scrubTimeline(e:TimerEvent):void {
var amt:Number = Math.floor((videoThumb.x / 340) * duration);
trace("SCRUB duration: "+duration+" videoThumb.x: "+videoThumb.x+" amt "+amt);
_ns.seek(amt);
}
【解决方案3】:
请查看此Demo link(或获取the SWF file 以通过桌面 Flash Player 在浏览器外部进行测试)。
注意:演示需要带有 H.264 视频编解码器和 AAC 的 FLV 或MP3 音频编解码器。
源代码在这里:Github link
在上面的演示中,有(基于字节的)搜索和逐帧步进。你想学习的函数主要是:
例如:您有一个 25fps 的视频,您希望播放 4 秒后的第三帧...
1000 毫秒 / 25 fps = 每个时间戳 40 个单位。
所以 4000 毫秒 == 4 秒 + 添加 40 x 第 3 帧 == 预期时间戳 4120。
所以得到那个帧意味着……首先找到一个关键帧。然后逐步检查每个帧,检查代表您想要的帧的时间戳。如果不是,则将其更改为与最近的关键帧时间戳相同(这会强制 Flash 快进通过帧以保持同步,因为它假定帧 [时间戳小于预期的] 应该在那个时间播放) .如果您不喜欢快进的外观,您可以在此过程中“隐藏”视频对象。