Як зробити прокручування avi файлу
За допомогою 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 з формою1. миліСекунди 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); з 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 з HMSFTimeCodedo posDVD:=(bHours*3600+bMinutes*60+bSeconds); end; і встановлюється позиція TrackBar1, якщо не натиснута мища тобто людина зараз не рухає TrackBar1, відповідно до позиції фільму тут треба перераховувати поточну позицію фільму в позицію trackbar а щоб не діяло TrackBar1Change позначаю змінну, що змінює програма і TrackBar1Change не обробляю.
> trackBar1.max встановлюю число секунд у фільмі*2 > щоб не дуже часто змінювалася
я розраховую виходячи з довжини таскбара в пікселах. бо на півпіксела він не може зміниться :)
дякую за процедуру. ось ще питання: Як визначити довжину фільму.
>Як визначити довжину фільму. FilterGraph1.RenderFile("film.avi"); dlina:=FilterGraph1.duration; //Для DVD var i:IDvdInfo2; pTotalTime: tDVDHMSFTimeCode; ulTimeCodeFlags: ULONG; begin якщо form1.FilterGraph1.active then begin form1.FilterGraph1.QueryInterface(IDvdInfo2,i); i.GetTotalTitleTime(TotalTitleTime(To) з pTotalTime до dlina:=bHours*3600+bMinutes*60+bSeconds; end; end;
я розраховую виходячи з довжини таскбара в пікселах. бо на півпіксела він не може зміниться :) я теж зробив типу цього приблизно так: if trackBar1.width * abs(newPosition-trackBar1.position) div trackBar1.max>=1 :=newPosition;
>procedure TForm1.FilterGraph1DVDCurrentHMSFTime(sender: TObject; HMSFTimeCode: tagDVD_HMSF_TIMECODE; TimeCode: tagDVD_TIMECODE); begin з 0мм+0>end;
у мене питання щодо цієї процедури. вона не працює. Ось так я її намагався використати:
я взяв подивився в прикладі така ж процедура-працює, чому у менені?? допоможіть плиз!!
Спробуйте додати після form1.FilterGraph1.Play; form1.FilterGraph1.QueryInterface(IDVDControl2, DVDControl); DVDControl.SetOption(DVD_NotifyParentalLevelChange,false); DVDControl.SetOption(DVD_HMSF_TimeCodeEvent)
>Як визначити довжину фільму.
FilterGraph1.RenderFile("film.avi"); dlina:=FilterGraph1.duration; //Для DVD var i: IDvdInfo2; : ULONG; begin if form1.FilterGraph1.active then begin form1.FilterGraph1.QueryInterface(IDvdInfo2,i); i.GetTotalTitleTime(pTotalTime, ulTimeCodeFlags); th dlina:=bHours*3600+bMinutes*60+bSeconds; end; end; використовую цю процедуру для визначення довжини файлу DVD. але її результат неправильний..або вона видає результат не в секундах. тобто наприклад довжина фільму 6101 секунд а ця процедура говорить що 783153. Як таке може бути я не зрозумію. Поясніть пліз.
Ось все, що я ще знайшов про 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);
ДЯКУЄМО. УРРЯЯЯЯ. Вийшло. ДЯКУЄ. ДЯКУЄ. ДЯКУЄ. ДЯКУЄ. ПРОСТО ВИРУЧИЛИ.