FFMPEG 用于下载时失真的视频缩略图

Posted

技术标签:

【中文标题】FFMPEG 用于下载时失真的视频缩略图【英文标题】:FFMPEG for thumbnail from video distorted when downloaded 【发布时间】:2020-11-06 12:49:31 【问题描述】:

我正在从 mp4 中抓取缩略图。

当我使用-c:v mjpeg 时,缩略图在浏览器中显示正常,但在我的 Mac 上预览时完全变形。如果我使用-c:v jpeg2000,图像在我的 Mac 上看起来不错,但它不会显示在浏览器中。

完整命令:

ffmpeg -ss 3 -i https://some_site/some_video.mp4 -vf thumbnail,scale=480:480 -q:v 2 -frames:v 1 -f image2 -c:v jpeg2000 -r 1 -vframes 1 tmp/my_thumbnail.jpg

-vs-

ffmpeg -ss 3 -i https://some_site/some_video.mp4 -vf thumbnail,scale=480:480 -q:v 2 -frames:v 1 -f image2 -c:v mjpeg -r 1 -vframes 1 tmp/my_thumbnail.jpg

我需要使用什么编码才能使生成的缩略图既可以在浏览器中查看,又可以在 Mac 上预览?

这是扭曲的图像的样子:

我开始认为这是一个 macOS 问题,但即使是这样,我也想知道 FFMPEG 是否有解决方案,这样即使操作系统有问题的用户也可以正确预览图像。

输出:

ffmpeg version 4.1.5 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 8.3.0 (Alpine 8.3.0)
  configuration: --prefix=/usr --enable-avresample --enable-avfilter --enable-gnutls --enable-gpl --enable-libass --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libx264 --enable-libx265 --enable-libtheora --enable-libv4l2 --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-libxcb --disable-stripping --disable-static --disable-librtmp --enable-vaapi --enable-vdpau --enable-libopus --disable-debug
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'https://some_site/some_video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1mp42
    creation_time   : 2020-02-28T16:46:30.000000Z
  Duration: 00:00:06.23, start: 0.000000, bitrate: 2004 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 480x480 [SAR 1:1 DAR 1:1], 1951 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2020-02-28T16:46:29.000000Z
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 48 kb/s (default)
    Metadata:
      creation_time   : 2020-02-28T16:46:29.000000Z
File 'tmp/my_thumbnail.jpg' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0x55acb21fbb00] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'tmp/my_thumbnail.jpg':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1mp42
    encoder         : Lavf58.20.100
    Stream #0:0(und): Video: mjpeg, yuvj444p(pc), 480x480 [SAR 1:1 DAR 1:1], q=2-31, 200 kb/s, 1 fps, 1 tbn, 1 tbc (default)
    Metadata:
      creation_time   : 2020-02-28T16:46:29.000000Z
      encoder         : Lavc58.35.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
[Parsed_thumbnail_0 @ 0x55acb21e35c0] frame id #58 (pts_time=1.933333) selected from a set of 97 images
frame=    1 fps=0.0 q=2.0 Lsize=N/A time=00:00:01.00 bitrate=N/A dup=1 drop=1 speed=2.04x    
video:39kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

【问题讨论】:

@llogan 已更新。谢谢。 很抱歉给您带来了困惑。我只是在我的编辑中错过了一个“下载”。只是在产品中,我将缩略图保存到 S3,然后下载它。再次更新。但是,你的修复奏效了!太感谢了!如果您想将此添加为答案,我会将其标记为已接受的答案。只是为了将来参考,你是怎么知道的?我在 ffmpeg 文档中的任何地方都没有找到。 【参考方案1】:

它可能不喜欢日志中显示的 4:4:4 子采样 (yuvj444p)。

ffmpeg 中,这被命名为像素格式。编码器 mjpeg 支持 yuvj420p、yuvj422p 和 yuvj444p,如支持的像素格式下的ffmpeg -h encoder=mjpeg 所示。默认情况下ffmpeg 会自动尝试选择破坏性最小的像素格式,但糟糕的解码器可能不支持更复杂的格式。

您可以使用format filter 或旧版-pix_fmt 输出选项输出特定的像素格式:

ffmpeg -ss 3 -i https://some_site/some_video.mp4 -vf "thumbnail,scale=480:480,format=yuvj420p" -q:v 2 -frames:v 1 tmp/my_thumbnail.jpg

4:2:0 (yuvj420p) 将得到最广泛的支持,但请先尝试 4:2:2 (yuvj422p),因为它可能看起来会稍微好一些。

其他工具也可以处理这个问题,例如 GIMP(文件 → 导出为 → 导出 → 高级选项 → 二次采样)。

【讨论】:

以上是关于FFMPEG 用于下载时失真的视频缩略图的主要内容,如果未能解决你的问题,请参考以下文章

通过 HTTP 下载部分视频(用于远程缩略图)

利用FFmpeg生成视频缩略图

网站调用土豆视频时怎么抓取缩略图?(高分悬赏)

利用FFmpeg生成视频缩略图 2.3.1

利用FFmpeg生成视频缩略图 2.1.8

如何在 ffmpeg 中居中裁剪视频缩略图(方形缩略图)?