Video Preview Thumbnail Generation Fails for Some Items

Heya Plex devs, this example file is perfect. It fails to generate video preview thumbnails, as advertised.

I think this might actually be an FFmpeg bug in -skip_frame nokey. It seems to skip the entire file.

No output jpg created:

% ffmpeg -skip_frame:v nokey -i input.mkv -q 3 -filter_complex "[0:V:0] fps=fps=0.500000:round=up,scale=w=320:h=240:force_original_aspect_ratio=decrease [out]" -map "[out]" img-%06d.jpg
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.62)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, matroska,webm, from 'input.mkv':
  Metadata:
    encoder         : TMPGEnc Video Mastering Works 6 Version. 6.2.11.38
    creation_time   : 2020-07-21T14:46:06.558000Z
  Duration: 00:05:01.64, start: 0.000000, bitrate: 2218 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(tv, bt470bg, top first), 720x576 [SAR 12:11 DAR 15:11], SAR 157:144 DAR 785:576, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream mapping:
  Stream #0:0 (h264) -> fps
  scale -> Stream #0:0 (mjpeg)
Press [q] to stop, [?] for help
[h264 @ 0x7fd418034600] illegal short term buffer state detected
[swscaler @ 0x7fd41a073000] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'img-%06d.jpg':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 300x240 [SAR 157:144 DAR 785:576], q=2-31, 200 kb/s, 0.50 fps, 0.50 tbn, 0.50 tbc (default)
    Metadata:
      encoder         : Lavc58.91.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame=    0 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed=   0x    
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)

When used without -skip_frame:v nokey it’s slower, but it produces the files as expected.

% ffmpeg -i input.mkv -q 3 -filter_complex "[0:V:0] fps=fps=0.500000:round=up,scale=w=320:h=240:force_original_aspect_ratio=decrease [out]" -map "[out]" img-%06d.jpg         
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.62)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, matroska,webm, from 'input.mkv':
  Metadata:
    encoder         : TMPGEnc Video Mastering Works 6 Version. 6.2.11.38
    creation_time   : 2020-07-21T14:46:06.558000Z
  Duration: 00:05:01.64, start: 0.000000, bitrate: 2218 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(tv, bt470bg, top first), 720x576 [SAR 12:11 DAR 15:11], SAR 157:144 DAR 785:576, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream mapping:
  Stream #0:0 (h264) -> fps
  scale -> Stream #0:0 (mjpeg)
Press [q] to stop, [?] for help
[swscaler @ 0x7fe5a1734000] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'img-%06d.jpg':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 300x240 [SAR 157:144 DAR 785:576], q=2-31, 200 kb/s, 0.50 fps, 0.50 tbn, 0.50 tbc (default)
    Metadata:
      encoder         : Lavc58.91.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame=  151 fps= 27 q=3.0 Lsize=N/A time=00:05:02.00 bitrate=N/A speed=54.4x    
