Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Video/Audio Informationen aus diversen Formaten (https://www.delphipraxis.net/173669-video-audio-informationen-aus-diversen-formaten.html)

gee21 9. Mär 2013 20:10

Video/Audio Informationen aus diversen Formaten
 
Hi Ho alle Zusammen

Weiss jemand ob es eine Möglichkeit gibt Video Informationen einfach/sauber auszulesen?
Vor allem habe ich nun bemerkt, dass es ist nicht ganz einfach ist, wenn es verschiedene Dateiformate sind.

Klar man könnte (evt muss man ja auch) für jedes Format eine "Funktionen" schreiben aber evt gibt es ja eine einfachere Möglichkeit?
Habe mal bei Torry nach einer Komponente geschaut aber ich hab da irgendwie nichts der Art gefunden.

Es handelt sich um folgende Video Formate
*.avi;*.mpg;*.divx;*.mp4;*.mkv;
(Ich könnt mir jetzt noch vorstellen, das divx und mp4 gleich wie avi zu behandeln sind. Bin mir aber auch nicht ganz sicher)

Und ich bräuchte folgende Infos zu den Dateien:
- Tonformat (Stereo oder zB 5.1)
- Tonqualität mit der Bit Rate (zB 192Kbit)
- Video Auflösung (zB 1680x1050)
- Video Länge in Minuten


Heute habe ich mir noch überlegt, ob es eine Möglichkeit wäre die Daten in den TMediaPlayer zu laden und ob man so evt an die Informationen kommt?


Nun gut, so oder so wüsste ich nicht wie ich anstellen könnte und daher hoffe ich jemand von euch kann mir helfen.

Grüsse aus der Schweiz.

gee21 9. Mär 2013 20:58

AW: Video/Audio Informationen aus diversen Formaten
 
Oops hätte wohl etwas besser suchen müssen...

Habe soeben etwas bei SwissDelphiCenter gefunden.

http://www.swissdelphicenter.ch/de/showcode.php?id=1746


Was hier jetzt noch fehlt ist jedoch die Audio Informationen.
Zudem kriege ich den Code noch nicht zum laufen.


Ich versuch Ihn so aufzurufen:
Delphi-Quellcode:
memo1.Lines[0]:=GetProperties(form1.FileListBox1main.Items[0], MediaLength);
Warum motzt er: "Undeklarierter Bezeichner: MediaLength"? Ich hab den ja bei private und in der Procedure drin:?:

Aphton 9. Mär 2013 21:12

AW: Video/Audio Informationen aus diversen Formaten
 
Entweder für jedes Format nen Loader finden mit der du zumindest die gewünschten Informationen extrahieren kannst oder du ermittelst die Informationen selbst:
http://wotsit.org/
Ist ne gute Anlaufstelle um mehr über Dateiformate zu erfahren.

Den Medienplayer kannst du verwenden; das ist aber eher suboptimal.

Edit: Außerdem ist das Extrahieren von Metadaten nicht allzu schwer.

silver-moon-2000 9. Mär 2013 21:47

AW: Video/Audio Informationen aus diversen Formaten
 
Oder man nimmt ein "externes Programm", das für exakt diesen Zweck geschaffen wurde: MediaInfo
Das Teil beinhaltet auch eine DLL, die man einbinden und darüber so ziemlich alles, was an Audio / Video Formaten kreucht und fleucht, auslesen kann.

Aber das kann, wenn man wirklich "nur" ein einfaches Format auslesen will, ein wenig Overkill sein, das muss aber jeder für sich entscheiden.

lbccaleb 9. Mär 2013 22:30

AW: Video/Audio Informationen aus diversen Formaten
 
Zitat:

Zitat von gee21 (Beitrag 1206658)
Und ich bräuchte folgende Infos zu den Dateien:
- Tonformat (Stereo oder zB 5.1)
- Tonqualität mit der Bit Rate (zB 192Kbit)
- Video Auflösung (zB 1680x1050)
- Video Länge in Minuten

Videolänge:
http://www.delphipraxis.net/1079162-post12.html


Und der Rest ist ähnlich auch zu besorgen.
Ich würde da auch sowas wie DirectShow benutzen, da der TMediaPlayer nicht überall korrekte Werte ausgibt.

p80286 9. Mär 2013 23:14

AW: Video/Audio Informationen aus diversen Formaten
 
Zitat:

Zitat von gee21 (Beitrag 1206660)
Ich versuch Ihn so aufzurufen:
Delphi-Quellcode:
memo1.Lines[0]:=GetProperties(form1.FileListBox1main.Items[0], MediaLength);
Warum motzt er: "Undeklarierter Bezeichner: MediaLength"? Ich hab den ja bei private und in der Procedure drin:?:

Ein kleines bischen mehr an Sourcecode wäre jetzt hilfreich.
Compiler irren im allgemeinen seltener als Programmierer.

Gruß
K-H

gee21 9. Mär 2013 23:24

AW: Video/Audio Informationen aus diversen Formaten
 
HI all

Und danke für die Tipps.
Mal schauen ob ich das noch hinkriege ;-D




Zitat:

Ein kleines bischen mehr an Sourcecode wäre jetzt hilfreich.
Dies ist der SourceCode von SwissDelphiCenter. Ich habe Ihn so beim mir im Prog übernommen. Nur bin ich nicht fähigihn richtig aufzurufen... :-)


Delphi-Quellcode:

unit MPlayerUnit;

interface

 uses
   Forms, Classes, Controls, MPlayer;

type
   THiddenForm = class(TForm)
     MediaPlayer: TMediaPlayer;
   public
     procedure GetProperties(FileName: string;
       var MediaFrames, MediaLength, MediaWidth, MediaHeight: Integer);
   end;

var
   HiddenForm: THiddenForm;

implementation

{$R *.dfm}

procedure THiddenForm.GetProperties(FileName: string;
   var MediaFrames, MediaLength, MediaWidth, MediaHeight: Integer);
begin
   MediaPlayer.FileName := FileName;
   MediaPlayer.Wait    := False;
   MediaPlayer.Open;
   MediaPlayer.TimeFormat := tfFrames;
   MediaFrames := MediaPlayer.Length;
   MediaPlayer.TimeFormat := tfMilliseconds;
   MediaLength := MediaPlayer.Length;
   MediaPlayer.DisplayRect := Rect(1, 1, 0, 0); {"0, 0" forces resolution autodetect}
   MediaWidth := MediaPlayer.DisplayRect.Right;
   MediaHeight := MediaPlayer.DisplayRect.Bottom;
   if (MediaWidth <= 0) or (MediaHeight <= 0) then
   begin {invalid values mean not video}
     MediaWidth := 0;
     MediaHeight := 0;
   end;
   MediaPlayer.Close;
end;

end.

Volker Z. 9. Mär 2013 23:40

AW: Video/Audio Informationen aus diversen Formaten
 
Hallo Robert,

Zitat:

Ich versuch Ihn so aufzurufen:
Delphi-Quellcode:
memo1.Lines[0]:=GetProperties(form1.FileListBox1main.Items[0], MediaLength);

kann doch gar nicht funktionieren. GetProperties ist eine procedure, die liefert keinen Wert zurück. Und, dann musst Du schon alle Parameter übergeben, MediaLength alleine reicht nicht.
Wo ist den eigentlich memo1 und MediaLength deklariert? Wenn MediaLength eine Property von Form1 und Memo1 eine Property von FormN ist, Du den Aufruf irgendwo in FormN vornimmst, dann hat der Compiler wohl recht, oder heißt die Property vielleicht FMediaLength?

Gruß

gee21 10. Mär 2013 00:19

AW: Video/Audio Informationen aus diversen Formaten
 
HI Volker

Hui, schon schwer deine Nachricht richtig zu lesen und jetzt noch zu beantworten :-)

Also vielleicht habe ich vorhin etwas falsch geschrieben. Ich habe den Code auf meiner Form1 eingefügt. Auf der wollte ich Ihn auch aufrufen.

also habe ich einfach ein Teil abgeändert auf: Tform1

Delphi-Quellcode:
 procedure [COLOR="Red"]Tform1[/COLOR].GetProperties(FileName: string;
   var MediaFrames, MediaLength, MediaWidth, MediaHeight: Integer);
begin
   MediaPlayer.FileName := FileName;
   MediaPlayer.Wait    := False;
   MediaPlayer.Open;
   MediaPlayer.TimeFormat := tfFrames;
   MediaFrames := MediaPlayer.Length;
   MediaPlayer.TimeFormat := tfMilliseconds;
   MediaLength := MediaPlayer.Length;
   MediaPlayer.DisplayRect := Rect(1, 1, 0, 0); {"0, 0" forces resolution autodetect}
   MediaWidth := MediaPlayer.DisplayRect.Right;
   MediaHeight := MediaPlayer.DisplayRect.Bottom;
   if (MediaWidth <= 0) or (MediaHeight <= 0) then
   begin {invalid values mean not video}
     MediaWidth := 0;
     MediaHeight := 0;
   end;
   MediaPlayer.Close;
end;
Dies habe ich nun auf Form1 bei Private drinn:
Delphi-Quellcode:
 private
 { Private-Deklarationen }
appdir: String;
function RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
procedure GetProperties(FileName: string; var MediaFrames, MediaLength, MediaWidth, MediaHeight: Integer);

public
    { Public-Deklarationen }

Wie / wo pflanze ich den das Memo nun ein?

Volker Z. 10. Mär 2013 00:51

AW: Video/Audio Informationen aus diversen Formaten
 
Hallo Robert,

also die GetProperties ist ja nun einen Methode Deiner TForm1. Wenn Du das Memo auf Dein TForm1 "pflanzt", in Deiner private Deklaration noch folgendes einfügst / änderst:
Delphi-Quellcode:
  TForm1 = class (TForm)
  private
    FMediaFrames : Integer;
    FMediaLength : Integer;
    FMediaWidth : Integer;
    FMediaHeight : Integer;
    procedure GetProperties (const Filename : string);
  end;
und dann die Parameter der Methode noch anpasst
Delphi-Quellcode:
procedure TForm1.GetProperties (FileName : string);
begin
   MediaPlayer.FileName := FileName;
   MediaPlayer.Wait := False;
   MediaPlayer.Open;
   MediaPlayer.TimeFormat := tfFrames;

   FMediaFrames := MediaPlayer.Length;

   MediaPlayer.TimeFormat := tfMilliseconds;

   FMediaLength := MediaPlayer.Length;

   MediaPlayer.DisplayRect := Rect(1, 1, 0, 0); {"0, 0" forces resolution autodetect}

   FMediaWidth := MediaPlayer.DisplayRect.Right;
   FMediaHeight := MediaPlayer.DisplayRect.Bottom;

   if (FMediaWidth <= 0) or (FMediaHeight <= 0) then
   begin {invalid values mean not video}
     FMediaWidth := 0;
     FMediaHeight := 0;
   end;
   MediaPlayer.Close;
end;
kannst Du mit
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetProperties (Form1.FileListBox1main.Items[0]);
  Memo1.Text := Format ('Frames %d Länge %d Breite %d Höhe %d', [FMediaFrames, FMediaLength, FMediaWidth, FMediaHeight])
end;
ins Memo schreiben.

Ich hoffe es hilft.

Gruß, und sorry, dass meine Antwort schwer verdaulich war

gee21 11. Mär 2013 10:14

AW: Video/Audio Informationen aus diversen Formaten
 
HI Volker

Ja ich bin eben schon noch ein noob :-D Da braucht es nicht viel, das ich etwas nicht mehr "checke" ;-D

