在Mathematica中方便的导入导出视频——MathMF
Stone
posted @ 2015年2月15日 15:25
in Software
with tags
Mathematica;
, 1878 阅读
相信尝试用Mathematica处理过视频的都会对其那捉鸡的导入导出印象深刻——支持的格式以及编码方式极其有限。
最近我在StackExchange上看到了一个叫MathMF的扩展包,利用Windows Media Foundation(因此,这个方案仅适用64位Windows系统)来实现视频的逐帧导入导出,亲测效果感人。
这里介绍一下配置步骤吧,其实自带说明文档说的很清楚了,我只是把重点做一下翻译:
-
从它的GitHub项目主页上下载文件,将其中的MathMF文件夹解压到某个路径下,这个路径可以在Mma中运行FileNameJoin[{$UserBaseDirectory, "Applications"}]来得到
-
在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 - 一般而言,此时你需要重启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