Files

5.3 KiB
Raw Permalink Blame History

日志关键信息提取

[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f1fed9e38c0] EOF while reading input
[out#0/ipod @ 0x7f1ff22007c0] Error writing trailer: Invalid seek
[out#0/ipod @ 0x7f1ff22007c0] Error closing file: Invalid seek
Conversion failed! Exiting with exit code -29

✅ 重点:ffmpeg 已经成功读完音频流,解码、复制音频流全部正常,音频数据已经写入到本地文件。失败发生在【写入 mp4/m4a 文件尾部元数据(trailer)】阶段:****Invalid seek

简单解释: m4a(mp4 容器)文件结构特殊,文件尾部需要回写文件索引(trailer)。 ffmpeg 复制流模式 -c:a copy 写入 m4a 时,需要对输出文件执行 seek(文件跳转写入),来补全末尾的索引。 但此时发生 Invalid seek,无法回写 trailer,直接报错退出。 已经写入的音频数据会保留,生成一个缺少尾部索引的损坏 m4a 文件,播放器无法正常识别。

为什么群晖 ABS 正常,飞牛 fnOS ABS 同个音频链接报错? 不是网络问题!不是源 CDN 拦截! 是存储挂载的文件系统 / 挂载选项,不支持随机 seek、或者文件锁、或者 overlay / 网络存储的特性差异。

常见场景:

  1. 飞牛 docker 挂载的 podcasts 目录,是SMB/NFS 网络共享盘,网络存储对 ffmpeg 的 seek 操作支持差;群晖 ABS 用的是本地 ext4/btrfs 本地盘,seek 操作正常。

  2. 飞牛宿主机目录权限 / 挂载参数(比如nocache、sync)导致文件 seek 异常。

  3. 容器内文件系统 overlay 差异。

日志还看到一行警告:[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f1ff2259600] Unknown dref type 0x206c7275 size 12 这个只是源 m4a 里面的一个非标准 mp4 标记,不是报错根源,只是警告,不影响读取音频。

验证判断

去飞牛 podcasts 目录看:会存在一个半截的 m4a 文件,大小约 4.3MB,但是无法播放。ffmpeg 已经下载完全部音频,只是收尾写索引失败。

解决方案(按推荐优先级)

方案 1:修改 ABS 下载 ffmpeg 参数,避免直接 copy 流(推荐,最简单)

ABS 内置下载逻辑:-c:a copy 直接复制 HE-AAC 到 m4a 容器,这个模式需要 seek 写 trailer。 改成重新编码音频,输出不依赖尾部索引的容器(如 mp3),规避 mp4 trailer seek bug。

ABS 没有 web 界面开关,不能直接修改 ffmpeg 参数。 👉 替代思路:关闭 ABS 播客自动下载,外部 yt-dlp 下载音频到本地 podcasts 目录 yt-dlp 下载完成后会自动修复 mp4 索引,ABS 只负责扫描本地文件、读取 RSS 元数据,完全绕过 ABS 内置 ffmpeg 下载流程。这就是根治方案,和你之前喜马拉雅封面问题是同源思路。

yt-dlp 下载这条音频命令示例(宿主机执行)

yt-dlp -o "一席英语·脱口秀:老外来了/外国主播眼里的中国美食你绝对猜不到!.m4a" "https://jt.ximalaya.com//GKwRIUEOZyYcAEUtjwTOSSBh.m4a?channel=rss&album_id=11265078&track_id=1009496151&uid=85636966&jt=https://aod.cos.tx.xmcdn.com/storages/adca-audiofreehighqps/98/17/GKwRIUEOZyYcAEUtjwTOSSBh.m4a"

下载完,ABS 扫描 podcast 文件夹,自动识别剧集,元数据可以自动匹配。

方案 2:检查飞牛 docker 挂载的存储类型(核心排查项)

如果你的 /podcasts 挂载目录是:SMB 共享、NFS 远程盘、fnOS 的跨盘网络挂载,极高概率就是网络文件系统不支持 seek。 ✅ 测试方法:把 ABS 的 podcasts volume 临时改成飞牛本地内置硬盘目录(非 SMB/NFS),重启容器,重试 ABS 内置下载。

  • 如果本地硬盘挂载下载成功:确认就是 SMB/NFS 网络存储的 seek 限制。网络盘不适合 ABS 原生 ffmpeg 播客下载。

  • 如果本地盘依旧报错:权限 / 挂载参数问题。

方案 3:临时修复 ffmpeg 输出(不推荐,ABS 无法自定义 ffmpeg 参数)

如果可以手动跑 ffmpeg,把输出改成 mp3,不需要 mp4 trailer:

ffmpeg -i pipe:0 -c:a libmp3lame -map 0:a output.mp3

但是 ABS 内置 ffmpeg 命令是硬编码,不能修改,所以这个办法只能手动用,不能用于 ABS 自动下载。

方案 4:文件系统挂载参数优化(如果你坚持用网络盘)

NFS 挂载增加参数 sync,hard,rsize=131072,wsize=131072;SMB 挂载尝试调整cache=loose。

但是飞牛 fnOS 的 docker 挂载 SMB,很多时候修改挂载参数不生效,稳定性差,不推荐。

快速总结

报错 Error writing trailer: Invalid seek: ✅ 音频已经完整下载; ❌ 失败在 ffmpeg 写入 m4a 尾部索引,需要文件 seek 操作; 👉 根本原因:飞牛 ABS 挂载的存储(大概率 SMB/NFS 网络盘)不支持 ffmpeg 的 seek 随机写入;群晖 ABS 用本地硬盘,无此问题。

推荐最终方案

放弃 ABS 自带播客下载功能,使用 yt-dlp 在飞牛宿主机批量拉取喜马拉雅播客音频,保存到 podcasts 本地目录。ABS 仅用来管理播客元数据、播放,彻底避开这个 mp4 trailer seek 问题。

需要我写一个 yt-dlp 脚本,输入喜马拉雅 RSS 链接,自动批量下载全部播客剧集,自动创建专辑目录吗?

(注:部分内容可能由 AI 生成)