我正在使用VideoDisplay播放flv,mov和mp4,一切都很好。它们都是通过渐进式下载加载的,并且没有流式传输。我想要做的是抓取一个指定的帧(就像在10秒标记处显示的那样),将其转换为位图并使用该位图作为视频的预览图像。我想在运行时这样做,所以我不必为每个要显示的视频创建预览图像。
关于如何做到这一点的任何想法?我宁愿不通过玩它来伪造它 - 寻找那个特定的框架,然后暂停它,但我可能别无选择?
答案 0 :(得分:2)
Ryan和James是正确的 - 正确的方法可能是在上传/转码时提取帧。但如果这不是一个选项,你可以选择使用你自己的某种默认/占位符图像(通用或某种方式适用于所有尚未捕获其拇指的视频),并使用VideoDisplay的DisplayObject-ness抓取然后将帧上传到您的服务器,例如:
<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)" />
同样,它可能不是最优雅的解决方案,但它确实有效。这样,第一个用户看到通用图像,但此后每个用户都获得生成的缩略图。 (当然,那时你会上传并正确关联。)有意义吗?
答案 1 :(得分:1)
我很确定这是不可能的。它可能是......但不要这么认为。我认为加载视频的唯一方法是使用NetStream和NetConnection对象,正如您所知,这只是开始加载视频。
如果这是用户生成的视频,我认为最好的选择是使用一些生成预览图像的serever side脚本。不知道如何做到这一点,但认为这是大多数剪辑网站的工作方式。
如果所有视频都在您的控制之下,则可以为其中一个视频编辑程序编写脚本,以自动从文件列表生成特定帧的图像。我认为这可能是你选择的最佳选择,你可以快速起步和运行。
对于模糊的回答感到抱歉......如果您需要快速解决方案,它可能会指向您正确的方向。
答案 2 :(得分:-1)
我同意James的观点,真正做到这一点的唯一方法就是使用服务器端脚本并从视频中拉出某些帧。即使您可以使用flex执行此操作,您也真的不想在客户端计算机上承担这样的负担(我认为这将是处理器密集型)。更不用说,手动创建图像比使用flex确定每次加载时显示的缩略图要高效得多。