IMediaSeeking

 
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
Gordon_2007
Новенький


Зарегистрирован: 03.06.2007
Сообщения: 6

СообщениеДобавлено: Вс Июн 03, 2007 11:19 am    Заголовок сообщения: IMediaSeeking Ответить с цитатой

Hello World! Я патаюсь написать проигрыватель на DirectShow9. И в принципе всё идет нормально, но тут в друг столкнулся с глупой проблемой, не могу установить позицию с помощью IMediaSeeking.SetPositions(); Вобще, какие именно параметры и флаги надо поставить. Вот получить текущюю позицию не проблема, я сделал это так:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
SSeek.GetPositions(CurPos,StopPos);
Progress.Position:= CurPos div 1000000;
end;

А как утановить позицию? т.е. мне надо что бы можно было перематывать вперед и назад с помощью TrackBar.

В документации из DirectShow SDK, ImediaSeeking.SetPositions написан так:

HRESULT SetPositions(
LONGLONG *pCurrent,
DWORD dwCurrentFlags,
LONGLONG *pStop,
DWORD dwStopFlags
);

В первый параметр что надо передать? Текущюю позицию или позицию на которую надо установить, а какой флаг для надо установить(второй параметр), а третий параметр? Нифига не пойму, третий день ищю в интернете хоть что нибуть, но ничего не могу найти Evil or Very Mad .
Поэтому я и решил попробывать что нибуть разузнать на этом форуме.
Пожалуйста, кто знает, HELP ME Exclamation Exclamation Exclamation
_________________
GoRdoN Freeman HL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
xchg
Новенький


Зарегистрирован: 17.01.2007
Сообщения: 2

СообщениеДобавлено: Вс Июн 03, 2007 3:09 pm    Заголовок сообщения: Ответить с цитатой

1 параметр - позиция
2 - AM_SEEKING_AbsolutePositioning
3 - NULL
4 - AM_SEEKING_NoPositioning

пример (на асме)
mseeking SetPositions,pSeeking,addr position1,AM_SEEKING_AbsolutePositioning,\
NULL, AM_SEEKING_NoPositioning
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gordon_2007
Новенький


Зарегистрирован: 03.06.2007
Сообщения: 6

СообщениеДобавлено: Вс Июн 03, 2007 6:56 pm    Заголовок сообщения: Ответить с цитатой

Спасибо конечно, но всё таки нифига не заработало, я попробывал поставить все флаги, как ты мне написал, но блин в делфи параметра NULL нема(я так понял), но я попробывал написать nil - все равно не прокатило, потом попробывал объявить переменую и назначить ей параметр NULL, и вот программа моя, т.е. плеер запустиля, но когда я её, то вылазиет вот такое сообщение:

Could not convert variant of type (Null) into type (int64).

И заикается... т.к. мой таймер срабатывает 0,5 раз/сек. то и сообщение это вылазиет два раза в секунду Shocked .
Вообщем может кто по конкретней что подскажет? Я если что могу свой исходник кому нить отправить (Delphi), или может кто то свой исходничок отправит мне (artyoam@yandex.ru - желательно Delphi или С/С++).
_________________
GoRdoN Freeman HL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
AndrеySol
Активный


Зарегистрирован: 27.02.2007
Сообщения: 57

СообщениеДобавлено: Пн Июн 04, 2007 8:14 am    Заголовок сообщения: Ответить с цитатой

Может проще через интерфейс IMediaPosition

double ReleasedPos = (double)m_sliderctrl.GetPos();
piMediaPosition->put_CurrentPosition(ReleasedPos);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gordon_2007
Новенький


Зарегистрирован: 03.06.2007
Сообщения: 6

СообщениеДобавлено: Пн Июн 04, 2007 8:52 am    Заголовок сообщения: Ответить с цитатой

Щас попробую
_________________
GoRdoN Freeman HL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Gordon_2007
Новенький


Зарегистрирован: 03.06.2007
Сообщения: 6

СообщениеДобавлено: Пн Июн 04, 2007 10:49 am    Заголовок сообщения: Ответить с цитатой

О, чудо!!! Получилось, большое тебе спасибо xchg, я теперь вообще удалю из своей программы интерфейс IMediaSeeking, теперь все будет на IMediaPosition.
_________________
GoRdoN Freeman HL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
xchg
Новенький


Зарегистрирован: 17.01.2007
Сообщения: 2

СообщениеДобавлено: Пн Июн 04, 2007 1:48 pm    Заголовок сообщения: Ответить с цитатой

Если я не ошибаюсь мсдн рекомендует использовать IMediaSeeking))
я наоборот не мог IMediaPosition заставить работать))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 199
Откуда: Самара

