| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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
);
В первый параметр что надо передать? Текущюю позицию или позицию на которую надо установить, а какой флаг для надо установить(второй параметр), а третий параметр? Нифига не пойму, третий день ищю в интернете хоть что нибуть, но ничего не могу найти .
Поэтому я и решил попробывать что нибуть разузнать на этом форуме.
Пожалуйста, кто знает, HELP ME  _________________ GoRdoN Freeman HL |
|
| Вернуться к началу |
|
 |
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 раз/сек. то и сообщение это вылазиет два раза в секунду .
Вообщем может кто по конкретней что подскажет? Я если что могу свой исходник кому нить отправить (Delphi), или может кто то свой исходничок отправит мне (artyoam@yandex.ru - желательно Delphi или С/С++). _________________ GoRdoN Freeman HL |
|
| Вернуться к началу |
|
 |
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 |
|
| Вернуться к началу |
|
 |
Gordon_2007 Новенький
Зарегистрирован: 03.06.2007 Сообщения: 6
|
Добавлено: Пн Июн 04, 2007 10:49 am Заголовок сообщения: |
|
|
О, чудо!!! Получилось, большое тебе спасибо xchg, я теперь вообще удалю из своей программы интерфейс IMediaSeeking, теперь все будет на IMediaPosition. _________________ GoRdoN Freeman HL |
|
| Вернуться к началу |
|
 |
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 заставить работать)) |
Подозреваю, что все зависит от конкретных кодеков... |
|
| Вернуться к началу |
|
 |
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 |
|
| Вернуться к началу |
|
 |
Gordon_2007 Новенький
Зарегистрирован: 03.06.2007 Сообщения: 6
|
Добавлено: Вт Июн 05, 2007 9:25 pm Заголовок сообщения: |
|
|
| Gordon_2007 писал(а): | | кто знает как определить, что файл проигрался и находится в состоянии STOP, или в состоянии PAUSE. |
_________________ GoRdoN Freeman HL |
|
| Вернуться к началу |
|
 |
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)
{
..................
}
} |
|
|
| Вернуться к началу |
|
 |
|