对用于缓存视频缩略图的文件名进行编码的好方法是什么?

对用于缓存视频缩略图的文件名进行编码的好方法是什么?

我正在为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"

查看统计文档以获取更多信息。

相关内容