在Mathematica中方便的导入导出视频——MathMF

Stone posted @ 2015年2月15日 15:25 in Software with tags Mathematica; , 1878 阅读

相信尝试用Mathematica处理过视频的都会对其那捉鸡的导入导出印象深刻——支持的格式以及编码方式极其有限。

最近我在StackExchange上看到了一个叫MathMF的扩展包,利用Windows Media Foundation(因此,这个方案仅适用64位Windows系统)来实现视频的逐帧导入导出,亲测效果感人。

这里介绍一下配置步骤吧,其实自带说明文档说的很清楚了,我只是把重点做一下翻译:

  1. 从它的GitHub项目主页上下载文件,将其中的MathMF文件夹解压到某个路径下,这个路径可以在Mma中运行FileNameJoin[{$UserBaseDirectory, "Applications"}]来得到

  2. 在Mma 中运行Needs["MathMF`"],然后你会得到错误信息...
    它此时执行的应该是试图通过编译一个.c文件来得到一个.dll文件,如果它报错形如"a suitable C compiler is not present"那么说明它无法在你的电脑里找到合适的C编译器,此时最简单粗暴有效的办法就是装一个Visual Studio,再重新运行这段代码。你说gcc?我也弄不清为什么搞不定。
    当然如果你不想装VS,作者提供了一个替代方案,将optional pre-built v10 DLL(或者v9,依你的Mathematica版而定)文件夹下的.dll文件搬运到某个路径下,这个路径可以在Mma中运行FileNameJoin[{$UserBaseDirectory, "SystemFiles\\LibraryResources\\Windows-x86-64"}]来得到。但是这个方案仍然要求你安装Visual C++ Redistributable for Visual Studio 2012
  3. 一般而言,此时你需要重启Mma,然后便可以开始使用该宏包来进行视频的逐帧导入导出。

一般的使用步骤参见MathMF Demo.nb文件,我简单写在下面

导入

Needs["MathMF`"](*导入宏包*)

{duration, framerate, width, height} = 
 MFInitSourceReader[YourFilePath]
(*打开一个输入流对象,得到时长、每秒帧数、宽、高*)

imagelist=Table[MFGrabFrame["ByteImage"],{i,Round[duration framerate]}];
(*MFGrabFrame函数每被调用一次就返回当前帧数据,并向后移动一帧,尾部的给出 EndOfFile *)
(*参数可选为 "Byte", "ByteImage", "Real", "RealImage",分别返回的是位图数据、位图、模拟图数据、模拟图*)

支持的导入对象可以参见这里

导出

 

MFInitSinkWriter[YourFilePath, w, h, "FrameRate" -> 25]
(*打开一个输出流对象,给定文件路径、宽。高、每秒帧数*)

Do[MFSendFrame[imagelist[[i]]], {i, Length@imagelist}]
(*逐帧导出图像*)

MFFinaliseSink[]
(*关闭输出流对象*)

注意导出仅支持mp4和wmv格式(总比只支持swf好多了)

blog comments powered by Disqus