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

相信尝试用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好多了)

自由刚体绕不同惯量主轴转动稳定性的一个简单解释

问题介绍:

自由刚体的定点转动中有一个比较有名的现象:网球拍效应(Tennis Racket Theorem),又称Dzhanibekov效应。指的是绕转动惯量居中的惯量主轴转动的自由刚体,会发生转动轴翻转的情况,如下:

这种翻转看起来十分反常理:转着转着为什么会翻?还翻得这么快?

下面这个视频演示了绕不同的主轴转动的稳定性的区别:

可以看出绕转动惯量较小的轴和转动惯量较大的轴转动时转动都是稳定的。

学过理论力学的应该都很清楚,如果在刚体坐标架下的角动量空间中看,考查等角动量球和等动能椭球的交线在不同动能大小下的拓扑性质,很容易得到绕不同轴转动时稳定性情况。

但是,这是做了两次变换后才得到的图像,直观却不直接。有没有什么直接从质点力学的角度看的办法吗?

继续阅读