Apache flex Flex:为视频动态创建预览图像

Apache flex Flex:为视频动态创建预览图像,apache-flex,actionscript-3,video,videodisplay,Apache Flex,Actionscript 3,Video,Videodisplay,我用视频显示器播放flv、mov和mp4,一切都很好。它们都是通过渐进式下载加载的,而不是流式下载。我想做的是抓取一个指定的帧(比如在10秒标记处显示的任何帧),将其转换为位图,并使用该位图作为视频的预览图像。我希望在运行时这样做,这样我就不必为将要显示的每个视频创建预览图像 你知道怎么做吗?我不想通过播放它来伪装它——寻找特定的帧,然后暂停它,但我可能没有其他选择了?我很确定这是不可能的。很可能是。。。但我不这么认为。我认为加载视频的唯一方法是使用NetStream和NetConnection

我用视频显示器播放flv、mov和mp4,一切都很好。它们都是通过渐进式下载加载的,而不是流式下载。我想做的是抓取一个指定的帧(比如在10秒标记处显示的任何帧),将其转换为位图,并使用该位图作为视频的预览图像。我希望在运行时这样做,这样我就不必为将要显示的每个视频创建预览图像


你知道怎么做吗?我不想通过播放它来伪装它——寻找特定的帧,然后暂停它,但我可能没有其他选择了?

我很确定这是不可能的。很可能是。。。但我不这么认为。我认为加载视频的唯一方法是使用NetStream和NetConnection对象,正如您所知,这只是开始加载视频

如果这是用户生成的视频,我认为最好的选择是使用一些serever的侧脚本生成预览图像。我不知道这是如何做到的,但我认为这是大多数剪辑网站的工作方式

如果所有视频都在您的控制下,则可以为其中一个视频编辑程序编写脚本,以便从文件列表中自动生成特定帧的图像。我认为这可能是你最好的选择,你可以迅速站起来跑步


对不起,我的回答含糊不清。。。如果您需要快速解决方案,它可能会为您指明正确的方向

我同意詹姆斯的观点,真正做到这一点的唯一方法是使用服务器端脚本并从视频中提取某些帧。即使你可以用flex来做这件事,你也不会真的想把负担放在客户机上做这件事(我认为这是处理器密集型的)。更不用说,事先创建图像比让flex确定每次加载时显示的缩略图要高效得多。

Ryan和James是正确的——正确的方法可能是在上传/转码时提取帧。但如果这不是一个选项,您可以选择使用您自己的某种默认/占位符图像(通用的或某种程度上适用于尚未捕获拇指的所有视频),只需使用VideoDisplay的DisplayObject抓取,然后将帧上载到您的服务器,例如:

<mx:Script>
    <![CDATA[

        var captured:Boolean;

        private function creationCompleteHandler(event:Event):void
        {
            videoDisplay.source = "http://yourserver/yourvideo.flv";
        }

        private function videoDisplay_playheadUpdate(event:VideoEvent):void
        {
            if (!captured && videoDisplay.playheadTime >= 10)
                capture();
        }

        private function capture():void
        {
            var bmpData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height);
            bmpData.draw(videoDisplay);

            captured = true;

            // Now just upload the byte array to your server for the next user
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.BINARY;

            // ... etc.
        }

    ]]>
</mx:Script>

<mx:VideoDisplay id="videoDisplay" playheadUpdate="videoDisplay_playheadUpdate(event)" />

= 10)
捕获();
}
私有函数capture():void
{
var bmpData:BitmapData=新的BitmapData(videoDisplay.width,videoDisplay.height);
bmpData.draw(视频显示);
捕获=真;
//现在只需将字节数组上传到服务器,供下一个用户使用
变量加载器:URLLoader=新的URLLoader();
loader.dataFormat=URLLoaderDataFormat.BINARY;
//……等等。
}
]]>

再说一次,这也许不是最优雅的解决方案,但它确实有效。这样,第一个用户可以看到通用图像,但随后每个用户都会得到生成的缩略图。(当然,那时你已经上传并正确关联了。)有意义吗?

我最终做了类似的事情(我可能应该规定应用程序必须能够脱机运行,这样我大部分时间都无法轻松访问服务器)但我最终编写了一个黑客程序,加载视频并在需要的帧处暂停。谢谢