714 字
4 分钟
Nextcloud无法为挂载在SMB存储上的MP4生成缩略图

问题描述#

nextcloud
/
server
Waiting for api.github.com...
00K
0K
0K
Waiting...

最近新装了一个Nextcloud做网盘,然后遇到了一个奇怪的问题:
对挂载在SMB存储上的.mp4文件,Nextcloud有时候无法生成缩略图,导致一排视频里面混着有的有缩略图有的是一片空白,看着很难受。

一开始猜测可能是因为文件太大导致处理失败,但经过测试发现并非如此:

  • 有的几十MB的文件无法生成缩略图
  • 反而有的几百MB的文件却可以正常生成

这显然跟文件大小关系不大。


排查过程#

通过查看日志和调试信息,发现是ffmpeg在生成缩略图时报错。

WARNING

ffmpeg的报错在Nextcloud中居然只是作为info输出,在默认log等级下不会显示。

报错信息如下:

[mov,mp4,m4a,3gp,3g2,mj2] moov atom not found
Error opening input files: Invalid data found when processing input

进一步扒代码分析后,发现原因如下:

  • Nextcloud在为远程存储(SMB、WebDAV等)的视频生成缩略图时,为了优化访问流量,会只读取文件的前一部分数据到/tmp
  • 然而某些MP4文件的moov atommetadata位于文件末尾
  • 这样一来,暂存到本地的文件片段就不包含关键元数据,ffmpeg就会报moov atom not found错误,导致缩略图生成失败

如何验证问题#

为了验证是不是因为moov atom在文件尾部导致的缩略图生成失败,可以尝试用ffmpeg将元数据移动到文件头部:

Terminal window
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/
作者
AcgZone
发布于
2025-09-13
许可协议
CC BY-NC-SA 4.0