我对pyqt很陌生。所以请原谅我可能有的任何误解。
我无法使用以下方法将视频直接加载到 QMovie:
__init__ (self, QString fileName, ...)
QMovie 本身在支持(解码)视频格式方面似乎相当挑剔。
这就是为什么我想使用 FFMPEG 解码 VideoFiles,将帧存储到 QIODevice 并将设备提供给 QMovie 使用:
__init__ (self, QIODevice device, ...)
此代码使用 FFMPEG 解码视频文件并将前 20 帧作为 JPG 存储到 QIODevice 流中。这个 QIODevice 被馈送到 QMovie。
伟大的!QMovie 全速播放......但是......只有一次......并且QMovie.frameCount()
返回只是1
帧而不是 20......(之前查询时QMovie.start()
)
使用 PyQt4、imageio、numpy
print('>> FFMPEG Loading file : '+videoFile)
# Use FFMPEG to decode Video through imageio
self.vid=imageio.get_reader(str(videoFile), 'ffmpeg')
# Init QIODevice
byte_array = QtCore.QByteArray()
self.buf = QtCore.QBuffer()
self.movie= QtGui.QMovie(parent)
# Populate 20 Frames Stream
i=0
self.buf.open(QtCore.QIODevice.Append)
#Sample 20 Frames from videoFile
while i<20:
# decode / read to rgb24 Frame
npArray_RGB888 = self.vid.get_data(i).astype(np.uint8)
# Actually 'append' the Frame data to the Stream as JPG
npArray_RGB888.save(self.buf, 'JPG')
#print(' == == '+str(self.buf.data().size()))
#print(' == == '+str(buf.data()))
i+=1
# Close the Stream
self.buf.close()
# Load the QIODecvice buffer in QMovie
# self.movie.setFileName(videoFile) # To decode with QMovie directly
self.movie = QtGui.QMovie(self.buf, 'jpg', self)
print('>>> FrameCount : '+str(self.movie.frameCount()))
self.movie.start()
为什么是帧数1
而不是 20?我究竟做错了什么?
有没有更直接的方法将 FFMPEG 结果数据存储到 QIODevice 中?Prehaps 一次将 videoFile 加载到 QIODevice 中,而不是单独加载每一帧?
提前谢谢了。