让文件管理器里就显示封面?彻底搞懂嵌入封面/海报图(MP4/MKV 实战与批量)
你有没有发现,有些 MP4 在 Windows 资源管理器或播放器列表里直接显示一张封面图,而自己的视频却是个灰扑扑的图标?这是因为文件里嵌入了封面(attached picture)。这篇文章讲怎么给 MP4/MKV 嵌入封面、怎么提取已有封面、怎么批量配图,以及常见坑,并聊聊内嵌封面和外部 poster 的区别。
一、为什么要嵌入封面
- 文件管理器/播放器列表直接显示缩略图,辨识度拉满;
- 分享单个文件就自带海报,不用额外配图;
- 某些媒体库(Plex、Infuse、Jellyfin)优先用内嵌封面,否则回退到文件夹里的 poster.jpg。
二、MP4 嵌入封面
ffmpeg 用 -attach + metadata/-disposition 把图片作为 attached_pic 写进去:
ffmpeg -i input.mp4 -i cover.jpg -map 0 -map 1 -c copy \
-c:v:1 mjpeg -disposition:v:1 attached_pic \
output.mp4
-map 0取原视频所有流;-map 1取封面图;-c:v:1 mjpeg把封面编码成 MJPEG(MP4 规范要求封面为 MJPEG);-disposition:v:1 attached_pic标记为封面。
封面建议用宽高比接近视频的 JPG,尺寸适中(如 640×360 或 1280×720),别太大。
三、MKV 嵌入封面
MKV 更灵活,支持 png/jpg:
# 方式 A:用 -attach
ffmpeg -i input.mkv -attach cover.jpg -metadata:s:t:0 mimetype=image/jpeg -c copy output.mkv
# 方式 B:用图片流 map
ffmpeg -i input.mkv -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic out.mkv
四、提取已有封面
反过来,从带封面的文件里抠出来:
# MP4:取第二个视频流(封面常作为 video stream 存在)
ffmpeg -i input.mp4 -map 0:v:1 -frames:v 1 cover.jpg
# MKV:取附件流
ffmpeg -i input.mkv -map 0:t -c copy cover.jpg
不确定封面是哪个流时,先用 ffprobe 看 stream 类型和 disposition:
ffprobe -v error -show_entries stream=index,codec_type,codec_name,disposition -of json input.mp4
五、批量给一目录视频配封面
假设每个视频同目录有同名的 .jpg:
for f in *.mp4; do
[ -f "${f%.mp4}.jpg" ] || continue
ffmpeg -i "$f" -i "${f%.mp4}.jpg" -map 0 -map 1 -c copy \
-c:v:1 mjpeg -disposition:v:1 attached_pic "c_$f"
done
六、封面尺寸与格式建议
| 容器 | 封面格式 | 建议尺寸 |
|---|---|---|
| MP4 | MJPEG (jpg) | ≤1280×720 |
| MKV | png/jpg 均可 | ≤1920×1080 |
| WebM | png | 适中 |
过大封面会显著增大文件、且部分设备不显示。
七、内嵌封面 vs 外部 poster.jpg
- 内嵌封面:存在文件内部,随文件走,分享单个文件也带;
- 外部 poster.jpg:放在同目录,媒体库能读,但分享单个文件时不会带上;
- 两者可共存,媒体库通常优先内嵌。
八、常见翻车现场
| 现象 | 根因 | 解法 |
|---|---|---|
| 嵌入后不显示封面 | 没设 attached_pic disposition | 加 -disposition:v:1 attached_pic |
| MP4 封面报错 | 用了 png 而非 mjpeg | 加 -c:v:1 mjpeg |
| 文件变大很多 | 封面分辨率太高 | 缩小封面图 |
| 提取封面失败 | 封面流索引不对 | 先用 ffprobe 看 stream 再取 |
| 覆盖原封面 | map 顺序错 | 确认封面是最后一个 map |
九、常见问题
Q:嵌入封面损画质吗? 视频流 -c copy 无损,封面本身是单独图片,不影响视频。
Q:能换封面吗? 能,重新跑 -attach 覆盖即可(注意先去掉旧封面,否则可能多张)。
Q:手机相册认内嵌封面吗? 部分认 MP4 的 attached_pic,部分只认文件首帧,看系统实现。
Q:能不能用视频某一帧当封面? 能,先抽出一帧存图,再嵌入;或直接用 ffmpeg 取首帧做封面。
Q:封面太多张会怎样? 播放器一般取第一张 attached_pic;多余的可删。
十、端到端实战:给一季视频批量配封面
假设目录里 S01E01.mp4 … S01E10.mp4 各自有同名的 S01E01.jpg:
for f in S01E*.mp4; do
jpg="${f%.mp4}.jpg"
[ -f "$jpg" ] || continue
ffmpeg -i "$f" -i "$jpg" -map 0 -map 1 -c copy \
-c:v:1 mjpeg -disposition:v:1 attached_pic "c_$f"
done
注意:若原文件已带封面,再次 -map 可能叠加多张,建议先 -map 0 -map -0:v:1 去掉旧封面再附新图,或处理前先抽掉封面。
十一、用视频首帧做封面
没有现成图片时,取第 1 秒的一帧当封面:
ffmpeg -i input.mp4 -ss 00:00:01 -frames:v 1 frame.jpg
ffmpeg -i input.mp4 -i frame.jpg -map 0 -map 1 -c copy -c:v:1 mjpeg -disposition:v:1 attached_pic out.mp4
十二、更多 FAQ
Q:封面图比例要和视频一致吗? 不必严格一致,但差异过大某些设备会拉伸;建议按比例裁剪到接近视频宽高比。
Q:内嵌封面能被所有播放器读吗? 主流播放器/文件管理器基本支持;个别老旧软件只读外部 poster.jpg。
Q:封面分辨率越高越好? 不是,过高会撑大文件且不被显示;720p 封面足够。
Q:WebM 怎么嵌封面? WebM 用 attached_pic 同样可行,但部分浏览器 <video> 不显示;外部 poster 属性更通用。
十三、最佳实践清单
- 封面图优先 JPG、宽高比接近视频、尺寸 ≤1280×720;
- MP4 封面务必
-c:v:1 mjpeg(MJPEG 封装),MKV 可用 png; - 视频流一定
-c copy保画质,仅封面编码; - 批量前确认每文件都有对应图片,避免脚本中断;
- 媒体库优先读内嵌封面,外部
poster.jpg作兜底。
小结
嵌入封面 = -attach/-map 图片 + -disposition attached_pic,MP4 需 MJPEG 编码。它能让文件自带海报、辨识度拉满。批量处理时记得封面尺寸别太大,且视频流务必 -c copy 保画质。