Pyqt4 QMovie FFMPEG解码器

时间:2017-03-02 22:47:33

标签: python video pyqt4 qbytearray qiodevice

我对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()

为什么framecount 1而不是20? 我做错了什么?

是否有更直接的方法将FFMPEG结果数据存储到QIODevice中? 是不是一次将videoFile加载到QIODevice而不是每个帧?

非常感谢提前。

0 个答案:

没有答案