我正在为lf
使用chafa
六像素显示预览图像。
我正在编写预览视频的脚本部分,并决定仅显示视频的第一帧。以下是我目前所拥有的:
# check if cache folder exists
if [ ! -d "$cache_folder" ]; then
mkdir "$cache_folder"
fi
# going to store thumbnail here:
# not using mktemp as chafa expects a file extension
thumbnail_file="$cache_folder/$(echo "$1" | base64).png"
# if the thumbnail isn't cached then make it:
if [ ! -f "$thumbnail_file" ]; then
# get first frame of video:
# https://superuser.com/a/1682482/816753
# & suppress output so it doesn't display in the previewer
# the below makes the pixels square in case we have non-square pixels
# which means the image won't look stretched/squished after displaying
# add -y to overwrite thumbnail file if exists
ffmpeg -i "$1" -vf "scale=iw*sar:ih,setsar=1" -vframes 1 -y "$thumbnail_file" &>/dev/null
fi
chafa -f sixel -s "$2x$3" --animate off --polite on "$thumbnail_file"
如您所见,我正在使用 base64 对文件名进行编码并将其保存到缓存文件夹,这样如果视频缩略图已被缓存,我就可以只显示缓存的图像,而chafa
不必ffmpeg
每次都运行,这样很慢。
但是对于某些视频文件,我得到:
chafa: Failed to open [thumbnail file]: File name too long
人们会建议一种为缓存缩略图创建文件名的好方法吗?(我假设每个视频文件的内容不会改变;如果我需要更新缩略图,我只需从缓存文件夹中将其删除即可。)我的要求是:
- 两个视频文件最终具有相同的缓存文件名的合理唯一性/可能性不大,因为这显然会导致它们具有相同的预览缩略图,尽管它们是不同的视频
- 结果是文件名相当短,至少不会
chafa
出现问题。(我实际上不确定chafa
文件名长度的限制是多少;我尝试查找但什么也没找到。) - 当然是一个有效的文件名,所以没有
/
答案1
例如你可以使用md5sum为此目的。它生成十六进制 128 位哈希,这意味着它始终有 32 个字符。发生冲突的可能性很小。
thumbnail_file="$cache_folder/$(echo -n "$1" | md5sum).png"
请注意,如果您以相同的方式命名 2 个不同的文件,则很容易出错。为了解决这个问题,您可以将文件名/路径与其修改时间结合起来,这样极不可能出现任何哈希冲突。当然,这只有在您不修改文件的情况下才有效,这是您的假设。例如:
modification_timestamp=$(stat -c %Y "$1")
thumbnail_file="$cache_folder/$(echo -n "${1}${modification_timestamp}" | md5sum).png"
查看统计文档以获取更多信息。