Skip to main content

export - How to save animation in mp4 format instead of avi?



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

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...