从@Thorsten 的回答开始
如何设置幻灯片之间的时间以使用 beamer 创建自动幻灯片放映?,我想知道是否有可能在我的 MWE 中获得幻灯片(.mp4
或.gif
)保留所有的过渡效果:
\documentclass{beamer}
\begin{document}
\begin{frame}
\transwipe[duration=1]
\transduration{3}
This is my first frame
\end{frame}
\begin{frame}
\transwipe[duration=1]
\transduration{3}
This is my second frame
\end{frame}
\begin{frame}
\transwipe[duration=1]
\transduration{3}
This is my third frame
\end{frame}
\end{document}
PS:如果我使用 ImageMagick 将 pdf 转换为 jpg:
convert -density 300 file.pdf page_%04d.jpg
并使用 ffmpeg 获取视频:
ffmpeg -framerate 1/3 -pattern_type glob -i '*.jpg' -c:v libx264 -r 300 -pix_fmt yuv420p video.mp4
我无法维持与 \transwipe 相关的转换。
答案1
评论中的建议是正确的。制作一个投影仪演示文稿,然后获取屏幕拍摄应用程序来拍摄结果。
如果您想要一个纯粹的bash
解决方案,您必须设计一个脚本,该脚本使用该watch
函数运行一个每秒进行 10 次截屏的脚本,并以您希望使用的帧速率运行该脚本,除以 10。以下是此类脚本的一个示例:
#!/bin/bash
a=`cat ~/index`
if [ $1 -ne 0 ]
then
echo $((a+$1)) > /users/morgan/x/index
fi
xwd -root | convert xwd:- ~/$((a+$2)).png
cat end
您遇到的一个问题是并行性:确保所有帧都同步。为此,我使用了一个名为的文件,index
以便为脚本的所有副本提供一个中心参考。您遇到的另一个问题是在同一帧结束所有实例。为了解决这个问题,上面的脚本使用cat
文件end
,它告诉所有watch
命令是否结束观看。
最后,这是我用来协调所有命令的脚本watch
;它在文件名中调用上述脚本i.sh
:
#!/bin/bash
echo n > end # don't end watching
echo 0 > index # start at frame 0
a=1 # which instance of `watch` we're starting
b=` bc -l <<< $(echo 1/$1 - .001) `#* amount of time between starting the `watch` instances
while [ $a -lt $1 ]
do
( watch -pgn .1 ./i.sh 0 $a ) & # the -p tells `watch` to be more precise
#date +%N # line which you use to calibrate timing on your PC
a=$((a+1))
sleep $b
done
( watch -pgn .1 ./i.sh $1 $a ) & # last instance increments the `index` by $1
timeout $2 evince -s $3 # run presentation file $3 for $2 seconds
echo y > end # this should abort all `watch` instances
用法是:
./run.sh [fps / 10] [no. of seconds to film] [presentation PDF name]
- 注意:.001 是我的计算机上运行一次循环迭代所需的时间,以确保所有帧都同步。为了在您的计算机上计时,请取消注释 #date 行,然后脚本将显示脚本开始的纳秒数。然后,您可以上下调整 .001,以确保尽可能接近所需的间隙。
一个缺点是,这些watch
命令不知道 PDF 查看器多久才能完成加载以及演示文稿何时开始。因此,您必须丢弃在 PDF 阅读器加载之前捕获的所有截屏,还要为演示文稿长度增加几秒钟,捕获完成后您可以丢弃这些截屏。
这是一个纯 bash 解决方案,但我建议使用更传统的方法,即使用第三方实用程序进行拍摄,除非有充分的理由不这样做(例如,您没有 root 访问权限;您的系统太旧,无法支持外部实用程序;您相信只使用开源软件;等等)。
当然,删除开头和结尾的文件后,您就可以使用ffmpeg
上面写的方法制作电影文件了。不幸的是,似乎没有比实时更快的解决方案。