我正在使用 VideoDisplay 播放 flv、mov 和 mp4,一切正常。它们都是通过渐进式下载加载的,而不是流式传输的。我想做的是抓取一个指定的帧(就像在 10 秒标记处显示的任何内容),将其转换为位图并将该位图用作视频的预览图像。我想在运行时执行此操作,因此我不必为要显示的每个视频创建预览图像。
关于如何做到这一点的任何想法?我宁愿不要通过播放来伪造它——寻找那个特定的帧然后暂停它,但我可能别无选择?
我正在使用 VideoDisplay 播放 flv、mov 和 mp4,一切正常。它们都是通过渐进式下载加载的,而不是流式传输的。我想做的是抓取一个指定的帧(就像在 10 秒标记处显示的任何内容),将其转换为位图并将该位图用作视频的预览图像。我想在运行时执行此操作,因此我不必为要显示的每个视频创建预览图像。
关于如何做到这一点的任何想法?我宁愿不要通过播放来伪造它——寻找那个特定的帧然后暂停它,但我可能别无选择?
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)" />
同样,它可能不是最优雅的解决方案,但它确实有效。这样,第一个用户会看到通用图像,但此后每个用户都会获得生成的缩略图。(当然,届时您将上传并正确关联。)有意义吗?
我很确定这是不可能的。很可能……但不要这么认为。我认为加载视频的唯一方法是使用 NetStream 和 NetConnection 对象,如您所知,这只是开始加载视频。
如果这是用户生成的视频,我认为最好的办法是拥有一些生成预览图像的服务器端脚本。不知道这是如何完成的,但认为这是大多数剪辑网站的工作方式。
如果所有视频都在您的控制范围内,则可以为其中一个视频编辑程序编写脚本,以自动从文件列表中为特定帧生成图像。我认为这可能是您可以快速启动并运行的最佳选择。
抱歉,答案含糊……如果您需要快速解决方案,它可能会为您指明正确的方向。
我同意詹姆斯的观点,真正做到这一点的唯一方法是使用服务器端脚本并从视频中提取某些帧。即使您可以使用 flex 来完成此操作,您也真的不想将执行此操作的负担(我认为这将是处理器密集型)放在客户端计算机上。更不用说预先创建图像比让 flex 确定每次加载时显示的缩略图要有效得多。