Python 将视频存储为 hdf5 导致文件较大
Python store video as hdf5 results in large file size
我尝试将视频剪辑逐帧存储到 hdf5 文件中。
到目前为止,我的代码可以正常工作,但我注意到,与源视频文件相比,hdf5 文件的大小要大 10 倍以上。
输入文件:avi 200 x 126px,持续时间:16 分钟,大小:82 MB
输出文件:hdf5,gzip压缩,压缩=9,大小:1GB
存储帧的代码非常简单:
import h5py
from skvideo.io import VideoCapture
frames = []
cap = VideoCapture('/home/ubuntu/PycharmProjects/video2H5Test/data/video_F100_scaled2.avi')
cap.open()
it = 0
while True:
retval, image = cap.read()
if image != None:
frames.append(image)
it += 1
if (it % 1000 == 0):
print('Processed %d frames so far' % (it))
if not retval:
break
with h5py.File('./test3.hdf5','w') as h5File:
h5File.create_dataset('camera1',data=frames,compression='gzip',compression_opts=9)
如您所见,我已经使用 gzip 压缩了我的数据集。
有没有其他方法可以节省内存消耗?
输出的 hdf 文件中的分块方案是什么?压缩是按块进行的,因此考虑到视频中的大部分信息在帧与帧之间不会发生变化,当不同帧存在于同一块中时,您应该会获得更好的压缩率。如果您提供示例视频文件,我可以尝试一下。
遇到同样问题的朋友:
用第一张图片初始化你的数据集:
myDataSet = myFile.create_dataset('someName', data=image[None, ...], maxshape=(
None, image.shape[0], image.shape[1], image.shape[2]), chunks=True)
要添加图像,只需调整整个数据集的大小即可:
myDataSet.resize(myDataSet.len() + 1, axis=0)
myDataSet[myDataSet.len() - 1] = image
我尝试将视频剪辑逐帧存储到 hdf5 文件中。 到目前为止,我的代码可以正常工作,但我注意到,与源视频文件相比,hdf5 文件的大小要大 10 倍以上。
输入文件:avi 200 x 126px,持续时间:16 分钟,大小:82 MB
输出文件:hdf5,gzip压缩,压缩=9,大小:1GB
存储帧的代码非常简单:
import h5py
from skvideo.io import VideoCapture
frames = []
cap = VideoCapture('/home/ubuntu/PycharmProjects/video2H5Test/data/video_F100_scaled2.avi')
cap.open()
it = 0
while True:
retval, image = cap.read()
if image != None:
frames.append(image)
it += 1
if (it % 1000 == 0):
print('Processed %d frames so far' % (it))
if not retval:
break
with h5py.File('./test3.hdf5','w') as h5File:
h5File.create_dataset('camera1',data=frames,compression='gzip',compression_opts=9)
如您所见,我已经使用 gzip 压缩了我的数据集。
有没有其他方法可以节省内存消耗?
输出的 hdf 文件中的分块方案是什么?压缩是按块进行的,因此考虑到视频中的大部分信息在帧与帧之间不会发生变化,当不同帧存在于同一块中时,您应该会获得更好的压缩率。如果您提供示例视频文件,我可以尝试一下。
遇到同样问题的朋友:
用第一张图片初始化你的数据集:
myDataSet = myFile.create_dataset('someName', data=image[None, ...], maxshape=(
None, image.shape[0], image.shape[1], image.shape[2]), chunks=True)
要添加图像,只需调整整个数据集的大小即可:
myDataSet.resize(myDataSet.len() + 1, axis=0)
myDataSet[myDataSet.len() - 1] = image