簡體   English   中英

如何使用 imageio.v3 從字節中獲取視頻元數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM