Entwickler-Ecke

Multimedia / Grafik - Wechseln zwischen MP4s dauert >25sec


Tendl - Mo 09.11.15 12:20
Titel: Wechseln zwischen MP4s dauert >25sec
Ich verwende PasLibVLC um für Videos aus einer größeren Sammlung z.B Playtime und Auflösung zu ermitteln.

Dabei ist mir aufgefallen das bei einem Wechsel von MP4 zu MP4 eine Verzögerungszeit von 25s auftritt, zwischen anderen Videodateitype, auch von *.wmv zu *mp4 beträgt die Umschaltzeit gerade mal 2 sec.

Ich bin mit DELPHi7 unterwegs, ich glaube aber nicht das hier die Ursache zu suchen ist.

Weiß jemand Rat oder hat einen Tip für mich?

Vielen Dank bereits im Voraus
Thomas


Sorry ich war zunächst im falschen Forum unterwegs.


SMO - Mo 09.11.15 13:37

Ich kenne PasLibVLC nicht. Du könntest als Alternative mal MediaInfo [https://mediaarea.net/de/MediaInfo] ausprobieren. Im Quelltextpaket [https://mediaarea.net/de/MediaInfo/Download/Source] gibt es eine Delphi Unit für die DLL (MediaInfoLib\Source\MediaInfoDLL\MediaInfoDLL.pas) sowie ein kleines Beispielprojekt (MediaInfoLib\Project\Delphi\Example\).


Tendl - Mo 09.11.15 14:54

Hallo SMO,

vielen Dank für den Tip. Ich werde das demnächst ausprobieren.

Gruß Thomas


Delete - Mo 09.11.15 15:39

Vielleicht ist es möglich, die Explorer-Daten zu übernehmen, denn der Explorer ist blitzschnell.

Hier gibt es auch
MediaInfoLib (MediaInfo.dll v0.7.7.6) Interface for Delphi, (c)2008 by Norbert Mereg (Icebob)
http://MediaArea.net/MediaInfo
https://mediaarea.net/en/MediaInfo/Download/Source
http://mediaarea.net/download/source/libmediainfo/0.7.79/libmediainfo_0.7.79_AllInclusive.7z

Sorry - steht schon weiter oben...


Tendl - Mo 09.11.15 15:58

Explorer habe ich mir auch schon mal überlegt. Für die Playtime ginge das wahrscheinlich,
für Bild-Höhe und Breite aber nicht mehr, dazu müsste man dann schon auf die Eigenschaften
zugreifen können. Für mich war dann der Ansatz mit der PasLibVLC erstmal einfacher.
Prinzipiell macht die Lib ja auch was sie soll, bei allen Video-Dateien außer mp4 ja
auch in zufriedenstellender Geschindigkeit.

Auffällig ist dabei auch noch das das beiliegende compilierte Beispiel diese Verzögerung nicht
hat, compiliere ich es aber neu habe ich die Pause wieder.

Die Run-Time-Checks habe ich alle disabled.

Ein Kopieren libvlc.dll ins Projekt-Verzeichnis hat auch nichts verbessert.

Extrem merkwüdig!


Delete - Mo 09.11.15 17:42

user profile iconTendl hat folgendes geschrieben Zum zitierten Posting springen:
Auffällig ist dabei auch noch das das beiliegende compilierte Beispiel diese Verzögerung nicht hat, compiliere ich es aber neu habe ich die Pause wieder.

Dann kann es eigentlich nur an deinem Code liegen, und den kennt außer dir niemand :roll: Was soll man da nun raten? Ach ja, ich weiß: Poste den relevanten Code, das wär doch mal ein Anfang :?:


Tendl - Mo 09.11.15 18:37

Die meiste Zeit vergeht beim Schließen der MP4-Datei
Der Code ist unverändert aus der DEMO:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
unit MainFormUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ExtCtrls, PasLibVlcPlayerUnit;

type
  TMainForm = class(TForm)
    PasLibVlcPlayer: TPasLibVlcPlayer;
    MainMenu: TMainMenu;
    MenuFile: TMenuItem;
    MenuFileOpen: TMenuItem;
    MenuFileQuit: TMenuItem;
    OpenDialog: TOpenDialog;

    procedure MenuFileQuitClick(Sender: TObject);
    procedure MenuFileOpenClick(Sender: TObject);
    procedure PasLibVlcPlayerMediaPlayerMediaChanged(Sender: TObject;
      mrl: string);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.MenuFileQuitClick(Sender: TObject);
begin
  Close();
end;

procedure TMainForm.MenuFileOpenClick(Sender: TObject);
var
  logo_file_1 : string;
  logo_file_2 : string;
begin
  if OpenDialog.Execute() then
  begin
    PasLibVlcPlayer.Play(OpenDialog.FileName);
    logo_file_1 := ExtractFilePath(Application.ExeName) + '\..\..\logo1.png';
    logo_file_2 := ExtractFilePath(Application.ExeName) + '\..\..\logo2.png';
    if (FileExists(logo_file_1) and FileExists(logo_file_2)) then
    begin
      PasLibVlcPlayer.LogoShowFiles([logo_file_1, logo_file_2]);
    end;
    PasLibVlcPlayer.MarqueeShowText('marquee test %H:%M:%S');
  end;
end;

procedure TMainForm.PasLibVlcPlayerMediaPlayerMediaChanged(Sender: TObject;
  mrl: String);
begin
  Caption := mrl;
end;

end.


Delete - Mo 09.11.15 19:49

Also da seh ich schonmal einen Fehler bzw. unnötige Klammern in MenuFileOpenClick:


Delphi-Quelltext
1:
if (FileExists(logo_file_1) and FileExists(logo_file_2)) then                    


Klammern sind nur notwendig, wenn es sich um einen zusammengesetzten Ausdruck handelt. FileExists(FileName) ist jedoch kein zusammengesetzter Ausdruck.

Den nächsten Fehler machst du in derselben Methode mit ExtractFilePath [http://docwiki.embarcadero.com/Libraries/XE5/de/System.SysUtils.ExtractFilePath]:
Extrahiert die Laufwerks- und Verzeichnisinformationen aus einem Dateinamen. Der resultierende String enthält die Zeichen von FileName bis einschließlich des Doppelpunkts oder des umgekehrten Schrägstrichs, mit dem die Pfadinformationen vom Dateinamen und seiner Erweiterung abgetrennt werden. Sind in FileName keine Laufwerks- und Verzeichnisinformationen vorhanden, wird ein leerer String zurückgegeben.

Wenn du da nochmal einen Backslash anhängst, hast du zwei hintereinanderstehende Backslashes, und das wird wohl kaum im Sinne des Erfinders sein.

user profile iconTendl hat folgendes geschrieben Zum zitierten Posting springen:
Die meiste Zeit vergeht beim Schließen der MP4-Datei

Wo wird denn die MP4-Datei geschlossen? Wie sollte das Schließen der MP4-Datei aussehen?

Ich sehe hier nur ein Schließen der Form in MenuFileQuitClick, wobei ich den Zweck der Klammern nach Close nicht nachvollziehen kann.

Weiß du überhaupt, was du da programmierst, oder kopierst du blind irgendwelchen Fremdcode in deinen Code-Editor?

Zu guter Letzt möchte ich dir empfehlen, auf MemoryLeaks zu testen. Wie das geht, weißt du?


Tendl - Di 10.11.15 10:42

Wie bereits geschrieben habe ich hier eine Demo möglichst unverändert übernommen.
das mit der Klammer werde ich gleich noch mal prüfen.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Wie gesagt der Code ist das beigelegte Beispiel. Trotzdem möchte ich eine Lanze für den Programmierer brechen.

1. Klammern haben noch nie geschadet. Gerade wenn man zwischen C und Delphi hin- und herspringt empfiehlt es sich geradezu davon eher üppigen Gebrauch zu machen. Ein Fehler ist dies in keinem Fall und den die 2 Byte Mehrverbrauch im Sourcecode spielen heute nun wirklich keine Rolle mehr.

2. 2 Blackshlashes in einer Textausgabe sind bestenfalls unschön aber nie ein Problem, wie gesagt es ist ein kostenloses Demo keine kommerzielle Vollversion

3. Das MP4 wird geschlossen wenn ich ein anderes MP4 öffne oder beim Verlassen des Programms.

Ich bin mit TurboPascal seit Version 2.0 unterwegs und nein der Code ist nicht von mir. Lesen hilft.

Die berechtigte Anmerkung war, wo überhaupt das MP4 geschlossen wird. Dies geschieht implizit in


Delphi-Quelltext
1:
PasLibVlcPlayer.Play(OpenDialog.FileName);                    


oder beim Verlassen des Programms.

Speicherfresser dürfen bei einem Öffnen des Programms, Laden eines MP4s und Schließen des Programms keine Rolle spielen.


Martok - Di 10.11.15 11:47

VLC ist prinzipiell immer sehr langsam, deswegen benutzte den ja auch lange keiner...

Jedenfalls, kann das sein dass das was mit dem FontCache zu tun hat? Keine Ahnung wie diese Lib das handhabt, aber der normale Player bleibt da ja gern mal ein paar Minuten stehen (allerdings am Dateianfang - woher weißt du, dass er beim Schließen der ersten hängt, nicht beim starten der zweiten?). Das würde auch irgendwie bei MP4 Sinn machen, denn da könnten prinzipiell Subtitles drin sein, für die er die Textausgabe laden würde.


Tendl - Di 10.11.15 12:37

Dadurch das ich diese Verzögerung auch beim Verlassen des Programms bei laufenden MP4 sehe.


Martok - Di 10.11.15 12:47

Hm, das passt dann eher nicht. Bekommt man nicht die Logausgabe irgendwie?