使用 ffmpeg 为视频文件添加封面

全程使用 CHAT GPT4 提供帮助

通常而言,电脑上的资源管理器会使用视频的第一帧来作为缩略图,如果视频文件中有封面存在,则会使用封面作为文件缩略图(Windows 自带的资源管理器是这样,具体要看资源管理器的实现)

与 GPT4 沟通后,发现可以使用 ffmpeg 为视频添加封面。原理是为文件添加一个视频流,并标记为封面。

添加封面

ffmpeg -i input.mp4 -i cover.jpg -map 0 -map 1 -c copy -disposition:v:1 attached_pic output.mp4

这个ffmpeg命令用于将一张图片(cover.jpg)作为封面嵌入到一个MP4视频文件(input.mp4)中,并输出一个新的视频文件(output.mp4)。命令中的各个选项和参数含义如下:

ffmpeg: 这是命令行程序的名称,用于调用FFmpeg工具。
-i input.mp4: -i标志指定输入文件,这里input.mp4是第一个输入文件,即原视频文件。
-i cover.jpg: 再次使用-i标志添加第二个输入文件,这里cover.jpg是你想嵌入为封面的图片文件。
-map 0: -map选项用于手动选择输入流(视频、音频、字幕等)添加到输出文件中。0是一个索引号,指的是第一个-i参数指定的文件(即input.mp4)。这个选项指示FFmpeg将整个第一个输入文件的所有流(视频流、音频流等)复制到输出文件中。
-map 1: 同理,这里1指的是第二个输入文件,即cover.jpg。这个选项指示FFmpeg将图片作为一个单独的流添加到输出文件中。
-c copy: -c选项指定编解码器(codec)。这里使用copy来告诉FFmpeg对所有选定的流进行“直接复制”,即不要重新编码,保持原有格式和质量。这可以减少处理时间并避免质量损失。
-disposition:v:1 attached_pic: 这里的-disposition选项用于设置特定流的处置类型。v:1是一个流选择器,它指定要处理的是第二个视频流(在这个上下文中,是我们的封面图片)。attached_pic表示这个流应被视作附加的图片,通常用于封面或缩略图。
output.mp4: 指定输出文件的名字。

总结起来,这个命令告诉FFmpeg将input.mp4视频的所有流,以及cover.jpg图片作为封面,一起复制到output.mp4输出文件中,而不重新编码它们,并将封面图片设置为“附加图片”以供播放器识别。

移除已有封面

如果一个视频文件已经有了封面,则可能需要先移除原有封面。

如已经存在的文件的流是这样的

  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 5004 kb/s, 29.97 fps, 29.97 tbr, 29970 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 185 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x0]: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 1280x857 [SAR 72:72 DAR 1280:857], 90k tbr, 90k tbn (attached pic)

要移除的其实就是第 3 个流

ffmpeg -i 1.mp4 -map 0 -map -0:2 -c copy output_nocover.mp4

-i 1.mp4:这是 input file 的标志,1.mp4 是要处理的视频文件名。
-map 0:这个选项告诉 ffmpeg 将输入文件 1.mp4 中的所有流(音频、视频、字幕等)都映射到输出文件。这里的 0 代表输入文件的索引号,通常情况下一个命令中只有一个输入文件,所以这里用 0 来表示它。
-map -0:2:这是一个排除特定流的选项。-map 选项之后的 - 符号表示排除操作。0:2 指代输入文件中的第三个流(流的索引从0开始计数),根据您提供的 ffmpeg -i 输出信息,这个流是封面图片。因此,这个选项告诉 ffmpeg 排除这个封面图片流,不将它映射到输出文件中。
-c copy:这个选项指示 ffmpeg 对所有被映射的流(即除了被排除的封面图片流之外的所有流)使用“复制”编解码器。这意味着 ffmpeg 不会对音频、视频进行重新编码,而是直接复制原始数据。这样可以加快处理速度,同时避免质量损失。
output_nocover.mp4:这是输出文件的名字,处理后的文件将不再包含原来的封面图像。

总结来说,这条命令的作用是复制 1.mp4 文件中的所有流到一个新的文件 output_nocover.mp4,但是排除了封面图像流。这样处理后的视频文件将保留原有的视频和音频流,但不包括封面图像。

附查看文件中流信息的命令

ffprobe -i input.mp4 -hide_banner
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章