Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Zamanı hesaplama (Saat)
#1
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.
Cevapla
#2
(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...
WWW
Cevapla
#3
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

guplouajuixjzfm15eqb.gif
Cevapla
#4
(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.


ll21zl5.png

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;
Cevapla
#5
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

guplouajuixjzfm15eqb.gif
Cevapla
#6
(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...
Cevapla
#7
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

guplouajuixjzfm15eqb.gif
Cevapla
#8
(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  Sad vakit bulduğunuzda yardımcı olursanız sevinirim. 
vaktiniz yoksa da canınız sağ olsun.
Cevapla
#9
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

guplouajuixjzfm15eqb.gif
Cevapla
#10
(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
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  saat biciminin algilanmasi 12 saat veya 24 saat sadikacar60 1 707 11-11-2024, Saat: 09:36
Son Yorum: hi_selamlar
  Resmi Tatil Hesaplama bydelphi 3 1.603 09-11-2022, Saat: 12:03
Son Yorum: bydelphi
  Dakika farkı hesaplama varyemez 1 1.441 05-05-2022, Saat: 09:57
Son Yorum: RAD Coder
  Tarih Farkı Hesaplama OZCANK 12 6.032 18-11-2021, Saat: 09:32
Son Yorum: COMMANDX
  TIdFtp Toplam Kullanılan Alan Hesaplama Hakkında Yardım glagher 7 3.084 07-11-2021, Saat: 16:02
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi