Я новичок в pyqt. Поэтому, пожалуйста, простите меня за возможные неправильные представления.
У меня возникли проблемы с загрузкой видео непосредственно в QMovie с использованием: __init__ (self, QString fileName, ...)
Сам QMovie кажется довольно придирчивым, когда дело доходит до поддержки (декодирования) форматов видео.
Вот почему я хочу декодировать видеофайлы с помощью FFMPEG, сохранять кадры в QIODevice и передавать устройство в QMovie, используя: __init__ (self, QIODevice device, ...)
Этот код использует FFMPEG для декодирования видеофайла и сохраняет первые 20 кадров в потоке QIODevice в виде файлов JPG. Этот 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? Предварительно загрузить видеофайл сразу в QIODevice вместо каждого кадра по отдельности?
Спасибо заранее.