Video süre

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Video süre

Mesaj gönderen brs »

Selam klasör içindeki bir videonun süresini nasıl alabilirim


http://r1311.hizliresim.com/1h/s/uuu6d.png
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Video süre

Mesaj gönderen mrmarman »

Merhaba...
- Dikkat edersen klasörde sadece AVI dosya boyutlarını gösterir. Başka tiplileri değil. Çünkü RIFF serisi dosya tipleri ( Wav, AVI vb. )Microsoft tarafından native (yerleşik) desteklenir.
- Ayrıca dosya bozuk ise bu bilgiyi de göremez olursun.

- Ben sana sadece bunlarla sınırlı kalmaman için kendi projemden derleyip çıkardığım örneği veriyorum. Bu Link ile indirip deneyebilirsin...

Fonksiyondan çoklu bilgi dönüşü için Type tanımı :

Kod: Tümünü seç

Type tAVIBilgileri = Record
  dAVISize     : double;
  strVidLength : string;
  strVidCodec  : string;
  dVidBitrate  : double;
  iVidWidth    : integer;
  iVidHeight   : integer;
  dFps         : double;

  dLengthSaniye: double;
  strAudCodec  : string;
  strAudBitrate: string;
end;
Kullanımı Vereyim :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  Bilgiler : tAVIBilgileri;
begin
  With TOpenDialog.Create(Nil) do
  begin
    Filter      := 'AVI Dosyaları *.AVI|*.AVI';
    FilterIndex := 1;
    if Execute then
    begin
      Bilgiler := AVIBilgileri( FileName );
      Memo1.Lines.Clear;
      Memo1.Lines.Add('AVI Genel Bilgileri');
      Memo1.Lines.Add('Dosya Adı    : ' + FileName);
      Memo1.lines.Add('Boyut        : ' + FormatFloat('#.## MB', Bilgiler.dAVISize));
      Memo1.Lines.Add('Uzunluk      : ' + Bilgiler.strVidLength);
      Memo1.Lines.Add('');
      Memo1.Lines.Add('AVI''nin VIDEO Bilgileri');
      Memo1.Lines.Add('AVI Codec    : ' + Bilgiler.strVidCodec);
      Memo1.Lines.Add('AVI Bitrate  : ' + FormatFloat('# Kbit/s', Bilgiler.dVidBitrate));
      Memo1.lines.Add('Width        : ' + IntToStr(Bilgiler.iVidWidth) + ' pixel');
      Memo1.lines.Add('Height       : ' + IntToStr(Bilgiler.iVidHeight) + ' pixel');
      Memo1.Lines.Add('FPS(kare/sn) : ' + FormatFloat('#.##', Bilgiler.dFps));
      Memo1.Lines.Add('');
      Memo1.Lines.Add('AVI''ni AUDIO Bilgileri');
      Memo1.Lines.Add('AUDIO Codec  : ' + Bilgiler.strAudCodec);
      Memo1.Lines.Add('AUDIO Bitrate: ' + Bilgiler.strAudBitrate);
    end;
    Free;
  end;
end;
Bu da Fonksiyon :

Kod: Tümünü seç

Function AVIBilgileri( strDosyaAdi : string ): tAVIBilgileri;
  Function SureHesapla( dFrameRate, dDuration : Double ) : String;
  Var
    FPS : Double;
    Sa, Dk, Sn, Fr   : Integer;
  begin
    Try
      Sa := 0;
      Dk := 0;
      Sn := 0;

      FPS := dFrameRate;
      Fr  := Trunc(dDuration * FPS); // Toplam Kare Sayısı

      if Fr > FPS then
      begin
        Sn := Trunc(Fr / FPS); // Tam bölünen kısmını aldık...
          Fr := Fr - Trunc( Sn * FPS );
      end;
      if Sn > 60 then
      begin
        Dk := Sn div 60; // Tam bölünen kısmını aldık...
          Sn := Sn - ( Dk * 60 );
      end;
      if Dk > 60 then
      begin
        Sa := Dk div 60; // Tam bölünen kısmını aldık...
           Dk := Dk - ( Sa * 60 );
      end;
      Result := Format( '%.2d:%.2d:%.2d,%d', [Sa, Dk, Sn, Trunc(Fr)]);
    Except
    End;
  end;
var
  iDosyaHandle   : Integer;
  iAviHeaderSize : integer;
  iVidHeaderSize : integer;
  iAviHeaderBas  : integer;
  iVidHeaderBas  : integer;
  iAudHeaderBas  : integer;
  iAudStreamSize : integer;

  strGeciciTest        : string[5];
  iGeciciSize          : Integer;
  strGeciciVcodec      : string[5];
  iGeciciAcodec        : integer;
  iGeciciMicrosec      : integer;
  iGeciciLengthInFrames: integer;
  iGeciciAchannels     : integer;
  iGeciciAsamplerate   : integer;
  iGeciciAbitrate      : integer;
begin
  ZeroMemory(@Result, Sizeof(Result));

  iDosyaHandle := FileOpen(strDosyaAdi, fmOpenRead);

  // AVI dosya kontrolü
  FileSeek(iDosyaHandle, 7, 0);
  FileRead(iDosyaHandle, strGeciciTest, 5);
  if copy(strGeciciTest, 0, 4) <> 'AVI ' then
  begin
    MessageDlg( '"' + strDosyaAdi + '" dosyası açılamadı. Geçerli bir AVI dosyası olmayabilir.', mtError, [mbOk], 0);
    Exit;
  end;

  // File dAVISize
  FileSeek(iDosyaHandle, 4, 0);
  FileRead(iDosyaHandle, iGeciciSize, 4);

  // Avi header dAVISize (AUDIO kısmını tespit etmek için kullanıcaz)
  FileSeek(iDosyaHandle, 28, 0);
  FileRead(iDosyaHandle, iAviHeaderSize, 4);

  // Avi header start    (VIDEO kısmını tespit etmek için kullanıcaz)
  iAviHeaderBas := 32;

  // Microseconds (1000000 / iGeciciMicrosec = dFps)
  FileSeek(iDosyaHandle, iAviHeaderBas, 0);
  FileRead(iDosyaHandle, iGeciciMicrosec, 4);

  // Kare sayısı olarak VIDEO'nun uzunluğu // strVidLength
  FileSeek(iDosyaHandle, iAviHeaderBas + 16, 0);
  FileRead(iDosyaHandle, iGeciciLengthInFrames, 4);

  // VIDEO Width
  FileSeek(iDosyaHandle, iAviHeaderBas + 32, 0);
  FileRead(iDosyaHandle, Result.iVidWidth, 4);

  // VIDEO Height
  FileSeek(iDosyaHandle, iAviHeaderBas + 36, 0);
  FileRead(iDosyaHandle, Result.iVidHeight, 4);

  FileSeek(iDosyaHandle, iAviHeaderBas + iAviHeaderSize + 4, 0);
  FileRead(iDosyaHandle, iVidHeaderSize, 4);

  iVidHeaderBas := iAviHeaderBas + iAviHeaderSize + 20;

  // VIDEO codec
  FileSeek(iDosyaHandle, iVidHeaderBas + 3, 0);
  FileRead(iDosyaHandle, strGeciciVcodec, 5);

  iAudHeaderBas := iVidHeaderBas + iVidHeaderSize + 8;

  FileSeek(iDosyaHandle, iAudHeaderBas - 4, 0);
  FileRead(iDosyaHandle, iAudStreamSize, 5);

  // AUDIO codec
  FileSeek(iDosyaHandle, iAudHeaderBas + iAudStreamSize + 8, 0);
  FileRead(iDosyaHandle, iGeciciAcodec, 2);

  // AUDIO channels (1 = mono, 2 = stereo)
  FileSeek(iDosyaHandle, iAudHeaderBas + iAudStreamSize + 10, 0);
  FileRead(iDosyaHandle, iGeciciAchannels, 2);

  // AUDIO samplerate
  FileSeek(iDosyaHandle, iAudHeaderBas + iAudStreamSize + 12, 0);
  FileRead(iDosyaHandle, iGeciciAsamplerate, 4);

  // AUDIO bitrate
  FileSeek(iDosyaHandle, iAudHeaderBas + iAudStreamSize + 16, 0);
  FileRead(iDosyaHandle, iGeciciAbitrate, 4);

  // Bitti...
  FileClose(iDosyaHandle);

  // VIDEO Codec Karşılıkları, bildiklerini daha sonra da ekleyebilirsin.
  Result.strVidCodec := copy(strGeciciVcodec, 0, 4);
  if Result.strVidCodec = 'div2' then
    Result.strVidCodec := 'MS MPEG4 v2'
  else if Result.strVidCodec = 'DIV2' then
    Result.strVidCodec := 'MS MPEG4 v2'
  else if Result.strVidCodec = 'div3' then
    Result.strVidCodec := 'DivX;-) MPEG4 v3'
  else if Result.strVidCodec = 'DIV3' then
    Result.strVidCodec := 'DivX;-) MPEG4 v3'
  else if Result.strVidCodec = 'div4' then
    Result.strVidCodec := 'DivX;-) MPEG4 v4'
  else if Result.strVidCodec = 'DIV4' then
    Result.strVidCodec := 'DivX;-) MPEG4 v4'
  else if Result.strVidCodec = 'div5' then
    Result.strVidCodec := 'DivX;-) MPEG4 v5'
  else if Result.strVidCodec = 'DIV5' then
    Result.strVidCodec := 'DivX;-) MPEG4 v5'
  else if Result.strVidCodec = 'divx' then
    Result.strVidCodec := 'DivX 4'
  else if Result.strVidCodec = 'mp43' then
    Result.strVidCodec := 'Microcrap MPEG4 v3';

  // AUDIO Codec Karşılıkları
  case iGeciciAcodec of
    0: Result.strAudCodec := 'PCM';
    1: Result.strAudCodec := 'PCM';
    85: Result.strAudCodec := 'MPEG Layer 3';
    353: Result.strAudCodec := 'DivX;-) Audio';
    8192: Result.strAudCodec := 'AC3-Digital';
  else
    Result.strAudCodec := 'Bilemedim (' + IntToStr(iGeciciAcodec) + ')';
  end;

  case (Trunc(iGeciciAbitrate / 1024 * 8)) of
    246..260: Result.strAudBitrate := '128 Kbit/s';
    216..228: Result.strAudBitrate := '128 Kbit/s';
    187..196: Result.strAudBitrate := '128 Kbit/s';
    156..164: Result.strAudBitrate := '128 Kbit/s';
    124..132: Result.strAudBitrate := '128 Kbit/s';
    108..116: Result.strAudBitrate := '128 Kbit/s';
    092..100: Result.strAudBitrate := '128 Kbit/s';
    060..068: Result.strAudBitrate := '128 Kbit/s';
  else
    Result.strAudBitrate := FormatFloat('# Kbit/s', iGeciciAbitrate / 1024 * 8);
  end;

  // Result için Hesaplamalar
  Result.dAVISize := iGeciciSize / 1024 / 1024;
  Result.dFps := 1000000 / iGeciciMicrosec; // dFps
  Result.dLengthSaniye := iGeciciLengthInFrames / Result.dFps; // strVidLength sn. cinsinden
  Result.strVidLength := SureHesapla( Result.dFps, Result.dLengthSaniye );
  Result.dVidBitrate := (iGeciciSize / Result.dLengthSaniye - iGeciciAbitrate) / 1024 * 8;
end;
Başarılar. :bravo:
Resim
Resim ....Resim
Cevapla