2012-02-20 88 views
3

我在一个AS3项目上播放视频(H264)。由于某些特殊原因,我想要去某个位置。Netstream和step()或seek()?

a)我用NetStream.seek()试试。那里只有关键帧。在我目前的情况下,这意味着,我可以每1秒找到一个位置。 (为了更好的分辨率,我不得不电影与许多关键帧越好,又名每一帧关键帧编码)

  • 这是definetly不是我喜欢的方式,因为我不想一切重新编码vids。

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()

这是否意味着,这是不可能与空气的桌面?当我尝试它时,没有任何工作。

有什么建议,该如何解决这个问题?

问候&谢谢! Nicolas

回答

1

除非您有Flash Media Server托管您的视频,否则Flash视频只能按秒提前。从技术上讲,这意味着你可以在Air中按照预期工作,但是,视频必须是流媒体(愚蠢的adobe ...)。

你有两个选择:

1)导入素材的影片剪辑。 Flash IDE为此提供了一个向导,如果您只在非FlashIDE环境中开发,则可以将其作为外部资产(如SWF或SWC)进行转换和导出。然后将这些内容或运行时加载到您的应用程序中,以便访问MovieClip的每帧可执行方法。但是,这确实伴随着一些音频同步问题(iirc)。而且,向后擦洗不是MC的特点。

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

1

我注意到flash player 9擦洗的很好而且很流畅,但是在玩家10+中我得到了这个没有磨砂的问题。

我的修复程序是将搜索功能的调用频率限制为< = 200ms。这固定的清理,但作为播放器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); 

    } 
0

请检查该Demo link(或获得the SWF file通过桌面Flash播放器,以测试浏览器以外)。
注意:演示需要带有H.264视频编解码器和AAC或MP3音频编解码器的FLV。

该源代码是在这里:Github link

在上述演示有(字节为基础的)寻求和由帧步进帧。要重点研究的功能是:

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

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

例如:你有一个25fps的视频,你想要的第三帧,在4秒后进入回放...

1000 milisecs/25帧= 40个单位对于每个时间戳。
因此4000毫秒== 4秒+添加40 x第3帧==预期的时间戳4120.

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

相关问题