DSPack i aktualny nr. klatki

0

Napisałem prosty odtwarzacz multimedialny przy <ort>urzyciu </ort>pakiety DSPack.

Moje pytanie to jak wyciągnąć nr. ktualnie wyświetlanej klatki ?

0

a patrzales na liscie po .(kropce)
poszukaj czegos takiego jak currpos

ps. poprzegladaj demosy

0

To niestety nie działa. Ja też mam ten problem i CurrPos już wypróbowałem. Zwraca milisekundy, nie klatki. Będziemy wdzięczni za jakiś hint.
Pozdro
[browar]

0

To niestety nie działa. Ja też mam ten problem i CurrPos już wypróbowałem. Zwraca milisekundy, nie klatki. Będziemy wdzięczni za jakiś hint.
Pozdro
[browar]

Witam! Jako że swego czasu pisałem playera w oparciu o DsPack mogę napisać jak ja to zrobiłem...
Oto część kodu, którą ja mam w Timerze, zebym widział która klatka....

var
  CurrPos,StopPos : Int64;
  MediaSeeking: IMediaSeeking;
  CFrame, SFrame : Int64;
begin
     if FilterGraph.Active then 
      begin
           FilterGraph.QueryInterface(IMediaSeeking,MediaSeeking);
           with MediaSeeking do
           Begin
               GetCurrentPosition(CurrPos);
               CFrame:=round((Trunc(CurrPos / 10000))*{strtofloat(FPSInfo)}25*0.001); // tu trzeba wstawic FPS filmu...(teraz jest 25 - "na sztywno"  - zwraca obecną klatkę filmu
               GetStopPosition(stoppos);
               SFrame:=round((Trunc(StopPos / 10000))*{strtofloat(FPSInfo)}25*0.001); // zwraca ostatnią klatkę...

   frames.Caption:='{'+ floattostr(CFrame)+ '}' + '{'+ floattostr(SFrame) + '}';
   label1.Caption:=floattostr(CurrPos) + ' (' +floattostr(stoppos) + ')';
   end;
end;

Jakos tak..., dopasujcie sobie, pozdr. //Pepe

0

To nie do końca o to chodzi. Ja zrobiłem podobnie: znaczy wsadziłem na sztywno FPS, ale chciałbym jakoś tę informację z avika wyjąć, żeby dziaało dla każdego pliku, a nie tylko przy 25 FPS.

0

To nie do końca o to chodzi. Ja zrobiłem podobnie: znaczy wsadziłem na sztywno FPS, ale chciałbym jakoś tę informację z avika wyjąć, żeby dziaało dla każdego pliku, a nie tylko przy 25 FPS.

No, oczywiscie, bez podanego dynamicznie fps'u w zaleznosci od ladowanego filmu player jest cokolwiek ort!... Ja polecam ten adres: http://yaai.sourceforge.net/

Obadaj sobie jak oni to zrobili...
Jest tez w serwisie rprogrammers pare unitow, ktore <ort>pokazujo </ort>jak <ort>wyciognoc </ort>fps, wiec nie ma problemu...
Do kodu ktory wpisalem powyzej wystarczy tylko w miejsce "25" wpisac te wartosc, <ort>uzyskano </ort>z tych modulow..
Pozdr

0
klatka:=round(currpos / 417039);

:d

a zeby pobrac FPS filmu korzystamy z getrate ;)

0

Jak przewinąć film do określonej klatki?

0

najprosciej to wladowac dstrackbar i polaczyc z filtergraph :)
i przesuwac owy dstrackbar :)

0
klatka:=round(currpos / 417039);

:d

a zeby pobrac FPS filmu korzystamy z getrate ;)

Sprawdzam u siebie, sprawdzam i z funkcji GetRate cały czas otrzymuje 1...
Moglbys napisac jak te funkcje sie stosuje?

ja dalem:

 var
  rate : double

GetRate(rate);
label1.caption:=Floatostr(rate);

I caly czas zwraca mi jeden... co robie zatem zle?
Pozdr

0

1 = 23.976 frames/sec
2 = 24
3 = 25
4 = 29.97
5 = 30
6 = 50
7 = 59.94
8 = 60

na pewno dla MPG i prawdopodobnie tezm dla AVI

0

1 = 23.976 frames/sec
2 = 24
3 = 25
4 = 29.97
5 = 30
6 = 50
7 = 59.94
8 = 60

na pewno dla MPG i prawdopodobnie tezm dla AVI

Czesc. Sprawdzilem. Dla avi niestety nie działa. Sprawdzilem z fps'ami 24, 23.976 oraz 25(SubeditPlayer). W kazdym z tych przypadków funkcja zwrocila wynik 1...
Wiec nie jest to dobra metoda...
Pozdr

0

w ktorym module jest getrate?

0

w ktorym module jest getrate?

unit DirectShow9;

0

Dzieki. Sprawdze

0

klatka:=round(currpos / 417039);

Czy ten kod działa niezależnie od fps filmu? Czy tylko dla 25klatek/s

0

pewnie tylko dla okreslonej ilosci klatek :) to chyba oczywiste :)

klatka:=Trunc(CurrPos/10000000*framerate);

a framerate pobrac mozesz tym:

//fps ---------------------------------------------------------------------
Function FindFilterByCLSID(FiltCLSID : TGUID; var dsGraph : IGraphBuilder) : IBaseFilter;
var
 dsFilterEnum   : IEnumFilters;
 EnumCLSID      : TGUID;
begin
 If Assigned(dsGraph) then If dsGraph.EnumFilters(dsFilterEnum) = S_OK then
 Begin
   While dsFilterEnum.Next(1,Result,nil) = S_OK do
   Begin
     Result.GetClassID(EnumCLSID);
     If IsEqualGUID(FiltCLSID,EnumCLSID) then Break else Result := nil;
   End;
   dsFilterEnum := nil;
 End;
end;

Function GetFPS(): Integer;
var
dsQualProp : IQualProp;
dsRenderer : IBaseFilter;
myGraph: IGraphBuilder;
FPS: integer;
begin
result := 0;
MyGraph := (FilterGraph as IGraphBuilder);
dsRenderer := FindFilterByCLSID(CLSID_OverlayMixer, MyGraph);
If dsRenderer <> nil then dsRenderer.QueryInterface(IID_IQualProp,dsQualProp);
dsQualProp.get_AvgFrameRate(FPS);
If FPS > 0 then result := FPS;
dsRenderer := FindFilterByCLSID(CLSID_OverlayMixer2, MyGraph);
If dsRenderer <> nil then dsRenderer.QueryInterface(IID_IQualProp,dsQualProp);
dsQualProp.get_AvgFrameRate(FPS);
If FPS > 0 then result := FPS;
dsRenderer := FindFilterByCLSID(CLSID_VideoRenderer, MyGraph);
If dsRenderer <> nil then dsRenderer.QueryInterface(IID_IQualProp,dsQualProp);
dsQualProp.get_AvgFrameRate(FPS);
If FPS > 0 then result := FPS;
end;
//koniec fps --------------------------------------------------------------
0

[soczek]

pepe napisał(a)

w ktorym module jest getrate?

unit DirectShow9;

0
procedure TForm1.Pobierz_FPS;
var
  F     : File;
  Scale : Integer;
  Rate  : Integer;
  S     : String;
begin
  AssignFile(F,OpenDialog1.FileName);
  {$I-}
  Reset(F,1);
  {$I+}
  If IOResult = 0 then
  Begin
    Seek(F,128);
    BlockRead(F,Scale,4);
    BlockRead(F,Rate,4);
    CloseFile(F);
    Str((Rate / Scale):0:4,S);
    while (S[Length(S)] = '0') and (Length(S) > 1) and (S[Length(S)-1] <> '.') do
    Delete(S,Length(S),1);
    Label1.Caption:= S;
    //NewFrameRate.Text := S;
    end;
end;

MediaSeeking.SetTimeFormat(TIME_FORMAT_FRAME); nie wiem czy o to ci chodziło

1 użytkowników online, w tym zalogowanych: 0, gości: 1