Yorumları: 26
Konuları: 8
Kayıt Tarihi: 11-05-2024
Aktif Kullandığınız Delphi Sürümü:
- Delphi 12
- Delphi 11
- Delphi 10.4
Rep Puanı: 7 Başlangıç
20-07-2024, Saat: 23:30
(Son Düzenleme: 20-07-2024, Saat: 23:31, Düzenleyen: Kral.)
Merhaba,
Normal şartlarda saat hesaplama yönteminde 02:00:00'dan, 01:00:00 çıkınca kalan sonuç 01:00:00 bu işlem için aşağıdaki kodu kullanıyorum.
LabelDuration.Text := TimeToStr(StrToTime(EditIn.Text) - StrToTime(EditOut.Text));
İşin içine freme girince bunu nasıl yaparım 02:00:00:24'den, 01:00:00:12 çıkınca 01:00:00:12 sonucu nasıl alabilirim?
Şimdi den yardımcı olanlara teşekkür ederim.
Yorumları: 1.504
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.318 Üstad
(20-07-2024, Saat: 23:30)Kral Adlı Kullanıcıdan Alıntı: Merhaba,
Normal şartlarda saat hesaplama yönteminde 02:00:00'dan, 01:00:00 çıkınca kalan sonuç 01:00:00 bu işlem için aşağıdaki kodu kullanıyorum.
LabelDuration.Text := TimeToStr(StrToTime(EditIn.Text) - StrToTime(EditOut.Text));
İşin içine freme girince bunu nasıl yaparım 02:00:00:24'den, 01:00:00:12 çıkınca 01:00:00:12 sonucu nasıl alabilirim?
Şimdi den yardımcı olanlara teşekkür ederim.
Aşağıdaki gibi bir kod kullanabilirsiniz:
uses
System.DateUtils,
System.TimeSpan;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ATime1,
ATime2 : TTime;
AMilliSecond1,
AMilliSecond2 : Integer;
ATimeSpan : TTimeSpan;
AValue : String;
begin
ATime1 := EncodeTime(02, 00, 00, 24);
ATime2 := EncodeTime(01, 00, 00, 12);
AMilliSecond1 := TimeToMilliseconds(ATime1);
AMilliSecond2 := TimeToMilliseconds(ATime2);
ATimeSpan := TTimeSpan.FromMilliseconds( Abs(AMilliSecond1 - AMilliSecond2) );
AValue := Format(
'%.2d:%.2d:%.2d:%.2d%',
[
ATimeSpan.Hours,
ATimeSpan.Minutes,
ATimeSpan.Seconds,
ATimeSpan.Milliseconds
]
);
ShowMessage('Fark:' + AValue);
end;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 1.902
Konuları: 23
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 21.290 Üstad
21-07-2024, Saat: 09:23
(Son Düzenleme: 21-07-2024, Saat: 09:25, Düzenleyen: mrmarman.)
Bir yayın kuruluşu çalışanı olarak bildireyim.
Video kare numarası PAL yayın sistemleri için 00 .. 24 = 25 kare ve NTSC yayın sistemleri için 00..23 = 24 kare olduğu dikkate alınarak değerlendirildiğini not edelim.
@ Tuğrul HELVACI milisaniye nasıl devreye alınır bildirmiş. Ek olarak;
Kare sayısının milisaniye hanesinde yer alması mümkün. 25 veya 24 milisaniye gibi görüntü verir ancak altyazı senkronu vb işlemlerlerde toplamlarda tutarsızlık oluşur. Çünkü yayın sistemine göre her 24 veya 25 karede saniye hanesine 1 eklenmelidir ve frame sıfırlanmalıdır.Akışa bırakılırsa 1000 kareye kadar aynı saniye değişmeden kalacaktır.
Nihai çözüm, zamanı kare cinsine çevirip toplam fark ne varsa işlem sonunda mod ve div ile TimeCode geri dönüşümü yapmak olacaktır.
Fonksiyon dayanak noktası parametre FPS değeri olmalıdır. Kare / saniye. Bunu unutmadan ekleyelim.
Saygılarımla
Muharrem ARMAN
Yorumları: 26
Konuları: 8
Kayıt Tarihi: 11-05-2024
Aktif Kullandığınız Delphi Sürümü:
- Delphi 12
- Delphi 11
- Delphi 10.4
Rep Puanı: 7 Başlangıç
21-07-2024, Saat: 10:32
(Son Düzenleme: 21-07-2024, Saat: 10:33, Düzenleyen: Kral.)
(21-07-2024, Saat: 00:36)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: (20-07-2024, Saat: 23:30)Kral Adlı Kullanıcıdan Alıntı: Merhaba,
Normal şartlarda saat hesaplama yönteminde 02:00:00'dan, 01:00:00 çıkınca kalan sonuç 01:00:00 bu işlem için aşağıdaki kodu kullanıyorum.
LabelDuration.Text := TimeToStr(StrToTime(EditIn.Text) - StrToTime(EditOut.Text));
İşin içine freme girince bunu nasıl yaparım 02:00:00:24'den, 01:00:00:12 çıkınca 01:00:00:12 sonucu nasıl alabilirim?
Şimdi den yardımcı olanlara teşekkür ederim.
Aşağıdaki gibi bir kod kullanabilirsiniz:
uses
System.DateUtils,
System.TimeSpan;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ATime1,
ATime2 : TTime;
AMilliSecond1,
AMilliSecond2 : Integer;
ATimeSpan : TTimeSpan;
AValue : String;
begin
ATime1 := EncodeTime(02, 00, 00, 24);
ATime2 := EncodeTime(01, 00, 00, 12);
AMilliSecond1 := TimeToMilliseconds(ATime1);
AMilliSecond2 := TimeToMilliseconds(ATime2);
ATimeSpan := TTimeSpan.FromMilliseconds( Abs(AMilliSecond1 - AMilliSecond2) );
AValue := Format(
'%.2d:%.2d:%.2d:%.2d%',
[
ATimeSpan.Hours,
ATimeSpan.Minutes,
ATimeSpan.Seconds,
ATimeSpan.Milliseconds
]
);
ShowMessage('Fark:' + AValue);
end;
Hocam Kodları kendime göre düzenledim ancak giriş 01:00:00:14 çıkış 02:00:00:13 olunca yani kare alanı büyük olunca doğru sonucu alamadım.
Bu sorunu nasıl çözerim?
procedure TMainForm.Button1Click(Sender: TObject);
var
AValue: String;
ATimeSpan: TTimeSpan;
ATime1, ATime2: TTime;
AMilliSecond1, AMilliSecond2: Integer;
HourI, MinuteI, SecondI, SquareI: Word;
HourO, MinuteO, SecondO, SquareO: Word;
begin
HourI := StrToInt(Copy(Edit1.Text, 1, 2));
MinuteI := StrToInt(Copy(Edit1.Text, 4, 2));
SecondI := StrToInt(Copy(Edit1.Text, 7, 2));
SquareI := StrToInt(Copy(Edit1.Text, 10, 2));
//
HourO := StrToInt(Copy(Edit2.Text, 1, 2));
MinuteO := StrToInt(Copy(Edit2.Text, 4, 2));
SecondO := StrToInt(Copy(Edit2.Text, 7, 2));
SquareO := StrToInt(Copy(Edit2.Text, 10, 2));
//
ATime1 := EncodeTime(HourI, MinuteI, SecondI, SquareI);
ATime2 := EncodeTime(HourO, MinuteO, SecondO, SquareO);
//
AMilliSecond1 := TimeToMilliseconds(ATime1);
AMilliSecond2 := TimeToMilliseconds(ATime2);
ATimeSpan := TTimeSpan.FromMilliseconds(Abs(AMilliSecond1 - AMilliSecond2));
AValue := Format('%.2d:%.2d:%.2d:%.2d%', [ATimeSpan.Hours, ATimeSpan.Minutes, ATimeSpan.Seconds, ATimeSpan.Milliseconds]);
Showmessage('Fark:' + AValue);
end;
Yorumları: 1.902
Konuları: 23
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 21.290 Üstad
21-07-2024, Saat: 11:13
(Son Düzenleme: 21-07-2024, Saat: 11:17, Düzenleyen: mrmarman.)
Doğru cevap 00:59:59.24 olmalıydı...
Mesajımda bahsettiğim durum budur. Formül ne olursa olsun içerisinde FPS değeri mutlaka bulunmalı. Yoksa 25.0 FPS için doğru olan 24.0, 23.976, 29.970 vb. FPS için yine hatalı çıkacaktır.
Çözüm bulamazsanız DivXTurk projemden ilgili fonksiyonları burada sizinle paylaşırım. Arşiv yakınımda değil.
Saygılarımla
Muharrem ARMAN
Yorumları: 26
Konuları: 8
Kayıt Tarihi: 11-05-2024
Aktif Kullandığınız Delphi Sürümü:
- Delphi 12
- Delphi 11
- Delphi 10.4
Rep Puanı: 7 Başlangıç
(21-07-2024, Saat: 11:13)mrmarman Adlı Kullanıcıdan Alıntı: Doğru cevap 00:59:59.24 olmalıydı...
Mesajımda bahsettiğim durum budur. Formül ne olursa olsun içerisinde FPS değeri mutlaka bulunmalı. Yoksa 25.0 FPS için doğru olan 24.0, 23.976, 29.970 vb. FPS için yine hatalı çıkacaktır.
Çözüm bulamazsanız DivXTurk projemden ilgili fonksiyonları burada sizinle paylaşırım. Arşiv yakınımda değil.
Evet hocam sorunu halen çözemedim, yardımlarınızı rica ederim.
Saygılarımla...
Yorumları: 1.902
Konuları: 23
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 21.290 Üstad
21-07-2024, Saat: 11:41
(Son Düzenleme: 21-07-2024, Saat: 11:42, Düzenleyen: mrmarman.)
Telefondan yazıyorum, o nedenle çözümü hızlandırma maksatlı yazayım zor bişey değil;
Bir fonksiyon yazın
saat hanesini 60*60*aFps çarpsın
dakika hanesini 60*aFps çarpsın
saniye hanesini aFps ile çarpsın
tümünü toplayın oldu size Frame Sayısı
iki timecode için de aynısını yapınca iki farklı Frame Sayısı elde edersiniz, farkını alın kaç kare çıktıysa bu formülün tersini uygulayın
Saygılarımla
Muharrem ARMAN
Yorumları: 26
Konuları: 8
Kayıt Tarihi: 11-05-2024
Aktif Kullandığınız Delphi Sürümü:
- Delphi 12
- Delphi 11
- Delphi 10.4
Rep Puanı: 7 Başlangıç
(21-07-2024, Saat: 11:41)mrmarman Adlı Kullanıcıdan Alıntı: Telefondan yazıyorum, o nedenle çözümü hızlandırma maksatlı yazayım zor bişey değil;
Bir fonksiyon yazın
saat hanesini 60*60*aFps çarpsın
dakika hanesini 60*aFps çarpsın
saniye hanesini aFps ile çarpsın
tümünü toplayın oldu size Frame Sayısı
iki timecode için de aynısını yapınca iki farklı Frame Sayısı elde edersiniz, farkını alın kaç kare çıktıysa bu formülün tersini uygulayın
Hocam çok teşekkür ederim, bu fonksiyon aşar  vakit bulduğunuzda yardımcı olursanız sevinirim.
vaktiniz yoksa da canınız sağ olsun.
Yorumları: 1.902
Konuları: 23
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 21.290 Üstad
Aramaktansa yeniden yazmak daha kolay geldi. Kolları sıvadım size üç tane birbiri ile ilişkili fonksiyon hazırladım.
Dönüşüm fonksiyonlarında FPS değeri girmezseniz (özgürlük için bir varsayılan atadım) varsayılan olarak 25.0 FPS (PAL sistemi) kabul edilir.
type tTimeCode = record
H, M, S, F : Integer;
end;
function StrToTimeCode( aTC : string ): tTimeCode;
var
LSL : TStringList;
begin
result := default(tTimeCode);
LSL := TStringList.Create;
try
LSL.Delimiter := ':';
LSL.DelimitedText := aTC;
while LSL.Count < 4
do
LSL.Add('00');
with result do
begin
H := StrToInt(LSL[0]);
M := StrToInt(LSL[1]);
S := StrToInt(LSL[2]);
F := StrToInt(LSL[3]);
end;
finally
FreeAndNil(LSL);
end;
end;
function TimeCodeToFrame( aTC: tTimeCode; aFPS: Double = 25.0 ): Double;
begin
result := 0
+ aTC.H*60*60*aFPS
+ aTC.M*60*aFPS
+ aTC.S*aFPS
+ aTC.F;
end;
function FrameToTimeCode( aFrame: Double; aFPS: Double = 25.0 ): tTimeCode;
begin
result := Default(tTimeCode);
if aFrame > 0 then
begin
result.H := trunc(aFrame / aFps / 60 / 60 );
aFrame := aFrame - (result.H * 60 * 60 * aFPS);
result.M := trunc(aFrame / aFps / 60 );
aFrame := aFrame - (result.M * 60 * aFPS);
result.S := trunc(aFrame / aFps );
aFrame := aFrame - (result.S * aFPS);
result.F := Round(aFrame);
end;
end;
Kullanım Örneği için boş bir projede Forma bir tane MEMO ve BUTTON ekleyip aşağıdaki il deneyin
procedure TForm1.BitBtn1Click(Sender: TObject);
var
LTC_01 : tTimeCode;
LTC_02 : tTimeCode;
LFr_01 : double;
LFr_02 : double;
begin
LTC_01 := StrToTimeCode('01:00:00:14');
LTC_02 := StrToTimeCode('02:00:00:13');
LFr_01 := TimeCodeToFrame(LTC_01);
LFr_02 := TimeCodeToFrame(LTC_02);
With LTC_01 do
Memo1.Lines.Add( 'IN.: ' + format('%.2d:%.2d:%.2d:%.2d', [H,M,S,F]) );
Memo1.Lines.Add( 'IN. Frame(s): ' + format('%0.2f', [ LFr_01 ]) );
With LTC_02 do
Memo1.Lines.Add( 'OUT: ' + format('%.2d:%.2d:%.2d:%.2d', [H,M,S,F]) );
Memo1.Lines.Add( 'OUT Frame(s): ' + format('%0.2f', [ LFr_02 ]) );
With FrameToTimeCode(LFr_02 - LFr_01) do
Memo1.Lines.Add( 'Duration : ' + format('%.2d:%.2d:%.2d:%.2d', [H,M,S,F]) );
Memo1.Lines.Add( 'Duration Frame(s): ' + format('%0.2f', [ LFr_02 - LFr_01 ] ) );
end;
Sonuç şu değerler ile oluşacaktır :
IN.: 01:00:00:14
IN. Frame(s): 90014,00
OUT: 02:00:00:13
OUT Frame(s): 180013,00
Duration : 00:59:59:24
Duration Frame(s): 89999,00
Saygılarımla
Muharrem ARMAN
Yorumları: 26
Konuları: 8
Kayıt Tarihi: 11-05-2024
Aktif Kullandığınız Delphi Sürümü:
- Delphi 12
- Delphi 11
- Delphi 10.4
Rep Puanı: 7 Başlangıç
(21-07-2024, Saat: 12:23)mrmarman Adlı Kullanıcıdan Alıntı: Aramaktansa yeniden yazmak daha kolay geldi. Kolları sıvadım size üç tane birbiri ile ilişkili fonksiyon hazırladım.
Dönüşüm fonksiyonlarında FPS değeri girmezseniz (özgürlük için bir varsayılan atadım) varsayılan olarak 25.0 FPS (PAL sistemi) kabul edilir.
type tTimeCode = record
H, M, S, F : Integer;
end;
function StrToTimeCode( aTC : string ): tTimeCode;
var
LSL : TStringList;
begin
result := default(tTimeCode);
LSL := TStringList.Create;
try
LSL.Delimiter := ':';
LSL.DelimitedText := aTC;
while LSL.Count < 4
do
LSL.Add('00');
with result do
begin
H := StrToInt(LSL[0]);
M := StrToInt(LSL[1]);
S := StrToInt(LSL[2]);
F := StrToInt(LSL[3]);
end;
finally
FreeAndNil(LSL);
end;
end;
function TimeCodeToFrame( aTC: tTimeCode; aFPS: Double = 25.0 ): Double;
begin
result := 0
+ aTC.H*60*60*aFPS
+ aTC.M*60*aFPS
+ aTC.S*aFPS
+ aTC.F;
end;
function FrameToTimeCode( aFrame: Double; aFPS: Double = 25.0 ): tTimeCode;
begin
result := Default(tTimeCode);
if aFrame > 0 then
begin
result.H := trunc(aFrame / aFps / 60 / 60 );
aFrame := aFrame - (result.H * 60 * 60 * aFPS);
result.M := trunc(aFrame / aFps / 60 );
aFrame := aFrame - (result.M * 60 * aFPS);
result.S := trunc(aFrame / aFps );
aFrame := aFrame - (result.S * aFPS);
result.F := Round(aFrame);
end;
end;
Kullanım Örneği için boş bir projede Forma bir tane MEMO ve BUTTON ekleyip aşağıdaki il deneyin
procedure TForm1.BitBtn1Click(Sender: TObject);
var
LTC_01 : tTimeCode;
LTC_02 : tTimeCode;
LFr_01 : double;
LFr_02 : double;
begin
LTC_01 := StrToTimeCode('01:00:00:14');
LTC_02 := StrToTimeCode('02:00:00:13');
LFr_01 := TimeCodeToFrame(LTC_01);
LFr_02 := TimeCodeToFrame(LTC_02);
With LTC_01 do
Memo1.Lines.Add( 'IN.: ' + format('%.2d:%.2d:%.2d:%.2d', [H,M,S,F]) );
Memo1.Lines.Add( 'IN. Frame(s): ' + format('%0.2f', [ LFr_01 ]) );
With LTC_02 do
Memo1.Lines.Add( 'OUT: ' + format('%.2d:%.2d:%.2d:%.2d', [H,M,S,F]) );
Memo1.Lines.Add( 'OUT Frame(s): ' + format('%0.2f', [ LFr_02 ]) );
With FrameToTimeCode(LFr_02 - LFr_01) do
Memo1.Lines.Add( 'Duration : ' + format('%.2d:%.2d:%.2d:%.2d', [H,M,S,F]) );
Memo1.Lines.Add( 'Duration Frame(s): ' + format('%0.2f', [ LFr_02 - LFr_01 ] ) );
end;
Sonuç şu değerler ile oluşacaktır :
IN.: 01:00:00:14
IN. Frame(s): 90014,00
OUT: 02:00:00:13
OUT Frame(s): 180013,00
Duration : 00:59:59:24
Duration Frame(s): 89999,00
Çok, çok teşekkür ederim saygılarımla @ mrmarman
|