Hi zusammen,
wie (unvorsichtigerweise;)) in einem anderen Thread angekündigt, stelle ich jetzt mal meine Veruche zur automatischen Werbe-Erkennung ins Forum. Das ganze ist eine mühsame Geschichte und nicht wirklich nutzbar, aber vielleicht ein erster Schritt...
Was geht:
Die unteren schwarzen Ränder werden erkannt und die Aufnahme wird automatisch in Werbung und Film unterteilt, es wird eine marks.vdr erzeugt.
Was geht nicht:
das klappt nur manchmal, und auch nicht immer akurat.
Wie macht das Skript genau:
In erster Linie ruft das Skript ständig mplayer mit den Optionen:
-vo null -ao null -speed 100 -vop cropdetect
auf, liest den output ein und entscheidet dann, ob es sich um Werbung oder Film handelt. Im Einzelnen:
- Zuerst wird alle 30 Sec des Films 1 Sec herausgeholt, und an mplayer verfüttert. Die Ergebnisse werden extrahiert (unterer schwarzer Rand) und zwischengespeichert (dauert ca 2 min für knapp 3h Film)
- Dann wird in allen Ergebnissen nach dem am häufigsten vorkommenden Wert für den unteren schwarzen Rand gesucht. Wenn kein Wert öfter als in 50 Prozent der Fälle vorkommt, dann bricht das Skript ab (ist aber beim testen nicht vorgekommen). Wenn es so einen Wert gibt, dann ist das der Filmrand und das Kriterium für alle folgenden Schritte.
- Anschliessend entscheidet das Skript für jede einzelne Testsekunde, ob es sich um Film oder Werbung handelt, natürlich anhand der im ersten Schritt ermittelten Werte. Dabei wird nur bestimmt, ob der Wert für den unteren schwarzen Rand mindestens so gross oder grösser ist wie der Wert für den Film. Sonst gibt es Aerger mit dunkelen Szenen.
Dadurch entstehen schon mal mehr oder weniger lange Anschnitte, die Werbung oder Film zugeordnet sind.
- Film-Abschnitte, die eine bestimmte Länge unterschreiten (Vorseinstellung 3 min) werden aus der Liste gelöscht und in Werbung umdefiniert.
- Abschliessend werden die genauen Uebergänge gesucht, hierzu analysiert das Skript ein paar Bilder zwischen den Abschnitten. Beispiel:
Die ersten 8 Abschnitte einer Aufnahme wurden "Werbung" zugeordnet, dann gibt es 40 Abschnitte "Film" ( 8 - 48 ). Da jeder Abschnitt 30 sec lang ist, startet das Skript mit der Analyse bei 240 sec (also am Ende des Werbe-Abschnitts).
Dort wird überprüft, ob sich die nächsten 0.5 Sec Werbung oder Film zuordnen lassen. Ist es Werbung, dann wiederholt das Skript die Ueberprüfung bei 240.5 Sekunden, dann bei 241 Sekunden usw. Findet das Slript einen 0.5 Sec Abschnitt, der nach Film aussieht, werden die nächsten 10 sec ebenfalls daraufhin überprüft. Ist auch das Film, wird die Schnittmarke gesetzt und das Skript springt zum nächsten Uebergang, im Beispiel bei 48 * 30 Sekunden, und wiederholt da den Scan, nur das es einen Uebergang von Film zu Werbung sucht.
Wenn alles durchgescannt ist, wird eine detected_marks.vdr geschrieben.
Dauert alles zusammen ca 5:40 min, je mehr Schnitte, desto länger.
Soweit erstmal die Funktionsweise, wie klappt es nun?
So lala, wenn es gar nicht klappen würde, dann würde ich es nicht posten. Folgende Probleme sind aufgefallen:
- In der Werbung tauchen öfter schwarze Balken auf, als einem lieb ist. Die machen Aerger.
- Die Programm-Hinweise bei Pro7 laufen auch oft mit schwarzen Balken, allerdings befindet sich bei denen dann das Logo im oberen schwarzen balken, und nicht im Bild, so wie während des Films. Vielleicht sollte man doch den oberen Balken zusätzlich heranziehen.
- Weisse Streifen am oberen oder unteren Rand killen das Skript, nix zu machen (oder besser gesagt, den mplayer). Wenn jemand weiss, mit welchen Parametern ich erst das Bild zuschneiden kann, und dann die cropdetection starten kann, dann wäre das schon mal gelöst.
- Die ganze Logik ist etwas "wackelig"
Naja, wer spielen will und zuviel Zeit hat, der kann sich ja das Ding mal runterladen, es ausprobieren und/oder verbessern.
Aufgerufen wirds mit
ad_scanner.pl /PFAD/ZUR/AUFNAHME
Also nicht die .vdr Dateien selbst angeben, sondern das Verzeichnis.
Einstellungen, an denen man schrauben kann, finden sich an Anfang des Skripts:
# PLEASE ADJUST VALUES HERE
my $interval = 30; # Check GOPs (ca 12 Pictures) every nn seconds
my $gops2check = 3; # check nn GOPs
my $min_movie_length = 180; # minmal length for a movie bit to be accepted in seconds
my $min_ad_length = 30; # minmal length for am advertisement bit in seconds, NOT USED
my $final_check_gops = 20; # number of GOPS to check for the last analysis
my $mspeed = 100; # this is the speed parameter for mplayer, might be too fast on your machine
- $interval gibt an, alle wieviel Sekunden eine Test-Schnipsel extrahiert wird
- $gops2check gibt an, wie lang ein Test-Schnipsel sein soll (in GOPS, ca 0.5 Sek. pro GOP)
- $min_movie_length gibt an, wie lang ein Stück Film min sein muss, um so akzeptiert zu werden. Es könnte ja auch ein Werbespot mit schwarzen Ränder sein...
- $min_ad_length genauso, wird aber nicht benutzt
- $final_check_gops Anzahl der GOPs, die beim letzen Check analysiert werden, also wenn ein potentieller Uebergang gefunden wurde, werden nochmals nn GOPs danach gecheckt.
- $mspeed ist der -speed Parameter für mplayer, wenn gar nicht geht, sollte man den mal auf 1 setzen
So, wie gehts jetzt weiter?
Für mich mit diesem Skript wohl erstmal gar nicht, ich wende mich wieder vdrsync und versprochenen Patches zu. Wenn allerdings jemand von Euch was daran basteln würde, dann würde ich schon noch mitmischen ;).
Achja, wenn Ihr wissen wollt, ob das Skript wirklich funktioniert hat, dann müsst Ihr natürlich die detected_marks.vdr in das Filmverzeichnis reinkopieren, und zwar als marks.vdr. Und dann per vdr kontrollieren, wo die Dinger sitzen.
Und wenn Ihr wirklich mit Entwickeln/Testen wollt, dann schaut mal ans Ende vom Skript und nehmt die Kommentar Zeichen vor diesen Zeilen raus:
##################################################
# TO CHECK WHAT GOING ON UNCOMMENT THE NEXT 3 LINES AND HAVE A LOOK
# AT THE FILES THAT THIS SCRIPT GENERATES
########################################################
# open OF, ">./gop$frameno.vdr";
# print OF $video_stream;
# close OF;
Dann gibt es jede Menge Schnipsel auf der Platte, die man dann ansehen kann. Und darüber philosophieren, warum die falsch erkannt wurden.... Und mplayer drüberbügeln. damit man die Parameter verbessern kann....
Cheers
doc