%%%%%%%%%%%%% flashmovie.sty %%%%%%%%%%%%% Copyright 2009 Timo Hartmann % % Version 0.0 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This package allows direct embedding of flash movies into PDF files. It is % designed for use with pdflatex. % % Basically it uses the fact that the Adobe Reader 9 contains an embedded Adobe Flash % player which can be invoked with the "rich media annotation" feature which is described % in "Adobe Supplement to the ISO 32000 BaseVersion: 1.7 ExtensionLevel: 3". % % advantages: % - You can directly embed videos into the pdf (external window is optimal and not necessary). % - You can play back videos without worrying about platform dependencies. % % disadvantages: % - You can only play back embedded videos with Adobe Reader 9 and upwards. % % example (1) % - download a video file to use, for example % http://heasarc.gsfc.nasa.gov/Videos/historical/saturn5.avi % - transform this video into the flash format with ffmpeg: % ffmpeg -i saturn5.avi saturn5.swf % (or use any other program captable of this, for example mencoder) % - put following line into your tex-file: % \flashmovie[width=10cm,heigth=10cm]{saturn5.swf} % (both width and height are needed!) % - translate with pdflatex % - advantages: % - easy % - does not reley on external compontents % - disadvantages: % - ffmpeg is incaptable of embedding h.264 into swf-files, so one can only % use inferior video codecs (sorenson h.263 aka flv,...). % - no controls (play,pause,stop,seek,...) possible % % example (2) % - warning: The following example assumes that you have obainted VideoPlayer.swf % and SkinOverPlaySeekStop.swf from Acrobat 9 Pro and put it into the working % directory. % - download a video file to use, for example % http://heasarc.gsfc.nasa.gov/Videos/historical/saturn5.avi % - transform this video into the mp4 format with ffmpeg: % ffmpeg -i saturn5.avi -vcodec libx264 -vpre hq -crf 22 -acodec libfaac -ab 128k -ac 2 saturn5.mp4 % (or use any other program captable of this, for example mencoder) % - alternatively the flv-format with video-codec sorenson h.263 (aka flv) and audio-codec mp3 is also possible: % mencoder saturn5.avi -o saturn5.flv -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050 -ofps 24 -vf harddup -oac mp3lame -lameopts abr:br=56 ) % (or use ffmpeg to do the same thing...) % - put following line into your tex-file: % \flashmoviex[width=10cm,heigth=10cm]{saturn5.mp4} % (both width and height are needed! instead of saturn5.mp4 one can also use saturn5.flv but not saturn5.swf) % - translate with pdflatex % - advantages: % - controls (play,pause,stop,seek,...) possible % - superior video codec possible (h.264) % - one can directly embed mp4 and flv files without conversion % - disadvantages: % - use of external non-free components. % % todo: % - replace VideoPlayer.swf and SkinOverPlaySeekStop.swf by some freely available software. % it should be possible to program a simple video player with flexsdk and activescript. % the videoplayer should play mp4 and flv files and should and be captable of play,pause,seek,stop. % controls should be hidable. % - make more options of richmedia annotations usable, for example activation by clicking, playcount,... % - display a picture when the player is deactivated. % - efficient multiple inclusion of video files. % % warning: % - Because the file names of the movies are directly embedded into the PDFs please use only % "normal" file names. More specific use only names compatible with internal PDF strings. % There is even a specification what conforming file names are (see the PDF reference). \RequirePackage{keyval} \def\flashmovieparamsclear{ \def\flashmoviewidth {4cm} \def\flashmovieheight{4cm} } \define@key{flashmovieparams}{width} {\def\flashmoviewidth {#1}} \define@key{flashmovieparams}{heigth} {\def\flashmovieheight {#1}} \def\flashmovieembedfile#1{ \immediate \pdfobj stream attr { /Type/EmbeddedFile } file {#1} \immediate \pdfobj { << /Type /Filespec /F (#1) /UF (#1) /EF << /F \the\pdflastobj\space 0 R >> >>} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\flashmovie{\@ifnextchar[\@flashmovie{\@flashmovie[]}} \def\@flashmovie[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{ \newcount\filespecnum \newcount\configurationnum \newcount\contentnum \newcount\settingsnum \flashmovieembedfile{#2} \filespecnum=\pdflastobj \immediate \pdfobj {<< /Instances [<< /Asset \the\filespecnum\space 0 R /Params << /Binding /Foreground >> >>] /Subtype /Flash >>} \configurationnum=\pdflastobj \immediate \pdfobj {<< /Assets << /Names [(#2) \the\filespecnum\space 0 R] >> /Configurations [\the\configurationnum\space 0 R] >>} \contentnum=\pdflastobj \immediate \pdfobj {<< /Activation << /Type /RichMediaActivation /Condition /PO /Configuration \the\configurationnum\space 0 R /Animation << /Subtype /Linear /Speed 1 /Playcount 1 >> /Presentation << /PassContextClick false /Style /Embedded /Toolbar false /NavigationPane false /Transparent true /Window << /Type /RichMediaWindow /Width << /Default 100 /Min 100 /Max 100 >> /Height << /Default 100 /Min 100 /Max 100 >> /Position << /Type /RichMediaPosition /HAlign /Near /VAlign /Near /HOffset 0 /VOffset 0 >> >> >> >> /Deactivation << /Type /RichMediaDeactivation /Condition /XD >> >>} \settingsnum=\pdflastobj \newlength{\xxwidth} \newlength{\xxheight} \newsavebox{\xxcontent} \sbox{\xxcontent} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}} \settowidth {\xxwidth} {\usebox{\xxcontent}}% \settoheight{\xxheight}{\usebox{\xxcontent}}% \usebox{\xxcontent}% \pdfannot width \xxwidth height \xxheight depth 0pt {% /Subtype /RichMedia /RichMediaContent \the\contentnum\space 0 R /RichMediaSettings \the\settingsnum\space 0 R }}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\flashmoviex{\@ifnextchar[\@flashmoviex{\@flashmoviex[]}} \def\@flashmoviex[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{ \newcount\filespecnum \newcount\filespecnumi \newcount\filespecnumii \newcount\configurationnum \newcount\contentnum \newcount\settingsnum \flashmovieembedfile{#2} \filespecnum=\pdflastobj \flashmovieembedfile{SkinOverPlaySeekStop.swf} \filespecnumi=\pdflastobj \flashmovieembedfile{VideoPlayer.swf} \filespecnumii=\pdflastobj \immediate \pdfobj {<< /Instances [<< /Asset \the\filespecnumii\space 0 R /Params << /Binding /Foreground /FlashVars (source=#2&skin=SkinOverPlaySeekStop.swf&skinAutoHide=true&skinBackgroundColor=0x00FF00&skinBackgroundAlpha=0.33&volume=1.00) >> >>] /Subtype /Flash >>} \configurationnum=\pdflastobj \immediate \pdfobj {<< /Assets << /Names [(#2) \the\filespecnum\space 0 R (skinover.swf) \the\filespecnumi\space 0 R (VideoPlayer.swf) \the\filespecnumii\space 0 R] >> /Configurations [\the\configurationnum\space 0 R] >>} \contentnum=\pdflastobj \immediate \pdfobj {<< /Activation << /Type /RichMediaActivation /Condition /PO /Configuration \the\configurationnum\space 0 R /Animation << /Subtype /Linear /Speed 1 /Playcount 1 >> /Presentation << /PassContextClick false /Style /Embedded /Toolbar false /NavigationPane false /Transparent true /Window << /Type /RichMediaWindow /Width << /Default 100 /Min 100 /Max 100 >> /Height << /Default 100 /Min 100 /Max 100 >> /Position << /Type /RichMediaPosition /HAlign /Near /VAlign /Near /HOffset 0 /VOffset 0 >> >> >> >> /Deactivation << /Type /RichMediaDeactivation /Condition /XD >> >>} \settingsnum=\pdflastobj \newlength{\xxwidth} \newlength{\xxheight} \newsavebox{\xxcontent} \sbox{\xxcontent} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}} \settowidth {\xxwidth} {\usebox{\xxcontent}}% \settoheight{\xxheight}{\usebox{\xxcontent}}% \usebox{\xxcontent}% \pdfannot width \xxwidth height \xxheight depth 0pt {% /Subtype /RichMedia /RichMediaContent \the\contentnum\space 0 R /RichMediaSettings \the\settingsnum\space 0 R }}}