3

如果您在 Flash 中加载 FLVPlayback 组件或在 Flex 中加载 VideoDisplay 并尝试寻找特定位置或将 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秒的间隔

4

1 回答 1

6

flash 的文档提到 seek() 的值是近似值。造成这种情况的部分原因是视频是如何压缩的。它被分解成块,带有一个关键帧和一组增量帧,其中仅包含有关已更改内容的数据。通过这种方式,视频的整体文件大小比每帧包含每个像素要小得多。

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

要拥有可以停止并寻找任何帧的视频,您必须使用关键帧距离 1 对其进行编码。试试看,你会发现你的文件大小很大,但你现在可以让它顺利向后播放。

至于磨砂棒在寻找时不精确,是的。这是。它有点草率。嘘土坯和所有这些。但是,他们必须在告诉玩家每次鼠标移动时都进行搜索(这可能会使玩家陷入困境,因为它会为每次鼠标移动计算 keframe 加 delta)与实际能够拖动条之间做出权衡。

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

于 2011-12-21T23:31:20.487 回答