I'd like to save Manipulate[]
output so that I can embed an mp4 in my pdf document (using the media9 latex package). I've done this successfully in the past by manually constructing a table of Graphics objects, and then saving that to .avi format. That .avi can then be converted to .mp4 by ffmpeg.
A cleaner way to do this is pointed out in this answer but the .avi file that is generated causes ffmpeg to choke:
Output #0, mp4, to 'MyAutorun.mp4':
Stream #0:0: Video: h264, yuv420p, 412x345, q=-1--1, 90k tbn, 15 tbc
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo -> libx264)
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
I'm not really sure what this tool is complaining about, but wondered if there was a way to avoid using external tools to do this conversion and just export the animation data in mp4 format directly from Mathematica?
Answer
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.
Comments
Post a Comment