metadaten von videos bestimmen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Beitrag von bembulak »

http://www.wotsit.org/" onclick="window.open(this.href);return false;

Man könnte zumindest versuchen, die Metadaten selber herauszufinden, oder?
Dann ist man nicht auf externe Sachen angewiesen. Wenn man es richtig angeht, wäre es crossplattform und auch nicht mit Lizenzen oder Restriktionen vorbelastet.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

In vielen Video Files sind glaub ich auch id3 Tags drin, dafür gibts schöne klassen die das direkt auslesen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

@bembulak
Selbst das dürfte schon nicht so einfach sein. Ich hatte mal eine Klasse für Delphi dafür gefunden. ich weiß nur nicht mehr wo.

Ich weiß aber das bei MP3 z.b. die meta Daten nicht immer am selben fleck stehen. Die muss man also suchen.
Aber möglich währe es durchaus. Wenn man sich nur auf die Meta Daten konzentriert.

Möchtest du die dann auch ändern ?

Evlt. könnte man sowas über eine einfache Bases Klasse lösen. von der alle weiteren Klassen einfach nur noch abgeleitet werden. Und dann mit TFileStream.
Aber einfach wird das auch nicht. Da es ja auch von den verschiedenen Formate andere Versionen gibt.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6856
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Christian hat geschrieben:In vielen Video Files sind glaub ich auch id3 Tags drin, dafür gibts schöne klassen die das direkt auslesen.
Können die acs-Komponenten auf die metatags eigentlich zugreifen ? Dann wäre das ja ein möglicher Weg.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

almatic
Beiträge: 25
Registriert: So 10. Aug 2008, 01:56

Beitrag von almatic »

also tags sind keine Option. M.W. gibts auch keinen standardisierten Weg, Videos zu taggen. Ich habe das gerade mal mit id3v2 spasseshalber versucht, und die Videos waren danach nicht mehr abspielbar. ffmpeg kann auch tags schreiben, aber die werden von den meisten Playern einfach ignoriert. In Tags kann ja auch jeder reinschreiben, was er will, ich will ja die tatsächlichen Eigenschaften des Videos (die Codecs der Streams, die Auflösung, die a/v-Bitrate(n) usw). Metainfo war vielleicht das falsche Wort.

Diese Eigenschaften werden (so weit ich weiß) normalerweise aus dem Videocontainer ausgelesen (avi, mpeg usw.). Dazu benutzen die bekannten, freien Frameworks die libavformat aus dem ffmpeg Projekt. Den Container selbst erkennt man ja an der Endung.
Ich selbst habe jetzt auch nicht das super detaillierte Wissen über den Aufbau aller Containerformate, als dass ich da jetzt rangehen könnte. Meine Kenntnis von (free-)Pascal ist auch nur knapp über Null im Moment, deswegen wollte ich erstmal eine einfache Lösung nehmen. Ist ja auch nicht so super-wichtig für das Programm, ich dachte nur, es wäre nützlich.

Ich stelle mal meinen Code ein, der das mit mplayer macht. Dann seht ihr, was ich meine. Vielleicht fällt dem einen oder anderen dann ein Weg ein, um das besser zu machen :)

Code: Alles auswählen

unit VideoItems;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Process;
 
type
 
vitem = class(TObject)
      Private
            name : String;
            function getbasename : String;
            function getvcodec : String;
            function getacodec : String;
            function getcformat : String;
            function getplength : String;
            function getsize : String;
            function getframerate : String;
            function getvbitrate : String;
            function getabitrate : String;
            function getsamprate : String;
            function getachannels : String;
            function GetVideoValue (value:String) : String;
      Public
            property basename : String read getbasename;
            property fullpath : String read name;
            property vcodec : String read getvcodec;
            property acodec : String read getacodec;
            property cformat : String read getcformat;
            property plength : String read getplength;
            property size : String read getsize;
            property framerate : String read getframerate;
            property vbitrate : String read getvbitrate;
            property abitrate : String read getabitrate;
            property samprate : String read getsamprate;
            property achannels : String read getachannels;
            Constructor init (fname:String);
       end;
 
implementation
 
Constructor vitem.init (fname: String);
begin
     name:=fname;
end;
 
function vitem.getbasename : String;
var
   tempstr : String;
   i : integer;
begin
     {$ifdef unix}
     for i:=1 to length(name) do
     if name[i]='/' then tempstr:=Copy(name, i+1, length(name));
     {$endif}
     {$ifdef windows}
     for i:=1 to length(name) do
     if name[i]='\' then tempstr:=Copy(name, i+1, length(name));
     {$endif}
     getbasename:=tempstr;
end;
 
function vitem.getvcodec : String;
begin
     getvcodec:=GetVideoValue('ID_VIDEO_CODEC');
end;
 
function vitem.getacodec :String;
begin
     getacodec:=GetVideoValue('ID_AUDIO_CODEC');
end;
 
function vitem.getcformat : String;
begin
     getcformat:=GetVideoValue('ID_VIDEO_FORMAT');
end;
 
function vitem.getplength : String;
begin
     getplength:=GetVideoValue('ID_LENGTH');
end;
 
function vitem.getsize : String;
var
   sizex,sizey:String;
begin
   sizex:=GetVideoValue('ID_VIDEO_WIDTH');
   sizey:=GetVideoValue('ID_VIDEO_HEIGHT');
   getsize:=sizex+'x'+sizey;
end;
 
function vitem.getframerate : String;
begin
     getframerate:=GetVideoValue('ID_VIDEO_FPS');
end;
 
function vitem.getvbitrate : String;
begin
     getvbitrate:=GetVideoValue('ID_VIDEO_BITRATE');
end;
 
function vitem.getabitrate : String;
begin
     getabitrate:=GetVideoValue('ID_AUDIO_BITRATE');
end;
 
function vitem.getsamprate : String;
begin
     getsamprate:=GetVideoValue('ID_AUDIO_RATE');
end;
 
function vitem.getachannels : String;
begin
     getachannels:=GetVideoValue('ID_AUDIO_NCH');
end;
 
function vitem.GetVideoValue (value:String) : String;
var
   ind,i: integer;
   Vvalue,tmpstr : String;
   proc : TProcess;
   procout: TStringList;
begin
     proc:=TProcess.Create(nil);
     procout:=TStringList.Create;
     proc.CommandLine:='mplayer -vo null -ao null -frames 0 -identify '+'"'+name+'"';
     proc.Options:=proc.options + [poWaitOnExit, poUsePipes];
     proc.Execute;
     procout.LoadFromStream(proc.Output);
     ind:=procout.IndexOfName(value);
     Vvalue:=procout.Strings[ind];
     proc.free;
     procout.free;
     for i:=1 to Length(Vvalue) do
     if Vvalue[i]='=' then tmpstr:=Copy(Vvalue, i+1, Length(Vvalue));
     GetVideoValue:=tmpstr;
end;
 
end.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Kann man den MPlayer nicht mehrer Dateien als Parameter übergeben ?
Du könntest etwas zeit Sparen nicht viel, aber immerhin, du müsstest
proc : TProcess;
procout: TStringList;
jeweils nur einmal beim erstellen der Klasse erzeugen. Also bei Create
und freigeben auch nur bei destroy.
Du müsstest evlt. nur bei jeden Aufruf von GetVideoValue die Stringlist leeren mit clear.

Außerdem, bei vielen Daten könntest du den Code in einen extra Thread schreiben.
Ich denke ob du nun MPlayer oder ffmpeg verwendest zum auslesen dürfte keinen großen unterschied machen.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Können die acs-Komponenten auf die metatags eigentlich zugreifen ? Dann wäre das ja ein möglicher Weg.
Nein, ich hab mal sowas angefangen aber nie fertiggemacht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Würde es sin machen da weiter zu machen wo du aufgehört hast ?
MFG
Michael Springwald

almatic
Beiträge: 25
Registriert: So 10. Aug 2008, 01:56

Beitrag von almatic »

Nur der Vollständigkeit halber : habe das Problem jetzt gelöst mit dem Beispiel aus Plutos erstem Link (svn-beispiel), indem jede funktion ihren eigenen tprocess startet und diesen dann an getvideovalue übergibt. So muss nicht gewartet werden, bis der Prozess beendet ist.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich habe heute FPC Heder gefunden:
http://www.nabble.com/Free-Pascal-port- ... 95857.html" onclick="window.open(this.href);return false;
leider bekomme ich sie noch nicht zum laufen, da ich noch nicht weiß wie ich sie einsetzten kann.

Edit01:
So, ich habe das packet ausprobiert es jedoch nicht zum laufen bekommen, weil mir anscheind irgendeine lib fehld:
/usr/bin/ld: cannot find -lavutil.49
project1.lpr(17,1) Error: Error while linking
project1.lpr(17,1) Fatal: There were 1 errors compiling module, stopping
ich habe nach libavuti gesucht ist installiert. und ich kann sie auch unter /usr/lib finden.
Das Dev packert dazu ist auch installiert. Ich komme einfach nicht weiter.
Ich habe versucht in einem neuen Projekt die unit AVRead einzubinden.
Weil dort anscheind eine Object Struktur vorhanden ist. Also sowas wie OOP.

Kann mir jemand helfen ? bzw. hat jemand eine Lösung für das Problem ?
Ich habe das Zip Archiv mpegpas02.zip vom Link ausprobiert.

Edit02:
ich musste einfach bestimmte links erzeugen im Lib verzeichnis. Dann lässt sich das Projekt auch starten.
Allerdings komme ich nicht so recht weiter. Die Meta Daten werden zwar ausgelesen aber dann kommt ein Fehler:
Input #0, asf, from '/media/sda6/Michael/Grafiken/arj/a/002.wmv':
Duration: 00:00:28.4, start: 5.000000, bitrate: 288 kb/s
Stream #0.0: Audio: wmav2, 32000 Hz, stereo, 32 kb/s
Stream #0.1: Video: wmv3, yuv420p, 320x240 [PAR 0:1 DAR 0:1], 308 kb/s, 30,00 tb(r)
-1
video stream cannot be found -- Hier die Fehler Meldung die ich meine
Im Soruce-Code habe ich gesehen das einige Variablen nicht Instantisiert werden:
pFormatCtx^.nb_streams
VideoFrameDecoder = object ist leider ein Object. kann das sein das ich das erst erzeugen muss ?
weiter unten gibt es eine variable:decoder und die nutzte ich.
MFG
Michael Springwald

Antworten