Форум: "Media";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Внизкак сделать прокрутку 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 вся ветка
Форум: "Media";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c