在 Flex/Actionscript 中捕获视频缩略图

Posted

技术标签:

【中文标题】在 Flex/Actionscript 中捕获视频缩略图【英文标题】:Capture a video thumbnail in Flex/Actionscript 【发布时间】:2012-01-08 10:01:59 【问题描述】:

我正在编写一个 Adob​​e Air 应用程序。用户将能够将视频导入应用程序,但为了节省应用程序某些部分的内存,我需要先将这些视频转换为缩略图 .jpg 并仅在 tilelist 中显示缩略图。因此,这些缩略图必须在运行时动态生成。所以我的问题是,如何将视频转换为缩略图。到目前为止,我已经尝试了两种不同的方法。我已经使用了我开始工作的 ImageSnapshot 类,但前提是我首先将视频添加到显示列表中,这不是一个选项。然后我尝试使用 BitmapData 类绘制位图数据并遇到了同样的问题。只有当我先将视频添加到显示列表时它才会起作用。有谁知道如何在不先将视频添加到屏幕的情况下从视频帧中获取位图数据?这是我现在使用的代码,它将最终的 .jpg 作为 test.jpg 写入您的桌面,并且仅适用于 .mp4 视频。如果你去掉 this.AddElement(vd) 的那行,它就不再起作用了:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                                                     xmlns:s="library://ns.adobe.com/flex/spark" 
                                                     xmlns:mx="library://ns.adobe.com/flex/mx">

          <fx:Script>
                    <![CDATA[
                              import mx.graphics.ImageSnapshot;
                              import mx.graphics.codec.JPEGEncoder;

                              import spark.components.VideoDisplay;
                              import spark.primitives.BitmapImage;
                              private const acceptableTypes:FileFilter = new FileFilter("Media", "*.mp4");
                              private var vd:VideoDisplay;

                              protected function importVideo(event:MouseEvent):void
                              
                                        var file:File = File.userDirectory;
                                        file.addEventListener(Event.SELECT, mediaSelectHandler);
                                        file.browseForOpen("Select File To Import", [acceptableTypes]);
                              

                              private function mediaSelectHandler(event:Event):void 
                                        vd = new VideoDisplay();
                                        vd.autoPlay = false;
                                        vd.horizontalCenter = 0;
                                        vd.verticalCenter = 0;
                                        vd.source = event.currentTarget.nativePath;
                                        this.addElement(vd);
                              

                              private function getSnapShot(event:MouseEvent):void
                                        var bd:BitmapData = new BitmapData(vd.width, vd.height);
                                        var matrix:Matrix = new Matrix();
                                        bd.draw(vd, matrix);

                                        //save to hard drive
                                        var file:File = File.desktopDirectory;
                                        var imgfile:File = file.resolvePath("test.jpg");
                                        var jpegEncoder:JPEGEncoder = new JPEGEncoder(90);
                                        var jpegStream:ByteArray = jpegEncoder.encode(bd);
                                        var filestream:FileStream = new FileStream();
                                        filestream.open(imgfile, FileMode.WRITE);
                                        filestream.writeBytes(jpegStream, 0, jpegStream.length);
                                        filestream.close();
                              
                    ]]>
          </fx:Script>

          <fx:Declarations>
                    <!-- Place non-visual elements (e.g., services, value objects) here -->
          </fx:Declarations>
          <s:HGroup   horizontalCenter="0" bottom="50">
                    <s:Button   label="IMPORT" click="importVideo(event)"/>
                    <s:Button   label="SNAPSHOT" click="getSnapShot(event)"/>
          </s:HGroup>
</s:WindowedApplication>

【问题讨论】:

请不要用大写字母写你的问题标题。 【参考方案1】:

您可能需要为此使用 ffmpeg 实用程序,并且可以将解决方案提升到新的水平。例如你上传一个 10 分钟的视频。您可以从第 1 分钟开始以 1 分钟的间隔拍摄 10 个快照。这将为您提供一系列视频快照。您可以将组件实现为时间线,并在滚动时显示相关快照。您可能已经在视频网站上看到了这一点。

【讨论】:

以上是关于在 Flex/Actionscript 中捕获视频缩略图的主要内容,如果未能解决你的问题,请参考以下文章

Flex / ActionScript3 - 对象属性/变量 null

GET请求Flex / Actionscript 3

Flex / Actionscript 中的文本动画库? [关闭]

调整 Sprite Flex/ActionScript 的大小

使用 Flex/ActionScript 获取服务器结果

Flex/Actionscript通过分析audioBytesPerSecond判断NetStream是不是有音频