СообщениеДобавлено: Пн Июн 04, 2007 3:25 pm    Заголовок сообщения: Ответить с цитатой

xchg писал(а):
Если я не ошибаюсь мсдн рекомендует использовать IMediaSeeking))
я наоборот не мог IMediaPosition заставить работать))


Подозреваю, что все зависит от конкретных кодеков...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Vasiliy
Участник


Зарегистрирован: 01.04.2007
Сообщения: 19

СообщениеДобавлено: Пн Июн 04, 2007 3:29 pm    Заголовок сообщения: Ответить с цитатой

Вот куски кода, у меня работает нормально, может пригодится

Код:
function TMPlayer.Slower: HResult;
var Rate: Double;
begin
  Result := E_FAIL;
  If FMediaSeeking = Nil then Exit;
  If SUCCEEDED(FMediaSeeking.GetRate(Rate)) then
   Result := FMediaSeeking.SetRate(Rate / 2);
end;

function TMPlayer.Faster: HResult;
var Rate: Double;
begin
  Result := E_FAIL;
  If FMediaSeeking = Nil then Exit;
  If SUCCEEDED(FMediaSeeking.GetRate(Rate)) then
   Result := FMediaSeeking.SetRate(Rate * 2);
end;

function TMPlayer.GetPlayingPosition(out P: Int64): HResult;
begin
  Result := E_FAIL;
  If FMediaSeeking = Nil then Exit;
  Result := FMediaSeeking.GetCurrentPosition(P);
  If FIsTimeFormat then P := P div frameDuration;
end;

function TMPlayer.SetPlayingPosition(P: Int64): HResult;
var PS, S: Int64;
begin
  Result := E_FAIL;
  If FMediaSeeking = Nil then Exit;
  FMediaSeeking.GetPositions(PS, S);
  If FIsTimeFormat then P := P * frameDuration;
  Result := FMediaSeeking.SetPositions(P, AM_SEEKING_AbsolutePositioning, S,
                                       AM_SEEKING_NoPositioning);
end;

function TMPlayer.StepNext: HResult;
var P, S: Int64;
begin
  Result := E_FAIL;
  If FMediaSeeking = Nil then Exit;
  FMediaSeeking.GetPositions(P, S);
  Inc(P);
  FMediaSeeking.SetPositions(P, AM_SEEKING_AbsolutePositioning,
                             S, AM_SEEKING_NoPositioning);
end;

function TMPlayer.StepPrev: HResult;
var P, S: Int64;
begin
  Result := E_FAIL;
  If FMediaSeeking = Nil then Exit;
  FMediaSeeking.GetPositions(P, S);
  Dec(P);
  FMediaSeeking.SetPositions(P, AM_SEEKING_AbsolutePositioning,
                             S, AM_SEEKING_NoPositioning);
end;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gordon_2007
Новенький


Зарегистрирован: 03.06.2007
Сообщения: 6

СообщениеДобавлено: Пн Июн 04, 2007 8:50 pm    Заголовок сообщения: Ответить с цитатой

Спасибочки Vasiliy за кусок кода! А кто знает как определить, что файл проигрался и находится в состоянии STOP, или в состоянии PAUSE.
_________________
GoRdoN Freeman HL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Gordon_2007
Новенький


Зарегистрирован: 03.06.2007
Сообщения: 6

СообщениеДобавлено: Вт Июн 05, 2007 9:25 pm    Заголовок сообщения: Ответить с цитатой

Gordon_2007 писал(а):
кто знает как определить, что файл проигрался и находится в состоянии STOP, или в состоянии PAUSE.

_________________
GoRdoN Freeman HL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Vasiliy
Участник


Зарегистрирован: 01.04.2007
Сообщения: 19

СообщениеДобавлено: Ср Июн 06, 2007 7:52 pm    Заголовок сообщения: Ответить с цитатой

{DirectShow9}
TFilterState = (
State_Stopped,
State_Paused,
State_Running);

var AState: TFilterState;

IMediaControl.GetState(0,AState)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndrеySol
Активный


Зарегистрирован: 27.02.2007
Сообщения: 57

СообщениеДобавлено: Чт Июн 07, 2007 8:09 am    Заголовок сообщения: Ответить с цитатой

Код:

HRESULT hr;
long pFilterState;

hr = pMediaControl->GetState(100, &pFilterState);
if(hr == S_OK)
{   // проверяем состояние графа
if(pFilterState == State_Stopped)
{
     ..................
}
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий Часовой пояс: GMT + 4
Страница 1 из 1
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB


Рейтинг@Mail.ru