How to save animation in mp4 format instead of avi?

Edit 2

Strictly speaking, the answer to the question "How to save animation in mp4 format" is simply this:

Export["MyAutorun3.mov", m, "VideoEncoding" -> "MPEG-4 Video"]

I'm adding this for completeness. The .mov file contains an MPEG-4 encoded video, whereas the default with Mathematica is Cinepak. The reason why we have to jump through additional hoops is that this output file doesn't appear to work with the flash-based video players that ship with media9.

Edited: use Quicktime Player instead of ffmpeg

On Mac OS X, there's an easier alternative to ffmpeg to create a movie that works with media9. It requires no additional software.

First use the example from this post

m=Manipulate[Plot[Sin[a x + b], {x, -3, 3}], {a, 1, 10}, {b, -3, 3}]

Export as Quicktime, as F'x also suggested:

Export["MyAutorun.mov", m]

Open this movie in Quicktime Player (built-in on Mac) and choose File > Export ... with format 480p. The newly created movie (let's call it MyAutorun2.mov) can be incorporated in your $\LaTeX$ file, as in this example:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{media9}

\begin{document}

\includemedia[
  activate=pageopen,
  width=200pt,height=170pt,
  addresource=MyAutorun2.mov,
  flashvars={%
src=MyAutorun2.mov
&scaleMode=stretch}
]{}{StrobeMediaPlayback.swf}
\end{document}

You could also export the Manipulate as SWF,

Export["MyAutorun.swf", m]

Flash seems to do everything mp4 would do in your case: it's small and can be embedded in PDF for Adobe Reader using the movie15 or media9 packages.

To understand possible errors you may be seeing, I'll be more specific in describing what works for me:

Now create a $\TeX$ file with the contents

\documentclass{article}
\usepackage{media9}
\usepackage[english]{babel}

\begin{document}
\includemedia[
  activate=pageopen,
  width=393pt,height=334pt
]{}{MyAutorun.swf}
\end{document}

The result displays and runs for me in Adobe Reader X 10.1.2 on Mac OS X Lion. I think swf is the easiest way to get movies from Mathematica to PDF. Everything else requires some detour.

The disadvantage of directly embedding Mathematica's SWF export into the PDF is that there are no actually useable playback controls. For that, the video player solution is needed. So here is how that works for me:

With an exported 'mov`, run the following:

ffmpeg -i MyAutorun.mov -s 540x360 -vcodec libx264 MyAutorun.mp4

What I added here is an explicitly even pair of numbers as the frame size, and the codec info. Hopefully, this will help prevent the errors you're seeing.

Finally, I embed the resulting mp4 file with this $\LaTeX$ source:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{media9}

\begin{document}

\includemedia[
  activate=pageopen,
  width=200pt,height=170pt,
  addresource=MyAutoRun.mp4,
  flashvars={%
src=MyAutoRun.mp4
&scaleMode=stretch}
]{}{StrobeMediaPlayback.swf}
\end{document}

I didn't worry about reproducing the aspect ratio of the movie correctly here. The main thing is of course that your ffmpeg sizes should be big enough to avoid a blurry image for the desired player width. This worked for me.


Exporting a QuickTime file (.mov extension) from Mathematica and then converting it into an MP4 file with ffmpeg does the trick for me:

Export["toto.mov", p];
Run["ffmpeg -i toto.mov -vcodec copy -acodec copy toto.mp4"];
Run["rm toto.mov"];

It works with both ffmpeg version I have installed (an old CVS version dated sometime in 2004, and a CVS version dated 2009-04-12), and with Mathematica 8 on Mac OS X.


The mp4 video to be generated must have even number of pixels in both dimensions. To ensure this independently from the input file, ffmpeg can be invoked as

ffmpeg -i in.avi -vf scale="trunc(iw/2)*2:trunc(ih/2)*2" -vcodec libx264 -x264opts keyint=25 out.mp4

-x264opts keyint=25 ensures that keyframes be inserted at every second. This is necessary for precise seeking within the video (using the <- / -> arrow keys of the keyboard [VPlayer.swf] or the slider [StrobeMediaPlayback.swf])