3

我在一个 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 无法实现?当我尝试它时,没有任何效果。

任何建议,如何解决这个问题?

问候和谢谢!尼古拉斯

4

3 回答 3

1

Flash 视频只能提前几秒钟,除非您有 Flash Media Server 托管您的视频。从技术上讲,这意味着您可以让它在 Air 中按预期工作,但是,视频必须是流式传输的(愚蠢的 adobe ......)。

你有两个选择:

1)将素材作为影片剪辑导入。Flash IDE 对此有一个向导,如果您专门在非 FlashIDE 环境中进行开发,您可以转换并导出为外部资源,例如 SWF 或 SWC。然后将其嵌入或运行时加载到您的应用程序中,使您可以访问 MovieClip 的每帧可步进方法。但是,这确实带来了一些音频同步问题 (iirc)。此外,向后擦洗不是 MC 的强项。

2)编写自己的视频对象,加载图像序列并按顺序显示每一帧。您必须设置自己的音频同步功能,但它可能是除 FLVComponent 或 NetStream 之外最直接的解决方案。

于 2012-02-28T22:22:37.970 回答
1

我注意到 Flash Player 9 的磨砂效果很好且流畅,但在 Player 10+ 中我没有遇到磨砂问题。

我的解决方法是将调用 seek 函数的频率限制为 <= 200 毫秒。这个固定的擦洗,但不如播放器 9 流畅。也许是因为“Flash 视频只能前进几秒钟”的限制?我使用了一个计时器来触发为视频调用 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);

    }
于 2013-01-22T20:12:29.820 回答
0

请检查此演示链接(或通过桌面 Flash Player获取SWF 文件以在浏览器之外进行测试)。
注意:演示需要带有 H.264 视频编解码器和 AAC 或 MP3 音频编解码器的 FLV。

源代码在这里:Github 链接

在上面的演示中,有(基于字节的)搜索和逐帧步进。你要学习的功能主要有:

  • Append_SEEK ( 位置量 ) - 这将到达以字节为单位的指定位置并搜索最近的可用关键帧。

  • get_frame_TAG - 这将提取一个包含一帧数据的标签。音频也可以在帧中,但假设您只有视频。该功能是您调整时间戳的机会。当它运行时,它还会附加标签(因此每个“get_frame_TAG”也是一个“帧步骤”)。

例如:您有一个 25fps 的视频,您希望播放 4 秒后的第三帧...

每个时间戳 1000 毫秒 / 25 fps = 40 个单位。
所以 4000 毫秒 == 4 秒 + 添加 40 x 第 3 帧 == 预期时间戳 4120。

所以得到那个帧意味着......首先找到一个关键帧。然后逐步检查每个帧,检查代表您想要的帧的时间戳。如果不是,则将其更改为与最近的关键帧时间戳相同(这会强制 Flash 快进通过帧以保持同步,因为它假定帧 [时间戳小于预期的] 应该在那个时间播放) . 如果您不喜欢快进的外观,您可以在此过程中“隐藏”视频对象。

于 2014-05-20T15:18:22.843 回答