metadaten von videos bestimmen
-
- 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
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.
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.
-
- 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)
@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.
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
Michael Springwald
- 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:
Können die acs-Komponenten auf die metatags eigentlich zugreifen ? Dann wäre das ja ein möglicher Weg.Christian hat geschrieben:In vielen Video Files sind glaub ich auch id3 Tags drin, dafür gibts schöne klassen die das direkt auslesen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
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
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.
-
- 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)
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.
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
Michael Springwald
-
- 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)
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:
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:
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.
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:
ich habe nach libavuti gesucht ist installiert. und ich kann sie auch unter /usr/lib finden./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
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:
Im Soruce-Code habe ich gesehen das einige Variablen nicht Instantisiert werden: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
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
Michael Springwald