将播放头搜索到Flash Video中的特定位置?

时间:2011-12-21 20:18:28

标签: flash actionscript-3 flex flvplayback videodisplay

如果您在Flex中加载Flash或VideoDisplay中的FLVPlayback组件并尝试搜索特定位置或将playheadTime设置为特定位置,则电影总是向上或向下舍入非常大量

在Flash中,将FLVPlayback组件拖到舞台并将源设置为http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/examples/assets/phone.flv 然后尝试video.seek(6)或video.playheadTime = 6;

它只会转到10.同样,如果你使用他们的内置洗涤器,唯一的间隔是0,5或10.所以你看到的擦洗框架最多是3

以下是具有相同结果的flex示例。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:media="com.synapsegroup.media.*">

    <mx:Script>
        <![CDATA[
            import mx.events.MetadataEvent;
            import mx.events.SliderEvent;
            import mx.events.VideoEvent;

            protected function scrubber_changeHandler(event:SliderEvent):void
            {               
                trace(event.value);
                video.playheadTime = event.value;
            }

            protected function video_playheadUpdateHandler(event:mx.events.VideoEvent):void
            {               
                //scrubber.value = event.playheadTime;
                //http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/examples/assets/phone.flv
            }

        ]]>
    </mx:Script>

    <mx:Panel>
        <mx:VideoDisplay id="video" source="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/examples/assets/phone.flv" minWidth="200" minHeight="200"
                         autoPlay="false"
                         />
        <mx:ControlBar>
            <mx:Button label="Play" click="video.play();"/>
            <mx:Button label="Stop" click="video.pause();"/>
            <mx:HSlider liveDragging="true" id="scrubber" minimum="0" maximum="11.5" change="scrubber_changeHandler(event)" thumbPress="video.pause();"/>
        </mx:ControlBar>
    </mx:Panel>

</mx:Application>

在这两种情况下,如果你足够快地点击播放/暂停,你可以在更细粒度的情况下暂停各个帧,但这不是一个好的用户体验

我是否缺少以编程方式执行此操作的内容?

我还会说间隔根据视频长度而变化,3分钟长的间隔有10秒间隔

1 个答案:

答案 0 :(得分:6)

flash的文档提到seek()的值是近似值。 部分原因是视频的压缩方式。它被分成几个块,一个关键帧和一组delta帧,它们只包含有关更改内容的数据。通过这种方式,视频的整体文件大小远小于每个帧包含每个像素。

但是,这也意味着您不能只跳到任何帧,因为实际上并不存在许多帧。播放头必须找到最接近的前一个关键帧,然后从中播放。

要制作可以停止并搜索任何帧的视频,您必须使用关键帧距离1对其进行编码。尝试一下,你会看到你的文件大小是enourmouse,但你现在可以让它顺利向后播放。

至于擦洗条在寻求中是不精确的,是的。它是。它有点草率。 Boo adobe等等。但是他们必须在告诉玩家在每次移动鼠标时寻找玩家之间进行权衡,这可能会让玩家陷入困境,因为它会为每次鼠标移动计算keframe加上delta,而不是实际能够拖动横杆。

它并不精彩,但您可以从netstream类编写自己的代码,并根据自己的喜好设置平衡。大多数时候,我发现他们的平衡完全可以服务,即使能够更加精确也是很好的。