Nano Hash - криптовалюты, майнинг, программирование

Pyqt4 декодер QMovie FFMPEG

Я новичок в 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 вместо каждого кадра по отдельности?

Спасибо заранее.


  • Вы уверены, что понимаете, для чего предназначен класс QMovie? Я предлагаю вам более внимательно прочитать подробное описание. 03.03.2017
  • Я так думаю... Что именно ты имеешь в виду? Когда __init__ (self, QString fileName, ...) работает (у меня только с GIF), он делает ТОЧНО, идеально то, что мне нужно. Мне нужно больше, чем простое воспроизведение. Я должен иметь возможность переходить к любому кадру в любое время, просматривать кадры вперед/назад, менять скорость и т. д. Я мог бы писать все сам, декодировать/читать в отдельных потоках и т. д. Динамическое кэширование кадров под указателем мыши на ползунке до того, как он будет нажат, ... Мне кажется, что QMovie аккуратно обрабатывает все эти вещи. 03.03.2017
  • Я не могу выразить это яснее, чем то, что там уже написано. 03.03.2017
  • QMovie делает именно то, что мне нужно, когда инициализируется путем к файлу. Но воспроизводит только 2% форматов видео. Вы можете самостоятельно декодировать видео и инициализировать QMovie с помощью QIODevice. 99% там, прежде чем удариться о стену... Мотивация @ 0%. 08.03.2017
  • Так что вы просто будете упорно продолжать попытки использовать класс, явно не предназначенный для отображения видеоконтента. Неудивительно, что ваша мотивация на нуле процентов... 08.03.2017
  • Что я должен использовать? Он называется qmovie и делает то, что мне нужно. stackoverflow .com/questions/27214178/ 08.03.2017
  • Анимированный gif — это не видео. Прочтите статью, на которую я ссылался в своем первом комментарии. И под чтением я подразумеваю больше, чем просто просмотр первого предложения. 08.03.2017
  • Раз 10 перечитал, пытаясь понять, что вы имеете в виду. Является ли переворачивание QPixmap решением? Использование фонона? Мне нужно сделать видеоплеер для аниматоров (тонкая настройка синхронизации губ и т. д.), в котором можно будет прокручивать и т. д. Просмотр/синхронизация звука не проблема. 08.03.2017
  • Класс QMovie отображает только изображения, а не видео: см. QMovie.supportedFormats. . Загрузка изображения из QIODevice похожа (в терминах python) на передачу файлового объекта, а не пути. В любом случае вам необходимо предоставлять данные из формата анимированного изображения (например, gif), а не из видеоформата. 08.03.2017
  • PS: если вы можете обновиться до PyQt5, модуль QtMultimedia имеет все необходимые вам функции (см.: Работа с низкоуровневыми видеокадрами). 08.03.2017
  • Спасибо. QMovie - довольно вводящее в заблуждение название. 08.03.2017

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..