Суббота, 16.12.2017, 21:26
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Delphi » DirectShow и Delphi. » DirectShow - Как узнать количество кадров в видео?
DirectShow - Как узнать количество кадров в видео?
BLACK_CRAFTER666Дата: Воскресенье, 28.07.2013, 14:57 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: Offline
Здравствуйте.
С помощью интерфейсов IBasicVideo и IMediaPosition получаю количество FPS и продолжительность ролика.
Код

var
   tpf, pDuration : Double;
begin
   pBasicVideo.get_AvgTimePerFrame(tpf);

   if tpf > 0 then
   MediaInfo.VideoFPS := 1/tpf else
   MediaInfo.VideoFPS := 0;

   pMediaPosition.get_Duration(pDuration);
   MediaInfo.TrackDuration := FormatDateTime('hh:mm:ss',pDuration / (3600*24));
end;

У меня с математикой плохо smile Как теперь узнать, сколько всего кадров в ролике и как перемотаться на нужный кадр?
И наоборот - как по текущей позиции узнать, на каком кадре я сейчас нахожусь?
Текущую позицию получаю по таймеру:
Код

           pMediaPosition.get_CurrentPosition(pCurrent);
 
xaramamburuДата: Воскресенье, 28.07.2013, 18:06 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Не пробовал, но понимаю так, если MediaInfo.VideoFPS это количество кадров в секунду, а это pDuration количество секунд в фильме, то эти две величины нужно перемножить т.е. MediaInfo.VideoFPS*pDuration это и должно быть количество кадров в фильме. Аналогично с текущей позицией, возможно я неправ, надо проверять.
Да, есть еще интерфейс  IMediaSeeking предназначенный для управления позиционированием в потоке, в нем намного больше возможностей чем в IMediaPosition и как я понял есть возможность работы с различными временными форматами (в том числе и с кадрами). Но когда я писал свой плеер по книге Есенина "DirectX и Delphi" у меня почему то этот интерфейс работать отказался (по крайней мере ускоренное воспроизведение, остальное не помню) и я перешел на IMediaPosition.))))
 
BLACK_CRAFTER666Дата: Среда, 31.07.2013, 11:55 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: Offline
Спасибо, получилось! smile Сравнил с информацией о файле в VirtualDub - количество кадров совпадает. На HD Video, где по 50-60 fps еще не проверял.
Цитата (xaramamburu)
pDuration количество секунд в фильме

А я всё думал, в чем же измеряется это значение smile Кстати, оно идентично TDateTime. Получается, если я сделаю так: pCurrent := 123;, то попаду на таймкод 2:03? Всё так просто? smile не верю smile

Цитата (xaramamburu)
Да, есть еще интерфейс IMediaSeeking предназначенный для управления позиционированием в потоке, в нем намного больше возможностей чем в IMediaPosition

Спасибо. Будет скучно - посмотрю smile Задача пока решена.

Добавлено (31.07.2013, 11:55)
---------------------------------------------
Кстати, вот так можно прыгнуть на нужный кадр:

Код
function GetFramePosition(iFrame : Int64): Double;
begin
    Result := 0;
    if MediaInfo.VideoFPS<=0 then //количество FPS в видео
    Exit;
    if iFrame<=0 then
    iFrame := 1;
    Result := (1 / MediaInfo.VideoFPS) * iFrame;
end;    

Procedure Knopka;
var
    pCurrent : double; //текущая позиция
    newFrame : int64; //номер кадра, на который будем прыгать
begin
    newFrame := 666;
    pCurrent := GetFramePosition(newFrame);
    pMediaPosition.put_CurrentPosition(pCurrent);    
end;

Только, почему-то, не получается прыгнуть на последние несколько кадров.


Сообщение отредактировал BLACK_CRAFTER666 - Среда, 31.07.2013, 11:58
 
xaramamburuДата: Четверг, 01.08.2013, 22:35 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Возможно, потому что вот это (1 / MediaInfo.VideoFPS) - дробь типа Double (а дробь на что не умножай все равно ей и останется) и отсюда происходит не точное вычисление количества кадров.)))
 
Форум » Delphi » DirectShow и Delphi. » DirectShow - Как узнать количество кадров в видео?
Страница 1 из 11
Поиск:


Copyright MyCorp © 2017Конструктор сайтов - uCoz