利用脚本 使用 ffmpeg 为群晖生成 Photos 套件对应的缩略图
我的环境:
arpl引导,DS3622xs,DSM 7.2.1-69057
我的问题
黑裙的 Synology Photos 无法正常生成视频缩略图。网上替换ffmpeg的方法我已经使用过了,大概可以好一两天,后面又坏了,搞不明白为什么。
常规解决方案:
常规方案网上都是,大致流程如下:
自行安装ffmpeg;
运行下面的命令
mv /usr/bin/ffmpeg /usr/bin/ffmpeg.bak
ln -s /var/packages/ffmpeg6/target/bin/ffmpeg /usr/bin/ffmpeg
这里ffmpeg具体的路径和版本有关,如果是ffmpeg4那就是
mv /usr/bin/ffmpeg /usr/bin/ffmpeg.bak
ln -s /var/packages/ffmpeg/target/bin/ffmpeg /usr/bin/ffmpeg
常规方案结果
但这个方法我可以成功一两天,后面就会失效。我猜测是我安装了其他的套件,也调用ffmpeg,后面可能出现了权限之类的问题导致Photos不能用了。但问题是哪怕重新操作也不行。更奇怪的是我再自己创建一个测试的黑裙,安装同样的套件,怎么折腾都不能复现。
只有重装系统可以恢复,但过一会儿又不行了。
与这篇帖子呈现出的结果比较类似:
我自己折腾了好久,实在没办法让系统自己生成,所以想到了另一个方法,就是自己生成缩略图放到@eaDir里。
对于Synology Photos套件(默认一般品质的缩略图)来说,处理/folder/video.mp4文件,生成的是“SYNOPHOTO_THUMB_M.jpg”和“SYNOPHOTO_THUMB_XL.jpg”,放置在/folder/@eaDir/video.mp4/下(注意这里的video.mp4是个文件夹名)
对于Video Station,生成的缩略图是SYNOVIDEO_VIDEO_SCREENSHOT.jpg
文章只针对Synology Photos,Video Station同理
但问题是我不会写自动化脚本。
不过让我翻到了DSM 5.2时期有人写过类似的脚本:
解决方案
原贴主的脚本可以使用,但是有一些不符合我预期的问题,比如路径、文件名不能有特殊符号、空格等。
大学只学过C语言,它的代码我能看懂,但让我改我其实不知道如何增加python的相关函数。好在现在有AI。根据我的需求和AI的帮助,代码修改如下:

ffmpeg命令是生成视频中间时刻的缩略图,例如视频12s,那么取6s时的图片作为缩略图,为此使用了ffprobe,ffprobe命令是不能直接使用的,所以在脚本开始定义了ffprobe的路径在“/var/packages/ffmpeg/target/bin/ffprobe”实际上就是在你安装的对应ffmpeg旁,如果你把它ln -s到/usr/bin下,ffprobe就可以使用了。这里要注意ffmpeg的版本可能造成这里的路径不一样。
如果不想使用ffprobe可以把-ss命令改成0.001之类很小的时间。
path改成了文件路径,这个是根据AI修改的,AI说原sys.path[0]是命令路径,我如果在根目录执行会对根目录遍历,我不懂python所以我不确定;
去掉了exte函数,使用os.path.splitext(name)获取扩展名;
增加了命令行参数-o作为OverWrite命令强制覆盖掉已经存在的缩略图。默认当缩略图文件已存在则跳过;
跳过@eaDir路径,跳过SYNOPHOTO_FILM_H264.mp4,SYNOPHOTO_FILM_M.mp4和SYNOPHOTO_FILM_MPEG4.mp4;
原始文件里的路径都要加""双引号,不然不支持特殊字符如空格括号等;
在执行ffmpeg命令之前要确保文件路径已经存在,ffmpeg不能自主生成路径(原作者的代码是在photo路径下使用,系统已经生成了对应路径),所以加了个生成thumb_dir路径的命令;这样哪怕视频还没放到photo文件夹下索引,也可以提前生成缩略图文件;
ffmpeg的loglevel改成了warning;
ffmpeg的输出定为固定高度,宽度按比例也就这个命令“-vf scale=-1:1280”,里面的-1就是意味着固定原始比例自动生成。群晖生成XL的高度是1280,M是320,SM是240,我这里M给了个480,SM不需要手动生成,系统可以自己生成;
换成了subprocess.run函数来执行ffmpeg命令,这样似乎是逐个执行,就可以在日志看到现在正在Create,然后Created!,而且可以判断ffmpeg输出正确/错误;
最后加了个删掉空目录的命令;
命令执行后打印已完成字样,这样查看日志的时候知道程序运行完了。
使用方法
正常使用:python SynoPhotoThumbGen.py
需要确保已经有python环境
强制覆盖已经有的缩略图:python SynoPhotoThumbGen.py -o
如果不想使用ssh,可以在群晖中添加命令:

注意这里的“已启动”要勾掉,命令完全由我们自己运行。

用户自定义脚本写:
find “/volume1/PT/photo(这边要替换)” -maxdepth 2 -name "SynoPhotoThumbGen.py" -type f -exec python {} ;
命令是在/volume1/PT/photo路径下(两层深度内)查找
文件中标注的地方路径要根据自己的需求换掉。比如我常常在/volume1/PT/photo路径下进行预生成缩略图。.py脚本要命名成SynoPhotoThumbGen.py。
-maxdepth 2命令是表明层级只搜索两层,避免搜的过深。
举个例子:
--/photo
-----文件夹1
--------SynoPhotoThumbGen.py (可以被找到)
-----文件夹2
--------文件夹3
------------SynoPhotoThumbGen.py (不可以被找到)
当然了,你直接写.py的路径也行。这里就是为/photo/文件夹1/下的所有视频生成缩略图
如果需要觉得已有缩略图有错误,可以增加-o命令
find “/volume1/PT/photo(这边要替换)” -maxdepth 2 -name "SynoPhotoThumbGen.py" -type f -exec python {} -o ;
其他
因为在视频对应的@eaDir/video.ext/下还有个.mp4文件,之前有可能会被识别(现在的脚本不会了,因为排除了@eaDir),可以使用
find -path '星号@eaDir/星号/@eaDir'
查看有多少这种@eaDir套@eaDir的,再使用:
find -type d -path "星号/@eaDir/星号/@eaDir" -print0 | xargs -0 rm -rf
删除掉所有这样的目录。
星号要换成*,
find -type d -path "/@eaDir//@eaDir" -print0 | xargs -0 rm -rf
最后
我不懂编程!不对文件安全负责!!!!!!
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

那誰誰
校验提示文案
啤酒屋1011
校验提示文案
piscesc
校验提示文案
张弛有度186
校验提示文案
ycy119744220
校验提示文案
JadeX
校验提示文案
情辉
校验提示文案
CentWind
我不会写程序,不对文件安全负责。
校验提示文案
爱喝可乐的蜗牛
校验提示文案
CentWind
校验提示文案
骑在坟头指挥鬼
校验提示文案
值友9006446277
校验提示文案
灵KOYB
校验提示文案
值友9693653579
校验提示文案
紫色的眼瞳
校验提示文案
24k双花红棍
校验提示文案
bruce1227
校验提示文案
bruce1227
校验提示文案
情辉
校验提示文案
24k双花红棍
校验提示文案
JadeX
校验提示文案
紫色的眼瞳
校验提示文案
值友9693653579
校验提示文案
灵KOYB
校验提示文案
ycy119744220
校验提示文案
值友9006446277
校验提示文案
张弛有度186
校验提示文案
啤酒屋1011
校验提示文案
骑在坟头指挥鬼
校验提示文案
爱喝可乐的蜗牛
校验提示文案
piscesc
校验提示文案
那誰誰
校验提示文案
CentWind
校验提示文案
CentWind
我不会写程序,不对文件安全负责。
校验提示文案