Быстрое/синхронное получение метаданных мультимедиа [Qt, Windows]

#c #windows #qt #metadata #qmediaplayer

Вопрос:

Я пытаюсь получить .mp4 метаданные многих файлов, и в настоящее время я использую этот QMediaPlayer метод , устанавливая носитель с m_tempPlayer->setMedia(QUrl::fromLocalFile(file.absoluteFilePath())) помощью, а затем считывая доступные метаданные из установленного соединения, но это делается асинхронно, что означает, что я не получаю данные быстро и вовремя для выполнения других операций.

  1. Установка носителя, а затем ожидание чтения доступных метаданных является асинхронным, поэтому я иногда (или, может быть, каждый раз) не могу прочитать новое значение длительности сразу после установки нового носителя (что является основным значением носителя, который я хочу).
  2. Если я использую a QEventLoop для ожидания сигнала о том, что я прочитал новые метаданные, во-первых, замедление чтения метаданных из многих файлов во многих папках существенно, кроме того, хотя я каждый раз получаю новые значения метаданных, я также получаю эти неприятные исключения для каждого: Exception thrown at 0x00007FFAB6A24F69 (KernelBase.dll) in app.exe: 0x000006F4: A null reference pointer was passed to the stub. / onecorecomcombasedcomremresolver.cxx(2507)combase.dll!00007FFAB8554F76: (caller: 00007FFAB8551A05) ReturnHr(511) tid(17f8) 80040154 Class not registered .

Возможно , я делаю что-то не так с QEventLoop этим, но я не знаю, что это такое. Есть ли другой способ использовать QMediaPlayer или какой-либо другой модуль для более мгновенного и синхронного получения метаданных файлов? Мой основной интерес-продолжительность .mp4 файлов и, возможно, какая-то другая информация, содержащаяся в .mp4 файлах, и мне нужно делать это быстро, потому что я загружаю много файлов во многие папки и использую данные для пользовательских виджетов в других местах. Очевидно, что для такого рода вещей есть другие открытые библиотеки C , которые я еще не пробовал, но сначала я ищу встроенное решение Qt.

Note: Меня также немного раздражает, что с помощью этого метода мне приходится использовать ненужный временный QMediaPlayer файл, который я просто отбрасываю после получения метаданных, вместо того, чтобы получать их непосредственно из файла, что было бы почти мгновенно. Любая помощь будет признательна.

 // connecting to mediaStatusChanged:
m_tempPlayer = new QMediaPlayer;
connect(m_tempPlayer, amp;QMediaPlayer::mediaStatusChanged, this, amp;_event::onMediaStatusChanged);

// setting meta data and waiting on read
foreach (file, eventDirContents) {
    if (file.isFile()) {
        m_tempPlayer->setMedia(QUrl::fromLocalFile(file.absoluteFilePath()));
        QEventLoop loop;
        loop.connect(this, SIGNAL(durationValueUpdated()), amp;loop, SLOT(quit()));
        loop.exec();
    }
}

void _event::onMediaStatusChanged(QMediaPlayer::MediaStatus status) {
    if (status == QMediaPlayer::LoadedMedia) {
        QStringList metadatalist = m_tempPlayer->availableMetaData();
        int list_size = metadatalist.size();

        QString metadata_key;
        QVariant var_data;

        for (int indx = 0; indx < list_size; indx  ) {
            metadata_key = metadatalist.at(indx);
            var_data = m_tempPlayer->metaData(metadata_key);

            if (metadata_key == "Duration") {
                ...
                emit durationValueUpdated(); // <-- notice to the event loop that im done
                return;
            }
        }
    }
}
 

Комментарии:

1. Class not registered речь идет о том, что в системе нет COM-объекта, который делает видео. Люди, которые делают видео приложения с Qt, в основном отказываются от собственного медиаплеера Qt, так как он работает не слишком часто из-за отсутствия компонентов в системе. Как разместить, скажем, библиотеку VLC в Qt, в ответе не поместится, но вы всегда можете погуглить и попробовать. Также этот код, который считывает видеофайлы в системе, чтобы получить их информацию о мето. Не делай этого. Видеоплеер Qt настолько неудобен из-за своего дизайна, верно. Избегайте вообще QEventLoop, если только тоже нет другого выхода. Я бы отправлял один звонок за другим.