|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.06.2009, 23:16 | #1 |
Регистрация: 26.06.2009
Сообщений: 7
|
перемотка avi или начать воспроизведение с середины...
воспроизвожу видео разделяя на потоки:
var tmp:WideString; fl:PWideChar; ... begin ... CoInitialize(nil); CoCreateInstance(CLSID_FilterGraph, nil,CLSCTX_INPROC_SERVER,IID_IGraph Builder,MyGraphBuilder); fl:=PWideChar(tmp); MyGraphBuilder.RenderFile(fl,nil); MyGraphBuilder.QueryInterface(IID_I MediaControl,MyMediaControl); MyGraphBuilder.QueryInterface(IID_I VideoWindow,VideoWindow); VideoWindow.put_Owner(Self.Panel1.H andle); VideoWindow.put_WindowStyle(WS_CHIL D OR WS_CLIPSIBLINGS); VideoWindow.GetWindowPosition(Left, Top,Width,Height); NewWidth := Panel1.Width-4; NewHeight := round((NewWidth * Height) / Width); NewLeft:=2; NewTop:=round( (Panel1.Height - NewHeight)/2); VideoWindow.SetWindowPosition(NewLe ft,NewTop,NewWidth,NewHeight); MyMediaControl.Run; CoUninitialize; ... end; ... где fl - путь до файла panel1 - собственно на ней воспроизводится, в зависимости от размера видео маштабируется вопрос: видео воспроизводится сначала. Как сделать, чтобы воспроизведение начиналось не сначала, а скажем по истечении 15 минут (т.е. что-то вроде перемотки) ... поможите товарищи, не могу разобраться уже два дня.... |
27.06.2009, 00:54 | #2 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Нужен интерфейс IMediaPosition. там есть get_duration и set_current_position (пишу тут, не смотря в код, так что с названиями (с точностью) я наверное ошибся, но когда увидите список методов IMediaPosition, думаю вопросов не будет)
|
27.06.2009, 18:11 | #3 |
Регистрация: 26.06.2009
Сообщений: 7
|
BOBAH13
спасибо за отзывчивость, возник встречный вопрос к вышеуказанному коду добавил ... var Fcurrent_position : double; position : double; peremotka :IMediaPosition; ... begin ... peremotka.get_Duration( position ); // вычисляю длину видео Fcurrent_position:=( position / 5 ); peremotka.put_CurrentPosition( Fcurrent_position ) ; //перемотка вопрос что то не доделал, как привязать peremotka к моему воспроизводимому видео, делаю так peremotka.QueryInterface(IID_IMedia Control,MyMediaControl); peremotka.QueryInterface(IID_IVideo Window,VideoWindow); ругается компиллятор... |
27.06.2009, 18:17 | #4 |
Регистрация: 26.06.2009
Сообщений: 7
|
затупил....
peremotka.QueryInterface(IID_IMedia Control,MyMediaControl); peremotka.QueryInterface(IID_IVideo Window,VideoWindow); муть написал, давно программил надо было просто MyGraphBuilder.QueryInterface(IID_I MediaPosition, peremotka); |
27.06.2009, 18:18 | #5 |
Регистрация: 26.06.2009
Сообщений: 7
|
BOBAH13
спасибо друх! Да прибудит с тобой великая сила delphi и клавиатуры!!! |
04.09.2009, 21:54 | #6 |
Регистрация: 26.06.2009
Сообщений: 7
|
в продолжение темы...
как отследить конец видео? MyGraphBuilder.QueryInterface(IID_I MediaPosition, peremotka); peremotka.get_Duration(duration); - продолжительность видео peremotka.get_CurrentPosition(posit ion); - как я понял "покадровая" позиция сломал мозг в попытках отследить, когда у меня видео закончилось... BOBAH13, друг, спасай... |
04.09.2009, 23:18 | #7 |
Регистрация: 26.06.2009
Сообщений: 7
|
var d, p : int64;
duration, position : integer; .......... MyGraphBuilder.QueryInterface(IMedi aSeeking, FMediaSeeking); FMediaSeeking.GetDuration(d); duration := Cardinal(d div 10000); //дюрэйшн в миллисекундах FMediaSeeking.GetCurrentPosition(p) ; position := Cardinal(p div 10000); // текущее положение в миллисекундах duration показывает, position всегда 0 ...... |
05.09.2009, 07:34 | #8 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
В свое время делал так. Узнаеш при старте длину видео videoLen (в миллисекундах). Далее запоминаеш текущий тик - т.е. startAt = GetTickCount(). Ставиш таймер ну к примеру пусть тикает каждые 500 миллисекунд. В таймере проверяеш if(GetTickCount() - srartAt >= videoLen) то твое видео закончилось. Вроде работает думаю погрешность менее 500 миллисекунд большую роль не с играет
|
05.09.2009, 19:15 | #9 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Может там можно позицию в кадрах отслеживать, а не миллисекунды, и сравнивать позицию с общим кол-вом кадров?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
05.09.2009, 19:19 | #10 |
Регистрация: 26.06.2009
Сообщений: 7
|
BOBAH13, хитрец!!! Мозг ломал, а про такой способ даже не подумал....
БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!! |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перемотка (прокрутка) в плеере | NBSTUDIO | Мультимедиа в Delphi | 12 | 08.05.2009 18:37 |
перемотка в mp3 плеере | Mazaxaka | Мультимедиа в Delphi | 21 | 27.02.2009 01:09 |
незнаю с чего начать... а начать очень нужно | ОСЯНЯ | Помощь студентам | 2 | 26.11.2008 20:08 |
Перемотка в mP3 плеере | lionman | Мультимедиа в Delphi | 3 | 27.10.2008 21:21 |
Перемотка в TMediaPlayer | Kn793 | Компоненты Delphi | 0 | 10.07.2008 11:02 |