Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Video uzunluğu
#1
Merhaba;


VlcPlayer ile playlist yapıyorum.

VlcPlayer play durumundayken aynı zamanda open dialog ile başka videoların bilgilerini veritabanına alacağım.
Open dialog ile seçtiğim bir videonun uzunluğunu (süresi) nasıl alabilirim? Bu konuda çalışma yapan var mı?
Cevapla
#2
Open diolog ile bunu yapabileceğinizi sanmıyorum fakat emin de değilim.  Çünkü open dialog filename tipinde bir değer döndürür.  Olması gereken bence playliste atıp almanız gerekir. Normalde videonun uzunluğunu şöyle alabilirsiniz. Bir deneyin..

var
uzunluk :cardinal ;
begin
uzunluk := PasLibVlcPlayer1.GetVideoLenInMs; veya getvideolength tı sanırım.
end;
Cevapla
#3
(05-02-2019, Saat: 18:08)Yeliz Adlı Kullanıcıdan Alıntı: Merhaba;

VlcPlayer ile playlist yapıyorum.

VlcPlayer play durumundayken aynı zamanda open dialog ile başka videoların bilgilerini veritabanına alacağım.
Open dialog ile seçtiğim bir videonun uzunluğunu (süresi) nasıl alabilirim? Bu konuda çalışma yapan var mı?

Merhaba.

Video seçimi yaptınız diyelim, VLCPlayer'ın event'lerinden OnMediaPlayerLengthChanged olayında 
Var
 strSute : String;
begin
  strSure := PasLibVLCUnit.Time2Str( Time );
  // strSure dilediğiniz şekilde kullanın
end;

ile kullanıyorum ve çok memnunum.

- Şimdi siz de yineleyeceksiniz ki ben izlediğim videonun değil de başkasının süresini istiyorum. İmzamdaki mottomda bahsettiğim illüzyon burada devreye giriyor. Kullanıcı için değil de ikinci bir VLC player ile başlatın işi bitince stop edip kapatın gitsin. Wink


EK : Şimdi mevcut bir projeme örnek olsun diye ekleme yaptım...

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
 With TOpenDialog.Create(nil) do begin
   Try
     InitialDir  := ExtractFilePath(Application.ExeName);
     Filter      := 'Video Dosyaları|*.mp4;*.mpg;*.avi;*.mkv;*.mpeg|Tüm Dosyalar|*.*';
     FilterIndex := 1;
     if Execute then begin
       ShowMessage( xOnlineTV_Film_Helper.VideoSuresiniBul( FileName ) );
     end;
   Finally
     Free;
   End;
 end;
end;

var
 strSure : String; // Global

function TOnlineTV_Film_Helper.VideoSuresiniBul(strVideo: String): String;
Var
 KuklaVlcPlayer    : TPasLibVlcPlayer;
 KuklaVlcMediaList : TPasLibVlcMediaList;
 aPanel            : TPanel;
 aMedia            : libvlc_media_t_ptr;
begin
 KuklaVlcPlayer    := TPasLibVlcPlayer.Create(nil);
 KuklaVlcMediaList := TPasLibVlcMediaList.Create(nil);
 Result  := 'Hatalı Süre'; // Varsayılan

 aPanel         := TPanel.Create(nil);
 aPanel.Width   := 10;
 aPanel.Height  := 10;
 aPanel.Left    := -20;
 aPanel.Top     := -20; // ekranın dışında bir yerde...
 aPanel.Parent  := Application.MainForm;
 aPanel.Visible := True;

 with KuklaVlcPlayer do
 begin
   ParentWindow := aPanel.Handle;
   Align        := alClient;
   AudioOutput  := PasLibVlcClassUnit.aoDummy;
   OnMediaPlayerLengthChanged := KuklaVlcPlayer_MediaPlayerLengthChanged;
   KuklaVlcMediaList.Player   := KuklaVlcPlayer;
   KuklaVlcMediaList.Add( strVideo );
   aMedia := KuklaVlcMediaList.GetItemAtIndex(0);
   strSure := '';
   try
     KuklaVlcMediaList.PlayItem( aMedia );
     // Hata olursa finnaly ile çıkar.
     while strSure = '' do begin
       Sleep(100);
       Application.ProcessMessages;
     end;
     Result := strSure; // Hata olmazsa süre veya 00:00:00:00 şeklinde alınır RESULT döner...
   finally
     if KuklaVlcMediaList.IsPlay
       then KuklaVlcMediaList.Stop;
     if KuklaVlcPlayer.IsPlay
       then KuklaVlcPlayer.Stop;

     KuklaVlcMediaList.Clear;
     KuklaVlcMediaList.Free;

     KuklaVlcPlayer.Parent := nil;
     KuklaVlcPlayer.Free;
     aPanel.Free;
   end;
 end;
end;

procedure TOnlineTV_Film_Helper.KuklaVlcPlayer_MediaPlayerLengthChanged(Sender: TObject; time: Int64);
begin
 strSure := PasLibVlcUnit.Time2Str( time );
end;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#4
@mrmarman Teşekkür ederim tecrübelerinizle bize ışık tuttuğunuz için.

Fakat VLC play aktif değilken tüm süreleri alıyorum. VLC play durumunda iken süre alamıyorum ve program donuyor.
Cevapla
#5
Doğrudur, 

- Delphi IDE açık iken bir çok multimedia bileşeni böyle tepki verir. Özellikle harici bir kaynağa ihtiyaç duyulduğunda dizginleri elinden kaçırır. Dolayısıyla memory denetimi doğru çalışmıyor. 

- Denemelerinizi Delphi içinden değil de, şöyle yapın. Idea  Önce SHIFT+F9 şeklinde BUILD edip dışarıdan üretilen EXE'yi elle çalıştırın. Göreceksiniz ki çok seri bir şekilde iş görecektir.


giphy.gif
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#6
Hazır bileşenlerin çoğu sadece dosyanın boyutunu öğrenmek istediğin durumda görüntü kısımlarını da okuyup vakit kaybına neden olur.
En güzeli video sürelerini doğrudan dosyanın 'header' kısmını okuyarak öğrenmen.
Her video dosyasının başında 'binary' olarak yazar ama bunu yapabilmek için dosyaların formatını öğrenmen lazım.

Genellikle her dosya tipinin ilk 4 baytı dosyanın türünü belirtir.
Header kısmı ise çoğunlukla sonraki 4 baytta yazar.
Türüne göre bir record tipi oluşturup bu kısmı baytlar halinde topluca okuyup içine doldurursun.

TAviHeader = record
Boyut: integer;
...
end;
Cevapla
#7
(06-02-2019, Saat: 00:32)ssahinoglu Adlı Kullanıcıdan Alıntı: En güzeli video sürelerini doğrudan dosyanın 'header' kısmını okuyarak öğrenmen.
Her vdeo dosyasının başında 'binary' olarak yazar ama bunu yapabilmek için dosyaların formatını öğrenmen lazım.

Genellikle her dosya tipinin ilk 4 baytı dosyanın türünü belirtir.
Header kısmı ise çoğunlukla sonraki 4 baytta yazar.
Türüne göre bir record tipi oluşturup bu kısmı baytlar halinde topluca okuyup içine doldurursun.


TAviHeader = record
...
Boyut: integer;
...
end;


Merhaba.

- Uzun zamandır Video dosyaları üzerine çalışıyorum, Video Structure için sayısız kaynak bulabilirsiniz.. 

- Dosya türlerine göre söylediğiniz şey farklı çalışıyor maalesef. 

- Sizin bilginiz olduğu açık, başlığı okuyanlar için özetleyeyim MKV, MP4, MXF, AVI, MOV, vb. sayısız video formatı var ve  sacece dosya uzunlukları hakkında veri alabilirsiniz belki ama video uzunlukları için her bir video tipine özel olmak üzere ayrı ayrı HEADER okumayı bilmek gerekiyor. Her dosya tipinde farklı bir bilgi birikimi gerekiyor. 

- Dolayısı ile en makul yol ( özel bir amacınız yoksa veya destek verdiğiniz video dosya tipi sınırlı sayıda değilse ), bu gibi bazı UNIT'lerden faydalanarak tabiri caiz ise eşeğe semer takıp kullanmaktır.  Wink
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
Sayın @mrmarman;

Dediğiniz gibi SHIFT+F9 şeklinde BUILD edip dışarıdan EXE'yi çalıştırınca herhangi bir orun çıkmadı.

Allah gönlünüze göre versin.
Cevapla
#9
İzninizle Mrmarman üstadıma merak ettiğim birşey sormak istiyorum. Hocam dikkat ettimde vlc örneklerinizde  sürekli vlc bileşenini oluşturup kullanıyorsunuz. Form üzerine bileşeni eklemeden kullanmanızın bir sebebi var mı ? Bilmediğimiz bir avantajı var mı ? Mesela benim dikkat ettiğim, bileşeni form üzerine ekleyip play için url verirsem açılmıyor fakat sizin gibi create edip kullanırsam açılıyor.
Cevapla
#10
Bir kaç sebebi var, ikisini paylaşayım :

(1) Böyle blok kod sunmak, bir TForm üzerine şunu, şunu ve şunu koy, şu property'leri şuna eşitle vs. demekten daha kolay ki zaten forma bir bileşen koyduğunuzda kendiliğinden CREATE olan satır yazılmış gibi oluyor biliyorsunuz. 

- "VCL görsel ekleyince çalışmıyor" dediğiniz husus için, örneklemek için yazdığım kodla verdiğim ayarları bileşen üzerinde belki eksik yapılandırma olması ihtimalidir.  O da başka bir konu. Bunu denemeden değerlendiremiyorum.

(2) "Kodlama yaparken Class içerisinde bir tasarıma alışmak lazım" diye bir düşüncem var. Bu kişisel fikrin gerekçesi, ana koordinasyon kısımlarının sadeliğini, dolayısıyla kod okunurluğunu arttırdığını düşünüyorum. Bu şekildeki (runtime create vs.) dinamik bir kullanım class tipi veya unit fonksiyon/procedure vb. şeklinde bağlantılı kullanıma çok uygundur.

- Düşünsenize bir aşamaya geldiniz,  formu sil, başka form ekle orada yeni tasarım hazırla vs. durumlarda neleri atladığımızı hesaplayabilir misiniz ? Bu şekilde her şey yazılı belgeli ve önümüzde duruyor. Smile

Son söz olarak; 

- Bir projenin emekleme aşamasından release anına kadar geçen zaman diliminde çok fazla esnekliğe ihtiyaç duyuyoruz. Bu esneklik görsel bileşen kullanmak ile aslında köreltiyor. Bunun tersine RUNTIME'da oluşturmak ile dizginleri elde tuttuğumuza inanıyorum.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Uygulamanın ekranını video olarak kaydetme Altıner 1 617 07-04-2022, Saat: 11:06
Son Yorum: narkotik
  Streaming video Tevet 2 678 03-01-2022, Saat: 09:56
Son Yorum: Tevet
  video galeri yapmak hk. sadikacar60 5 3.219 19-02-2020, Saat: 14:14
Son Yorum: pro_imaj
  Video İşleme ? yhackup 7 4.902 19-12-2018, Saat: 18:27
Son Yorum: mrmarman
  Video stream yhackup 9 6.124 26-12-2017, Saat: 20:56
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi