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
.