Danke dir für deine Hilfe. Habe wieder einmal etwas gelernt.

Hast du auch noch eine Idee, warum nun mit deinem Code der Compiler meldet: Deklaration von 'GetProperties' unterscheidet sich von vorheriger Deklaration

Den alten Code habe ich eigentlich komplett entfernt und durch deinen ersetzt. (Glaube ich zumindest :-D)

Jumpy 11. Mär 2013 10:19

AW: Video/Audio Informationen aus diversen Formaten
 
Du hast den Code wohl unten im implementation Teil geändert, aber nicht oben im interface Teil.
Bzw. statt Code sollte ich besser sagen: Das wie die Prozedur deklariert ist.

gee21 11. Mär 2013 11:07

AW: Video/Audio Informationen aus diversen Formaten
 
Hi Ralph

Also ich dachte ich habe Ihn überall geändert. Habe deshalb mal kurz Copy / Paste verwendet aus meine FORM1

Delphi-Quellcode:
 private
 { Private-Deklarationen }
appdir: String;

FMediaFrames : Integer;
 FMediaLength : Integer;
 FMediaWidth : Integer;
 FMediaHeight : Integer;
 procedure GetProperties (const Filename : string);

function RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;

public
    { Public-Deklarationen }
procedure WMSysCommand(var Msg: TWMSysCommand) ;
message WM_SYSCOMMAND;
end;


var
Form1: TForm1;
Edit1nurpfad: string;
Edit1Filmpfad: string;

type
   TCallBack = procedure(Position, Size: Longint); { export; }

   PRGBTripleArray = ^TRGBTripleArray;
   TRGBTripleArray = array[0..32767] of TRGBTriple;
procedure FastFileCopy(const InFileName, OutFileName: string;
   CallBack: TCallBack);

implementation

uses Optionen, Unit3, Unit5, Unit6, Unit7, Unit8, uFTPServer, Unit10, Unit11,
  Unit12, Unit13, Unit14;

{$R *.dfm}




procedure TForm1.GetProperties (FileName : string);
begin
    MediaPlayer.FileName := FileName;
   MediaPlayer.Wait := False;
    MediaPlayer.Open;
   MediaPlayer.TimeFormat := tfFrames;

    FMediaFrames := MediaPlayer.Length;

    MediaPlayer.TimeFormat := tfMilliseconds;

    FMediaLength := MediaPlayer.Length;

    MediaPlayer.DisplayRect := Rect(1, 1, 0, 0); {"0, 0" forces resolution autodetect}

    FMediaWidth := MediaPlayer.DisplayRect.Right;
    FMediaHeight := MediaPlayer.DisplayRect.Bottom;

    if (FMediaWidth <= 0) or (FMediaHeight <= 0) then
    begin {invalid values mean not video}
      FMediaWidth := 0;
      FMediaHeight := 0;
    end;
   MediaPlayer.Close;
end;

Nur meldet er bei der Procedure: [DCC Fehler] Unit1.pas(344): E2037 Deklaration von 'GetProperties' unterscheidet sich von vorheriger Deklaration
Delphi-Quellcode:
procedure TForm1.GetProperties (FileName : string);

Medium 11. Mär 2013 11:17

AW: Video/Audio Informationen aus diversen Formaten
 
Der Parameter "FileName" ist in der Deklaration als "const" definiert, in der Implementierung allerdings nicht. Ergo: Deklaration von Implementierung verschieden ;)

gee21 11. Mär 2013 11:30

AW: Video/Audio Informationen aus diversen Formaten
 
Zitat:

Zitat von Medium (Beitrag 1206854)
Der Parameter "FileName" ist in der Deklaration als "const" definiert, in der Implementierung allerdings nicht. Ergo: Deklaration von Implementierung verschieden ;)


:-D Juhu genau das wars. Danke dir / danke euch allen für eure Hilfe. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz