将定时演示文稿(自动幻灯片)导出为具有固定帧速率的图像序列(视频)?

将定时演示文稿(自动幻灯片)导出为具有固定帧速率的图像序列(视频)?

我可能在这里重复了老生常谈;但我希望大家能原谅我,因为我至少有一个 Latex MWE,还有一些关于软件包的笔记:)。事情是这样的:很长一段时间以来,我一直在寻找某种平台,在那里我可以编写文本脚本,最终将其变成视频编辑(Linux 中的命令行视频编辑(剪切、连接和预览) - 超级用户);我认为 Latex/PDF 很有潜力。

使用animate[关闭]但是,我并不打算使用 Adob​​e Reader 作为查看器/播放器。相反,我感兴趣的是,基本上,将 Latex 或 PDF 格式视为定时演示的“容器”,其中包括视频 - 我需要的是一个脚本或程序,它可以“解析”容器,并最终以预定的每秒帧速率生成图像序列。也许最好通过一个例子来讨论这一点;因此,使用下面的 MWE - 它使用beameranimatemedia9- 并截取 Adob​​e Reader 全屏性能的屏幕,我获得了这个动画 .gif (带有注释的较长的 MWE 位于https://gist.github.com/anonymous/e6b7051cf270594d2b38以及关于https://vid.me/QZrL(您也可以从此处下载 .mp4 版本,需要 JavaScript)):

              测试演示.gif

我认为很明显,Adobe Reader 不能保持视频的帧速率(特别是因为例如{animation}在 PDF 中使用 JavaScript 计时器进行动画处理;尤其是在较旧的 Linux 中,例如 Ubuntu 11.04,我在其中进行了屏幕截图)。这就是为什么我希望有一个工具可以保留上述视频的这些属性:

  • 幻灯片(帧)时长
  • 过渡效果和持续时间
  • 动画
  • 嵌入视频的帧精确显示。

有了它,我可以导出一个“基本视频”,然后将其加载到视频编辑器中;然后可能在编辑器中将原始嵌入视频覆盖在其上,然后导出“最终视频”。首先,我会想象一个可以解析 PDF 并导出图像序列的工具,如以下 shell 伪代码所示:

mockPdfRender --framerate 24 --in test.pdf --out imgseq/%05d.png

但是,该工具需要“知道”例如,这个 5 页 PDF 应该渲染成 1.5+1.5+2.5+5.5+1.5 = 12.5 秒;@ 24 fps = 300 幅图像;而且由于这些工具中的许多都依赖于嵌入式 JavaScript,因此我认为这会很难。另一方面,如果在 和 中实施更改,这样我就可以在我的 Latex 文件中编写指令,那么可能就更有{beamer}可能{animate}{media9}

\documentclass{beamer}
\mockPfdRender[framerate=24]{} % the directive
\usepackage{media9}
\usepackage{animate}
...

... 遇到此命令时,它将指示 Latex 导出 PDF,不是 5 页,而是 300 页,每页包含动画的一帧。在这样的 PDF 上,我可以简单地使用 ImageMagick 的convert

convert -density 100 test.pdf test-%05d.png

... 从该 PDF 的每一页生成一个.png图像;给我一个精确到帧的图像序列,然后我可以将其导入到视频编辑器(或ffmpeg)中,并从中生成视频。

因此,正式来说,我的问题是:Latex 软件包中是否有允许此类操作的工具?如果没有,是否有可能实现 - 以便它在 MWE 上工作(即,跨越和beamer)?此外,还有一些子问题:animatemedia9

  • 如何了解{beamer}幻灯片上动画和媒体的定位?
  • 在 中{media9},有没有办法在给定时间开始播放视频,并在稍后打开带有视频的幻灯片(页面)时自动停止它?
  • 使用 pdflatex 等注入 JavaScript 以实现页面级事件\pdfpageattr{/AA << /O << /S/JavaScript ...用于在打开 PDF 的所有/任何页面时设置 JS 监听器;有没有办法将其限制到单个页面(除了编写 JSif(..){..}子句)
  • 有什么方法可以{media9}annotRM.callAs()JS 命令配合使用(见下文)?

除此之外,这里有一些关于我的平台上的 MWE 的说明:

  • 按照有人在 Linux 中成功播放 Acrobat 中嵌入的电影吗?,我不得不使用 Adob​​e Reader 9.4.1 来播放 PDF 格式的视频;​​显然该版本包含一个嵌入式 Flash Player 9,后来被删除了(后来acroread显然需要在系统上安装一个独立的 Flash Player)
  • \moviefrom 包{multimedia}根本不起作用;必须使用\includemediafrom{media9}
  • 使用\includemedia根本VPlayer.swf不起作用;必须使用VPlayer9.swf(显然是因为嵌入了 Flash Player 9)
  • \includemedia有声电影导致9.4.1在退出幻灯片时acroread冻结(等待),除非我在 ALSA 中指定了我的默认卡:pthread_join()~/.asoundrc

    pcm.!default {
      type hw   #must have type
      card 0    #must have, else "card is not defined"
    }
    

    使用此规范,acroread在播放视频的幻灯片中一次进入和退出后仍可继续,但在第二次返回幻灯片并播放视频时将冻结。冻结后,acroread无法正常关闭,killall -9 acroread需要

  • 只有{beamer}可以在9.4.1\transdissolve中充当过渡;其他的喜欢或不喜欢acroread\transsplitverticalout\transwipe
  • callAS处理视频的 JS 命令{media9}(如annotRM['myvideo'].callAS('play'))在acroread9.4.1 中会默默失败 - 并破坏该处理程序中的所有后续 JS 命令;因此,{hyperref}不能\PushButton用于定位视频
  • 唯一可以定位{media9}视频的\includemedia{media9}带有\mediabutton参数[mediacommand=myvideo:seek [(32.1)],]的 - 这不仅包括 JavaScript,还包括实际的 PDF 文字,例如/CMD << /C (seek) /A [(32.1)] >> /S /RichMediaExecute
  • 但是,在全屏模式下\mediabutton无法在 9.4.1 中渲染(请参阅上面的屏幕截图,我单击了“测试”按钮旁边的空白处以在视频中搜索)acroread

其他参考:

好吧,就是这样 - 这是 MWE:

\documentclass{beamer}
% \usepackage{multimedia} % \movie
\usepackage{media9}[2013/11/04] % ‘media9’ package replaces the now obsolete ‘movie15’ package.
\usepackage{tikz}
\usepackage{animate}

% make as "plain Latex" style/theme for Beamer as possible

\usetheme{default}                      % empty
\usefonttheme{serif}                    % computer modern font
\setbeamercolor{structure}{fg=black}    % reset colors
\setbeamertemplate{navigation symbols}{}%remove navigation symbols

% centered frame title
\setbeamerfont{frametitle}{size=\large,series=\bfseries}
\setbeamertemplate{frametitle}{ % changes all \frametitle
  \begin{centering}
  \insertframetitle
  \par
  \end{centering}
}

\def\choicetransition{\transdissolve[duration=0.5]}

\begin{document}

\title{Testing a timed presentation, with animation and video}
\author{My Author}
\date{2015}

% slide 01
\frame{ \choicetransition \transduration{1.5} %
\titlepage %
}

  % this executes on opening all subsequent pages; but...
  \pdfpageattr\expandafter{\the\pdfpageattr /AA <<
    /O << /S/JavaScript /JS (
    if (this.pageNum==3) {
      ret = annotRM['myvideo'].callAS('play'); % ... does not work
    }
  ) >>
  >>}

% slide 02
\begin{frame}[plain] \choicetransition \transduration{1.5} %
  \begin{center}%
  \Large
  Hello there\\[1em]

  Just trying a plain old frame out
  \end{center}%
\end{frame}

% slide 03: animation
\begin{frame} \choicetransition \transduration{2.5} %
  \frametitle{Testing an animation}
  % last argument of animateinline is frame rate
  \begin{animateinline}[controls=false,autoplay,loop=false]{4}
  \multiframe{8}{n=-0.4+0.1}{
    \begin{tikzpicture}[scale=10,rotate=90]
      \draw[blue,opacity=0.5] (-.1,-.2) rectangle (.4,0.2);
      \draw[red] (-.1,-.2) -- (-.3,\n);
    \end{tikzpicture}
  }
  \end{animateinline}
\end{frame}

% slide 04: video
% wget http://archive.org/download/Elephants_Dream_teaser_2/elephantsdream_teaser.ogv
% ffmpeg -i elephantsdream_teaser.ogv -acodec pcm_s16le -r 24 -g 24 elephantsdream_teaser.flv % Format: Flash Video, Video: Sorenson Spark, Audio: PCM

\begin{frame} \choicetransition \transduration{5.5} %
  \frametitle{Testing a video}

  %\movie[width=3cm,height=2cm,poster,autostart,start=5s,duration=2s,once]{}{elephantsdream_teaser.flv} % nowork, even w/ acroread 9.4.1 {multimedia}
  \includemedia[            % {media9}
    label=myvideo,          % defines JavaScript object annotRM['myvideo']
    width=0.6\linewidth,height=0.6\linewidth,
    activate=pagevisible,
    deactivate=pageinvisible,
    transparent,
    addresource=elephantsdream_teaser.flv,
    flashvars={
      source=elephantsdream_teaser.flv % same path as in addresource!
      &autoPlay=true %
      &loop=false          % loop video
      &scaleMode=letterbox % preserve aspect ratio
    }
  ]{}{VPlayer9.swf} %VPlayer.swf doesn't show video at all! Not even a frame - just white background!
  \PushButton[  %requires package ‘hyperref’
    name=thibut,
    onclick={
      console.show();
      console.println('-------------');
      console.println(annotRM.myvideo);
      console.println(annotRM['myvideo']); % object AnnotRichMedia
    },
    format={  % thought it runs at start, but it doesn't
      console.show();
      console.println('-------------');
    },
  ]{\fbox{Test}}
  \mediabutton[%
    mediacommand=myvideo:seek [(32.1)],% ok
    %jsaction=myvideo:{app.alert("Test " + typeof(annotRM['myvideo']));} % works, prints 'object'
  ]{\color{blue}\fbox{SEEK}} % works, but is invisible in acroread 9.4.1 (and visible in evince?)?
\end{frame}

% slide 05: end

\begin{frame}[plain] \choicetransition \transduration{1.5} %
  \begin{center}%
  \LARGE
  Fin
  \end{center}%
\end{frame}

\end{document}

相关内容