714 字
4 分钟
Nextcloud无法为挂载在SMB存储上的MP4生成缩略图
问题描述
Waiting for api.github.com...
最近新装了一个Nextcloud做网盘,然后遇到了一个奇怪的问题:
对挂载在SMB存储上的.mp4文件,Nextcloud有时候无法生成缩略图,导致一排视频里面混着有的有缩略图有的是一片空白,看着很难受。
一开始猜测可能是因为文件太大导致处理失败,但经过测试发现并非如此:
- 有的几十MB的文件无法生成缩略图
- 反而有的几百MB的文件却可以正常生成
这显然跟文件大小关系不大。
排查过程
通过查看日志和调试信息,发现是ffmpeg在生成缩略图时报错。
WARNINGffmpeg的报错在Nextcloud中居然只是作为info输出,在默认log等级下不会显示。
报错信息如下:
[mov,mp4,m4a,3gp,3g2,mj2] moov atom not foundError opening input files: Invalid data found when processing input进一步扒代码分析后,发现原因如下:
- Nextcloud在为远程存储(SMB、WebDAV等)的视频生成缩略图时,为了优化访问流量,会只读取文件的前一部分数据到
/tmp - 然而某些MP4文件的
moov atommetadata位于文件末尾 - 这样一来,暂存到本地的文件片段就不包含关键元数据,
ffmpeg就会报moov atom not found错误,导致缩略图生成失败
如何验证问题
为了验证是不是因为moov atom在文件尾部导致的缩略图生成失败,可以尝试用ffmpeg将元数据移动到文件头部:
ffmpeg -i input.mov -movflags faststart output.mp4-movflags faststart会将MP4文件的元数据移动到开头- 再将这个新文件放到SMB挂载中,如果此时能正常生成缩略图,那就是这个问题引发的。
解决方案
有几种可选方案:
方案 1:修改视频文件元数据位置
批量用ffmpeg -movflags faststart处理,让元数据位于文件开头,这样Nextcloud截取部分数据时仍能读到完整信息。
方案 2:本地挂载SMB再挂到Nextcloud
将SMB存储挂载到本机(例如/mnt/video),再在Nextcloud中以本地存储方式挂载这个目录。
这样Nextcloud就不会将其当作远程文件截取,而是直接读取,避免了moov atom缺失的问题。
Update
后来在GitHub上发现,这个会导致无法生成缩略图的问题居然是Nextcloud在今年4月作为一个特性引入的。
为了避免远程大文件的全量下载,从而只取文件头做预览,但对于某些视频格式就会触发上述问题。
其修复已经在9月的PR中引入,也可以等待新版本修复发包。
Nextcloud无法为挂载在SMB存储上的MP4生成缩略图
https://blog.lesia.top/posts/nextcloud-mp4-preview-thumbnails-not-generated-via-smb-storage/