You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过FFmpeg编码视频时直接复制原视频附带的封面图片?

如何通过FFmpeg编码视频时直接复制原视频附带的封面图片?

兄弟我太懂你这种头疼的情况了——明明用mkvextract+ffmpeg+mkvpropedit的组合能搞定,但就是想一步用FFmpeg直接完成编码+保留封面,结果试了各种-map组合要么报错要么把封面当成第二视频流,完全搞心态!

其实问题出在FFmpeg对MKV附件流的识别逻辑上,之前你用的:t是字幕流的缩写,根本不是附件流的标识,难怪找不到;而用:t?的时候FFmpeg把封面JPG当成了普通视频流处理,自然就多了个视频轨道。下面给你说两种靠谱的解决方法:

一、从带封面的原视频直接编码并保留附件封面

FFmpeg其实是支持直接复制原视频的附件流的,只是得用正确的映射参数。你可以这样写命令:

ffmpeg -i input.mkv -c:v libx265 -crf 28 -c:a aac -map 0:v -map 0:a -map 0:attachment? -c:attachment copy output.mkv

我给你拆解下关键参数:

  • -map 0:attachment?:这个是匹配原视频里的所有附件流(包括你的封面图片),加个?是防止原视频没附件时命令报错
  • -c:attachment copy:强制FFmpeg直接复制附件流,不要对它做任何编码处理,这样就能完美保留原封面的格式和内容

如果想更精准指定某一个附件(比如原视频里有多个附件,你只想要封面),可以先运行ffmpeg -i input.mkv查看流信息,找到类似Attachment #0: image/jpeg的行,然后把命令里的-map 0:attachment?改成-map 0:attachment:0(这里的0就是附件的索引)。

二、给无封面的已编码视频添加外部封面

如果你已经有了编码好的无封面视频,想直接用外部封面图片加上去,用这个命令就行:

ffmpeg -i output_no_cover.mkv -i cover.jpg -map 0 -map 1 -c copy -c:v:1 mjpeg -disposition:v:1 attached_pic output_with_cover.mkv

这里的关键是-disposition:v:1 attached_pic,它会把第二个视频流(也就是你加的封面)标记为“附加图片”,这样播放器就能识别成封面显示,而不是当成第二个视频轨道。

额外注意点

  • 只有输出格式是MKV或MP4时,才能正常保留封面:MKV支持附件流的方式,MP4则是用标记为attached_pic的视频流方式
  • 运行命令前可以先执行ffmpeg -i input.mkv确认原视频的流结构,搞清楚附件流的索引,避免映射错轨道

如果上面的FFmpeg命令偶尔出现兼容性问题,你之前用的mkvextract attachments movie.mkv 1 && <ffmpeg编码命令> && mkvpropedit movie_new.mkv --add-attachment cover.jpg临时方案其实依然是个稳妥的选择,毕竟拆分步骤容错性更高。

备注:内容来源于stack exchange,提问作者emk2203

火山引擎 最新活动