Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1107419687
beginnn
2005-02-03 11:34
2005.03.06
Кол-во записей в таблице??


14-1108101125
BoxTer
2005-02-11 08:52
2005.03.06
Исходники Windows 98


11-1090499233
raize
2004-07-22 16:27
2005.03.06
MessageDlg


4-1106054649
Tsio
2005-01-18 16:24
2005.03.06
Языковые ресурсы


1-1109016306
Wonderer
2005-02-21 23:05
2005.03.06
Товарищ Панов! Это что, не тема сообщения?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский