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

FFMPEG for thumbnail from video distorted when downloaded

我正在从 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

-对-

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 是否有解决方案,以便即使是有 buggy 的用户 OS可以正常预览图片

输出:

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

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

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(文件 → 导出为 → 导出 → 高级选项 → 子采样)。