I used imageio.get_reader(BytesIO(a), 'ffmpeg') to load a bytes image and save it as normal image.
But the below error throws when I read the image using imageio.get_reader(BytesIO(a), 'ffmpeg')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/tango/anaconda3/lib/python3.6/site-packages/imageio/core/functions.py", line 186, in get_reader
return format.get_reader(request)
File "/home/tango/anaconda3/lib/python3.6/site-packages/imageio/core/format.py", line 164, in get_reader
return self.Reader(self, request)
File "/home/tango/anaconda3/lib/python3.6/site-packages/imageio/core/format.py", line 214, in __init__
self._open(**self.request.kwargs.copy())
File "/home/tango/anaconda3/lib/python3.6/site-packages/imageio/plugins/ffmpeg.py", line 323, in _open
self._initialize()
File "/home/tango/anaconda3/lib/python3.6/site-packages/imageio/plugins/ffmpeg.py", line 466, in _initialize
self._meta.update(self._read_gen.__next__())
File "/home/tango/anaconda3/lib/python3.6/site-packages/imageio_ffmpeg/_io.py", line 150, in read_frames
raise IOError(fmt.format(err2))
OSError: Could not load meta information
=== stderr ===
ffmpeg version 4.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7.3.0 (crosstool-NG 1.23.0.449-a04d0)
configuration: --prefix=/home/tango/anaconda3 --cc=/home/conda/feedstock_root/build_artifacts/ffmpeg_1566210161358/_build_env/bin/x86_64-conda_cos6-linux-gnu-cc --disable-doc --disable-openssl --enable-avresample --enable-gnutls --enable-gpl --enable-hardcoded-tables --enable-libfreetype --enable-libopenh264 --enable-libx264 --enable-pic --enable-pthreads --enable-shared --enable-static --enable-version3 --enable-zlib --enable-libmp3lame
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
[matroska,webm @ 0x5619b9da3cc0] File ended prematurely
[matroska,webm @ 0x5619b9da3cc0] Could not find codec parameters for stream 0 (Video: h264, none, 1280x720): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, matroska,webm, from '/tmp/imageio_zm6hhpgr':
Metadata:
title : Kinesis Video SDK
encoder : Kinesis Video SDK 1.0.0
AWS_KINESISVIDEO_FRAGMENT_NUMBER: 91343852333183888465720004820715065721442989478
AWS_KINESISVIDEO_SERVER_TIMESTAMP: 1580791384.096
AWS_KINESISVIDEO_PRODUCER_TIMESTAMP: 1580791377.843
Duration: N/A, bitrate: N/A
Stream #0:0(eng): Video: h264, none, 1280x720, SAR 1:1 DAR 16:9, 1k tbr, 1k tbn, 2k tbc (default)
Metadata:
title : kinesis_video
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
Cannot determine format of input stream 0:0 after EOF
Error marking filters as finished
Conversion failed!
The above approach to read a MKV bytes file was done based on this thread
Or is there is any approach to parse and read the MKV bytes file.
Old question, but I'll leave an answer here for future readers :)
In general, if you have a bytes string that encodes a video (or image), chances are high that you can pass it directly into ImageIO's high-level API and that it can read the bytes directly. In the case of MKV (and some other video formats) ImageIO needs a bit of help because the current ffmpeg plugin struggles with byte strings. [There is a new plugin on the way to fix this and other issues.]
ImageIO<2.15.0
import imageio as iio
req = iio.core.Request(mkv_bytes, "r")
# note: this is where imageIO needs some help, see
# https://github.com/imageio/imageio/issues/686
req._extension = ".mkv"
first_frame = iio.imread(req)
ImageIO>2.15.0 (releases this week - W6 2022)
import imageio as iio
first_frame = iio.v3.imread(mkv_bytes, format_hint=".mkv")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With