Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

как сделать прокрутку avi файла?   Найти похожие ветки 

 
frEEstyler ©   (2004-11-13 21:55) [0]

я пишу программу просмотра DVD и AVI файлов сс помощью dspack"а.....
всё вроде сделал но незнаю как сделать прокрутку файла..
уважаемые Мастера подскажите пожалуйста!!!


 
programania ©   (2004-11-14 00:06) [1]

Посредством TrackBar:
в TForm1.TrackBar1Change
помечаю что, нужно изменить например ziPos:=true
иначе будет тормозить движок при ручном изменении
изменения запускаю в Timer1Timer:
if ziPos then begin ziPos:=false; posAvi(trackBar1.position) end;
где

PROCEDURE PosAvi(pos:integer);
var
CurrPos,stopPos : Int64;
MediaSeeking: IMediaSeeking;
hms:TDVDHMSFTimeCode;
DvdControl:IDvdControl2;
i:integer;
begin
with form1.FilterGraph1 do begin
if dvd then begin
// для DVD из IFO или VOB pos=милиСекунды
  i:=pos div 1000;
  hms.bHours:=i div 3600;
  hms.bMinutes:=(i-hms.bHours*3600)div 60;
  hms.bSeconds:= i-hms.bHours*3600-hms.bMinutes*60;
  QueryInterface(IDvdControl2, DvdControl);
  DvdControl.PlayAtTime(@hms,DVD_CMD_FLAG_None, DvdCmd);
  DvdControl := nil;
end
else begin
// для Avi pos=позиция trackbar1
  QueryInterface(IMediaSeeking, MediaSeeking);
  with MediaSeeking do Begin
    GetStopPosition(stopPos);
    CurrPos:=stopPos*pos div (trackBar1.max);

SetPositions(currPos,AM_SEEKING_AbsolutePositioning,stopPos,AM_SEEKING_NoPos
itioning);
  end;
end;
end
end;


trackBar1.max устанавливаю в число секунд в фильме*2
чтоб не очень часто менялась

Также в Timer1Timer при проигрывании
раз в сек получается текущая позиция фильма:

FUNCTION getPosAvi:int64;
var
MediaSeeking: IMediaSeeking;
begin
if dvd then result:=posDVD*1000 else begin
 form1.FilterGraph1.QueryInterface(IMediaSeeking, MediaSeeking);
 MediaSeeking.GetCurrentPosition(result);
 result:=result div 10000;
end;
end;
//posDVD получается так:
procedure TForm1.FilterGraph1DVDCurrentHMSFTime(sender: TObject;
 HMSFTimeCode: tagDVD_HMSF_TIMECODE; TimeCode: tagDVD_TIMECODE);
begin
with HMSFTimeCode do posDVD:=(bHours*3600+bMinutes*60+bSeconds);
end;

и устанавливается позиция TrackBar1, если не нажата мыщь
т.е человек сейчас не двигает TrackBar1,
в соответствии с позицией фильма
здесь надо пересчитывать текущую позицию фильма в позицию trackbar
а чтобы не действовало TrackBar1Change
помечаю переменную что изменяет программа и TrackBar1Change не обрабатываю.


 
KilkennyCat ©   (2004-11-14 00:49) [2]


> trackBar1.max устанавливаю в число секунд в фильме*2
> чтоб не очень часто менялась


я расчитываю исходя из длины таскбара в пикселах. ибо на полпиксела он не может изменится :)


 
frEEstyler ©   (2004-11-14 10:44) [3]

спасибо за процедуру......
вот ещё вопрос: Как определить длину фильма???


 
programania ©   (2004-11-15 02:30) [4]

>Как определить длину фильма???

FilterGraph1.RenderFile("film.avi");
dlina:=FilterGraph1.duration;
//Для DVD
var
i:IDvdInfo2;
pTotalTime: tDVDHMSFTimeCode;
ulTimeCodeFlags: ULONG;
begin
if form1.FilterGraph1.active then begin
form1.FilterGraph1.QueryInterface(IDvdInfo2,i);
i.GetTotalTitleTime(pTotalTime, ulTimeCodeFlags);
with pTotalTime do dlina:=bHours*3600+bMinutes*60+bSeconds;
end;
end;


