Napisałem prosty odtwarzacz multimedialny przy <ort>urzyciu </ort>pakiety DSPack.
Moje pytanie to jak wyciągnąć nr. ktualnie wyświetlanej klatki ?
Napisałem prosty odtwarzacz multimedialny przy <ort>urzyciu </ort>pakiety DSPack.
Moje pytanie to jak wyciągnąć nr. ktualnie wyświetlanej klatki ?
a patrzales na liscie po .(kropce)
poszukaj czegos takiego jak currpos
ps. poprzegladaj demosy
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]
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
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.
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
klatka:=round(currpos / 417039);
:d
a zeby pobrac FPS filmu korzystamy z getrate
;)
Jak przewinąć film do określonej klatki?
najprosciej to wladowac dstrackbar i polaczyc z filtergraph :)
i przesuwac owy dstrackbar :)
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
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
1 = 23.976 frames/sec
2 = 24
3 = 25
4 = 29.97
5 = 30
6 = 50
7 = 59.94
8 = 60na 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
w ktorym module jest getrate?
w ktorym module jest getrate?
unit DirectShow9;
Dzieki. Sprawdze
klatka:=round(currpos / 417039);
Czy ten kod działa niezależnie od fps filmu? Czy tylko dla 25klatek/s
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 --------------------------------------------------------------
[soczek]
pepe napisał(a)
w ktorym module jest getrate?
unit DirectShow9;
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