Video uzunluğu - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6) +--- Konu Başlığı: Video uzunluğu (/showthread.php?tid=3252) |
Video uzunluğu - Yeliz - 05-02-2019 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ı? Cvp: Video uzunluğu - CesuR - 05-02-2019 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; Cvp: Video uzunluğu - mrmarman - 05-02-2019 (05-02-2019, Saat: 18:08)Yeliz Adlı Kullanıcıdan Alıntı: Merhaba; 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. 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; Video uzunluğu - Yeliz - 05-02-2019 @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. Video uzunluğu - mrmarman - 06-02-2019 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. Ö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. Video uzunluğu - ssahinoglu - 06-02-2019 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; Cvp: Video uzunluğu - mrmarman - 06-02-2019 (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. 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. Video uzunluğu - Yeliz - 06-02-2019 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. Video uzunluğu - CesuR - 07-02-2019 İ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. Video uzunluğu - mrmarman - 07-02-2019 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. 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. |