>я расчитываю исходя из длины таскбара в пикселах. ибо на полпиксела он не может изменится :)
я тоже сделал типа этого примерно так:

if trackBar1.width * abs(newPosition-trackBar1.position) div trackBar1.max>=1 then trackBar1.position:=newPosition;


 
frEEstyler ©   (2004-11-15 17:09) [5]

>procedure TForm1.FilterGraph1DVDCurrentHMSFTime(sender: TObject;
HMSFTimeCode: tagDVD_HMSF_TIMECODE; TimeCode: tagDVD_TIMECODE);
begin
with HMSFTimeCode do posDVD:=(bHours*3600+bMinutes*60+bSeconds);
end;

у меня вопрос по этой процедуре....она не работает!!!!
вот так я её пытался использовать:

Label1.caption:=inttostr(bHours*3600+bMinutes*60+bSeconds);

я взял посмотрел в примере такая же процедура-работает,
почему у меня нет??
помогите плиз!!


 
programania ©   (2004-11-15 20:26) [6]

Попробуйте добавить после form1.FilterGraph1.Play;
form1.FilterGraph1.QueryInterface(IDVDControl2, DVDControl);
DVDControl.SetOption(DVD_NotifyParentalLevelChange,false);
DVDControl.SetOption(DVD_HMSF_TimeCodeEvents, true);


 
frEEstyler ©   (2004-11-16 16:23) [7]

>Как определить длину фильма???

FilterGraph1.RenderFile("film.avi");
dlina:=FilterGraph1.duration;
//Для DVD
var
i:IDvdInfo2;
pTotalTime: tDVDHMSFTimeCode;
ulTimeCodeFlags: ULONG;
begin
if form1.FilterGraph1.active then begin
form1.FilterGraph1.QueryInterface(IDvdInfo2,i);
i.GetTotalTitleTime(pTotalTime, ulTimeCodeFlags);
with pTotalTime do dlina:=bHours*3600+bMinutes*60+bSeconds;
end;
end;
использую эту процедуру для определения длины файла DVD...
но её результат неправильный..или она выдаёт результат не в секундах???т.е например длина фильма 6101 сек а эта процедура говорит что 783153!!!!
как такое может быть я не пойму...обьясните плиз!!!!


 
programania ©   (2004-11-16 20:48) [8]

Вот все что я еще нашел о DVD в своей программе
может чего этого у вас не хватает:
ulTimeCodeFlags:=DVD_CMD_FLAG_None;
i.GetTotalTitleTime(pTotalTime, ulTimeCodeFlags);
......
FilterGraph1.mode:=gmDVD;
FilterGraph1.RenderDvd(StatusDvd, "film.ifo",0);
FilterGraph1.Play;
FilterGraph1.QueryInterface(IDVDControl2, DVDControl);
DVDControl.SetOption(DVD_NotifyParentalLevelChange,false);
DVDControl.SetOption(DVD_HMSF_TimeCodeEvents, true);
DvdControl.playTitle(1,DVD_CMD_FLAG_None, DvdCmd);


 
frEEstyler ©   (2004-11-16 22:18) [9]

СПАСИБО!!!!!!
УРРЯЯЯЯЯ!!!!
ПОЛУЧИЛОСЬ!!!!!!!
СПАСИБО!!!!!!
СПАСИБО!!!!!!
СПАСИБО!!!!!!
СПАСИБО!!!!!!
ПРОСТО ВЫРУЧИЛИ!!!



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
14-1108577959
марсианин
2005-02-16 21:19
2005.03.06
Гостиница в Черноголовке


14-1108151528
Fin
2005-02-11 22:52
2005.03.06
Две звуковые карты.


14-1108113513
P.N.P.
2005-02-11 12:18
2005.03.06
Мир InterBase. 3-е издание


14-1108393372
Хинт
2005-02-14 18:02
2005.03.06
Адрес сайта


1-1109060352
Alex7
2005-02-22 11:19
2005.03.06
Поиск компонента с фокусом