将值传递给命令/使用 media9 创建自定义按钮

将值传递给命令/使用 media9 创建自定义按钮

在定义自定义方法/宏方面,我还是个新手LaTeX。我的 MWE 如下所示:

\documentclass[12pt,a4paper]{article}

\newcounter{myCounter}
\setcounter{myCounter}{1}
\newcommand{\countCounter}[1]{\addtocounter{myCounter}{\advance #1 by 1}\value{myCounter}}
\newcommand{\returnCounter}[1]{\ifnum #1=1 0 \else {\ifnum #1=2 5 \else \relax \fi} \fi}

\begin{document}

    %\returnCounter{\countCounter{0}}
    \addtocounter{myCounter}{1}
    \returnCounter{\value{myCounter}}

\end{document}

我基本上想做的是

  • 将我的计数器增加myCounter一些定义在\countCounter
  • 使用该新的计数器值进行进一步的计算\returnCounter

通常情况下,我只会连续执行这些操作(如示例中所示),但是,我想将结果作为参数传递给外部包。因此,我尝试将的结果传递给\countCounter\returnCounter示例中已注释),但不起作用。当然,如果\countCounter只返回一个值,那么它就可以工作。因此,我的问题是:如何在执行相同命令中的操作时返回值\countCounter?谢谢!

编辑:正如评论中指出的那样,这种方法不起作用;因此我将重新表述我的问题:

我的用例是将 .mp4 视频包含在 pdf 中。我想要两个按钮,forwardbackward,它们跳转到我的视频的下一个/最后一个场景。在 MWE 中,它看起来像这样:

\documentclass[12pt,a4paper]{article}
\usepackage{media9}

\begin{document}

    \includemedia[
    label=testvideo,
    activate=pageopen,
    addresource=test.mp4,
    %addresource=test2.mp4,
    flashvars={source=test.mp4},
    ]{}{VPlayer.swf}
    \mediabutton[overface=mouse-over text]{\fbox{\strut backward}}
    %\mediabutton[overface=mouse-over text, mediacommand=testvideo:Play(\returnTime{\countVideo{0}}),
    %   jsaction=testvideo:{
    %       try{app.clearTimeOut(tout)}catch(e){} % kill pending timers
    %       var tout=app.setTimeOut('annotRM.myvideo.callAS("pause")', 2000);}
    %   ]{\fbox{\strut forward}}

\end{document}

重要的是注释代码:我们的想法是将一个函数传递给Play()该代码

  1. 计算跳转到哪个场景
  2. 返回正确的时间戳。

此外,我想要这种jsaction方法,在某些跳跃之后的几秒钟自动停止视频。

有人知道如何实现这一目标吗?

答案1

如果我理解正确的话,您需要两个按钮来让您可以在视频的预定义部分之间快进和快退,另一个按钮可以仅播放当前视频部分然后暂停:

在此处输入图片描述

为了为媒体按钮编写 JavaScript 操作,我们使用了一些VPlayer.swf向 Acrobat Reader 的 JavaScript 引擎公开的 ActionScript (Flash) 方法。这些方法记录在表 6手册media9

为了在视频中正确定位,必须使用足够数量的关键帧进行编码。如有必要,请使用以下命令行重新编码现有视频。它会每秒将一个关键帧插入到以每秒 30 帧的速度播放的视频中:

ffmpeg -i orig-video.mp4 -vf scale="trunc(iw/2)*2:trunc(ih/2)*2"-c:v libx264 -profile:v high -pix_fmt yuv420p-g 30 -r 30 new-video.mp4

在编译本示例之前,请下载此example-movie.mp4进入工作目录。它是包中包含的视频的重新编码版本mwe

\documentclass{article}
\usepackage{media9}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% these are the scene starting times in seconds
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\sceneStarts{0,10,30,40,55}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\noindent%
\includemedia[
  width=0.8\linewidth, height=0.45\linewidth, %16:9
  label=testvideo,
  activate=pageopen,
  passcontext, %right-click menu of VPlayer.swf
  addresource=example-movie.mp4,
  flashvars={source=example-movie.mp4},
]{}{VPlayer.swf}\\[3pt]
\noindent%
\mediabutton[
  jsaction={
    annotRM["testvideo"].callAS("pause");
    try{app.clearInterval(timer);}catch(e){}
    var sceneStarts = [\sceneStarts];
    var tCur=annotRM["testvideo"].callAS("currentTime");
    for(var idx=0; idx < sceneStarts.length; idx++) {
      if(
        idx == sceneStarts.length-1 && tCur > sceneStarts[idx] ||
        tCur > sceneStarts[idx] && tCur <= sceneStarts[idx+1]
      ){
        annotRM["testvideo"].callAS("seek", sceneStarts[idx]); 
        break;
      }
    }
  }
]{\fbox{\strut Prev. Scene}}
\mediabutton[
  jsaction={
    annotRM["testvideo"].callAS("pause");
    try{app.clearInterval(timer);}catch(e){}
    var sceneStarts = [\sceneStarts];
    var tCur=annotRM["testvideo"].callAS("currentTime");
    for(var idx=0; idx < sceneStarts.length-1; idx++) {
      if(tCur >= sceneStarts[idx] && tCur < sceneStarts[idx+1]){
        annotRM["testvideo"].callAS("seek", sceneStarts[idx+1]); 
        break;
      }
    };
  }
]{\fbox{\strut Next Scene}}
\mediabutton[
  jsaction={
    annotRM["testvideo"].callAS("pause");
    var sceneStarts = [\sceneStarts];
    %determine current scene
    var tCur=annotRM["testvideo"].callAS("currentTime");
    var curScene = sceneStarts.length-1;
    for(var idx=0; idx < sceneStarts.length-1; idx++) {
      if(tCur >= sceneStarts[idx] && tCur < sceneStarts[idx+1]){
        var curScene = idx;
        break;
      }
    }
    %checks if we are still inside current scene
    var checkScene = function(){
      var tCur=annotRM["testvideo"].callAS("currentTime");
      if(tCur>=sceneStarts[curScene+1]){
        annotRM["testvideo"].callAS("pause");
        annotRM["testvideo"].callAS("seek", sceneStarts[curScene+1]); 
      }
    };
    try{app.clearInterval(timer);}catch(e){}
    if(tCur<sceneStarts[sceneStarts.length-1]){
      var timer=app.setInterval("checkScene()", 200);
    }  
    annotRM["testvideo"].callAS("play");
  }
]{\fbox{\strut Play Scene}}

\end{document}

相关内容