[英]How to get video metadata from bytes using imageio.v3?
我正在創建一個 python class 來處理從 http 帖子收到的視頻。 視頻的大小范圍很廣,從 10 秒到 10 小時不等。 我正在尋找一種方法來獲取視頻元數據,例如 fps、高度、寬度等,而不必將整個視頻存儲在 memory 中。
class 的初始化如下:
class VideoToolkit:
def __init__(self,video,video_name,media_type,full_video=True,frame_start=None,frame_stop=None):
self._frames = iio.imiter(video,format_hint=''.join(['.',media_type.split('/')[1]])) # Generator
self._meta = iio.immeta(video,exclude_applied=False)
self._meta
的行不起作用,會出現錯誤:
OSError: Could not find a backend to open `<bytes>`` with iomode `r`.
是否有類似的方法可以使用imageio.v3獲取元數據,而不是將整個視頻存儲在 memory 中?
舉個例子,可以直接從文件中獲取打開視頻的元數據:
import imageio.v3 as iio
metadata = iio.immeta('./project.mp4',exclude_applied=False)
print(metadata)
Output:
{'plugin': 'ffmpeg', 'nframes': inf, 'ffmpeg_version': '4.2.2-static https://johnvansickle.com/ffmpeg/ built with gcc 8 (Debian 8.3.0-6)', 'codec': 'mpeg4', 'pix_fmt': 'yuv420p', 'fps': 14.25, 'source_size': (500, 258), 'size': (500, 258), 'rotate': 0, 'duration': 1.69}
但是打開與字節相同的文件,這不起作用:
import imageio.v3 as iio
with open('./project.mp4', 'rb') as vfile:
vbytes = vfile.read()
metadata = iio.immeta(vbytes,exclude_applied=False)
print(metadata)
Output:
OSError: Could not find a backend to open `<bytes>`` with iomode `r`.
PS:一種方法可能是next(self._frames)
獲取第一幀,然后得到它的形狀,但視頻 fps 仍然會丟失。
你是正確的,你會為此使用iio.immeta
。 這對您來說失敗的原因是因為您使用的是 imageio-ffmpeg 后端,它會根據 ImageResource 的擴展決定它是否可以/不能讀取某些內容。 bytes
沒有擴展名,所以插件會認為它無法讀取 ImageResource。 以下是您可以解決此問題的不同方法:
import imageio.v3 as iio
# setup
frames = iio.imread("imageio:cockatoo.mp4")
video_bytes = iio.imwrite("<bytes>", frames, extension=".mp4")
# set the `extension` kwarg (check the docs I linked)
meta = iio.immeta(video_bytes, extension=".mp4")
# use the new-ish pyav plugin
# (`pip install av` and ImageIO will pick it up automatically)
meta = iio.immeta(video_bytes)
注 1:使用 pyav 實際上更可取,因為它在不解碼像素的情況下提取元數據。 這比 imageio-ffmpeg 更快,后者在子進程中內部調用 ffmpeg,將解碼一些像素然后丟棄該數據(昂貴的 noop)。 從 HTTP 資源讀取時尤其如此。
注意 2:在 v2.21.2 中,pyav 插件不報告 FPS,只報告可用的持續時間。 現在有一個 PR ( 853 ) 添加了這個(和其他東西),但在接下來的幾周內它可能不會被合並,因為我正忙於我的博士論文答辯。
注 3:很多對 FPS 感興趣的人都想知道這個信息來計算視頻中的總幀數。 在這種情況下,調用iio.improps
並檢查生成的.shape
會容易得多,例如iio.improps("imageio:cockatoo.mp4", plugin="pyav").shape # (280, 720, 1280, 3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.