#c #windows #qt #metadata #qmediaplayer
Вопрос:
Я пытаюсь получить .mp4
метаданные многих файлов, и в настоящее время я использую этот QMediaPlayer
метод , устанавливая носитель с m_tempPlayer->setMedia(QUrl::fromLocalFile(file.absoluteFilePath()))
помощью, а затем считывая доступные метаданные из установленного соединения, но это делается асинхронно, что означает, что я не получаю данные быстро и вовремя для выполнения других операций.
- Установка носителя, а затем ожидание чтения доступных метаданных является асинхронным, поэтому я иногда (или, может быть, каждый раз) не могу прочитать новое значение длительности сразу после установки нового носителя (что является основным значением носителя, который я хочу).
- Если я использую 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, если только тоже нет другого выхода. Я бы отправлял один звонок за другим.