在定义自定义方法/宏方面,我还是个新手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 中。我想要两个按钮,forward
和backward
,它们跳转到我的视频的下一个/最后一个场景。在 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()
该代码
- 计算跳转到哪个场景
- 返回正确的时间戳。
此外,我想要这种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}