video:1711kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
% ls *jpg  
img-000001.jpg	img-000017.jpg	img-000033.jpg	img-000049.jpg	img-000065.jpg	img-000081.jpg	img-000097.jpg	img-000113.jpg	img-000129.jpg	img-000145.jpg
img-000002.jpg	img-000018.jpg	img-000034.jpg	img-000050.jpg	img-000066.jpg	img-000082.jpg	img-000098.jpg	img-000114.jpg	img-000130.jpg	img-000146.jpg
img-000003.jpg	img-000019.jpg	img-000035.jpg	img-000051.jpg	img-000067.jpg	img-000083.jpg	img-000099.jpg	img-000115.jpg	img-000131.jpg	img-000147.jpg
img-000004.jpg	img-000020.jpg	img-000036.jpg	img-000052.jpg	img-000068.jpg	img-000084.jpg	img-000100.jpg	img-000116.jpg	img-000132.jpg	img-000148.jpg
img-000005.jpg	img-000021.jpg	img-000037.jpg	img-000053.jpg	img-000069.jpg	img-000085.jpg	img-000101.jpg	img-000117.jpg	img-000133.jpg	img-000149.jpg
img-000006.jpg	img-000022.jpg	img-000038.jpg	img-000054.jpg	img-000070.jpg	img-000086.jpg	img-000102.jpg	img-000118.jpg	img-000134.jpg	img-000150.jpg
img-000007.jpg	img-000023.jpg	img-000039.jpg	img-000055.jpg	img-000071.jpg	img-000087.jpg	img-000103.jpg	img-000119.jpg	img-000135.jpg	img-000151.jpg
img-000008.jpg	img-000024.jpg	img-000040.jpg	img-000056.jpg	img-000072.jpg	img-000088.jpg	img-000104.jpg	img-000120.jpg	img-000136.jpg
img-000009.jpg	img-000025.jpg	img-000041.jpg	img-000057.jpg	img-000073.jpg	img-000089.jpg	img-000105.jpg	img-000121.jpg	img-000137.jpg
img-000010.jpg	img-000026.jpg	img-000042.jpg	img-000058.jpg	img-000074.jpg	img-000090.jpg	img-000106.jpg	img-000122.jpg	img-000138.jpg
img-000011.jpg	img-000027.jpg	img-000043.jpg	img-000059.jpg	img-000075.jpg	img-000091.jpg	img-000107.jpg	img-000123.jpg	img-000139.jpg
img-000012.jpg	img-000028.jpg	img-000044.jpg	img-000060.jpg	img-000076.jpg	img-000092.jpg	img-000108.jpg	img-000124.jpg	img-000140.jpg
img-000013.jpg	img-000029.jpg	img-000045.jpg	img-000061.jpg	img-000077.jpg	img-000093.jpg	img-000109.jpg	img-000125.jpg	img-000141.jpg
img-000014.jpg	img-000030.jpg	img-000046.jpg	img-000062.jpg	img-000078.jpg	img-000094.jpg	img-000110.jpg	img-000126.jpg	img-000142.jpg
img-000015.jpg	img-000031.jpg	img-000047.jpg	img-000063.jpg	img-000079.jpg	img-000095.jpg	img-000111.jpg	img-000127.jpg	img-000143.jpg
img-000016.jpg	img-000032.jpg	img-000048.jpg	img-000064.jpg	img-000080.jpg	img-000096.jpg	img-000112.jpg	img-000128.jpg	img-000144.jpg

It definitely does have keyframes, and ffmpeg can identify and extract them. It seems like it’s just -skip_frame nokey that isn’t working.

% ffmpeg -i input.mkv -q 3 -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 0 frame%03d.jpg
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.62)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, matroska,webm, from 'input.mkv':
  Metadata:
    encoder         : TMPGEnc Video Mastering Works 6 Version. 6.2.11.38
    creation_time   : 2020-07-21T14:46:06.558000Z
  Duration: 00:05:01.64, start: 0.000000, bitrate: 2218 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(tv, bt470bg, top first), 720x576 [SAR 12:11 DAR 15:11], SAR 157:144 DAR 785:576, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0x7f8257632000] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'frame%03d.jpg':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 720x576 [SAR 157:144 DAR 785:576], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc58.91.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame=   31 fps=5.9 q=3.0 Lsize=N/A time=00:04:58.88 bitrate=N/A speed=  57x    
video:1481kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
% ls *jpg
frame001.jpg	frame005.jpg	frame009.jpg	frame013.jpg	frame017.jpg	frame021.jpg	frame025.jpg	frame029.jpg
frame002.jpg	frame006.jpg	frame010.jpg	frame014.jpg	frame018.jpg	frame022.jpg	frame026.jpg	frame030.jpg
frame003.jpg	frame007.jpg	frame011.jpg	frame015.jpg	frame019.jpg	frame023.jpg	frame027.jpg	frame031.jpg
frame004.jpg	frame008.jpg	frame012.jpg	frame016.jpg	frame020.jpg	frame024.jpg	frame028.jpg

ffprobe -show_frames finds 31 frames with key_frame=1 and pict_type=I, as expected, but it’s also weird with -skip_frame nokey.

1 Like