Вопрос, поднятый в данном запросе, касается несоответствия между реальной длительностью AVI файла и значением, получаемым с помощью кода на языке Object Pascal в среде Delphi. Пользователь пытается извлечь информацию об AVI файле, включая его длительность, используя библиотеку VFW через обертку JEDI wrapper для WinAPI. В коде присутствует ошибка в расчете длительности, которая приводит к значительному несоответствию с реальной длительностью видео.
Описание проблемы
Пользователь столкнулся с проблемой при попытке определения длительности AVI файла. Для этого он использует функцию AVIFileInfoW, которая возвращает структуру TAVIFILEINFOW с информацией о файле. Однако, при расчете длительности в минутах, полученное значение сильно отличается от реальной длительности фильма. В коде используется следующая логика для расчета длительности:
Пользователь отмечает, что dwRate равен 1 миллиону, dwScale - 40 thousand, что должно соответствовать 25 кадрам в секунду. Тем не менее, dwLength (147 thousand) дает неверное значение длительности, когда используется указанная формула.
Анализ проблемы
Проблема может быть связана с неправильным пониманием или использованием значений dwRate и dwScale. Согласно документации MSDN, эти значения определяют единицы измерения длительности. Важно также учитывать, что стримы в AVI файле могут определять свои собственные масштаб и частоту, что может влиять на общее значение длительности.
Подтвержденный ответ
MSDN указывает, что стрим может определять свой собственный масштаб времени, независимо от масштаба, заданного для всего файла. Это означает, что dwRate и dwScale, предоставляемые в структуре AVIFILEINFO, могут быть переопределены информацией о стриме, которая хранится в структуре AVISTREAMINFO.
Альтернативный подход
Для корректного определения длительности AVI файла необходимо учитывать информацию о всех стримах внутри файла, а не только общую информацию о файле. Возможно, потребуется использовать дополнительные функции для получения информации о стримах, такие как AVIStreamList для получения списка стримов в файле, и AVIStreamInfo для получения информации о каждом стриме.
Пример кода
uses WFV; // Подключение JEDI wrapper для VFW
procedure TForm1.Button1Click(Sender: TObject);
var
lInfo: TAVIFILEINFOW;
lFile: IAVIFILE;
lStream: IAVISTREAM;
lStreamInfo: TAVISTREAMINFOW;
lFileType, lDuration: string;
begin
// Инициализация библиотеки
AVIFileInit;
try
// Открытие файла
AVIFileOpen(lFile, 'E:\Path\To\Your\File.avi', OF_READ, nil);
try
// Получение списка стримов
AVIStreamList(lFile, @lStream, 0);
try
while lStream <> nil do
begin
// Получение информации о стриме
AVIStreamInfo(lStream, lStreamInfo, sizeof(lStreamInfo));
// Расчет длительности стрима и добавление к общему результату
// Здесь должен быть корректный расчет длительности с учетом dwRate и dwScale стрима
// ...
// Освобождение стрима
lStream := lStreamInfo.pNext;
AVIStreamRelease(lStream);
end;
finally
// Закрытие последнего стрима, если он был сохранен в pNext
if lStreamInfo.pNext <> nil then
AVIStreamRelease(lStreamInfo.pNext);
end;
finally
// Получение общей информации о файле
AVIFileInfoW(lFile, lInfo, SizeOf(lInfo));
// Работа с информацией...
// ...
// Закрытие файла
AVIFileRelease(lFile);
end;
finally
// Освобождение библиотеки
AVIFileExit;
end;
end;
Заключение
При работе с AVI файлами важно учитывать, что стрим может иметь свой собственный масштаб и частоту кадров, отличный от общих параметров файла. Для корректного определения длительности необходимо обрабатывать информацию о каждом стриме в файле. Обновленный код должен включать получение списка стримов, их информацию и корректный расчет длительности, исходя из этих данных.
Примечание
Библиотека WFV, используемая в примере, является устаревшей. Рекомендуется использовать современные библиотеки и инструменты для работы с мультимедиа.
Пользователь столкнулся с ошибкой при чтении информации о длительности AVI файла через JEDI wrapper для VFW в Delphi, из-за неправильного расчета, связанного с недопониманием значений `dwRate` и `dwScale`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS