freeuser616
Goto Top

Such möglichkeit metadaten aus avi (bspw. den titel) zu entfernen (als batch file)

hallo zusammen,

leider werde ich einfach nicht fündig.

ich habe noch einiges an avi Dateien in meiner Sammlung, wo ich die Medataten (allen voran der Titel), entfernen möchte.

Leider funktioniert das nicht über die Eigenschaften der Datei in Windows.
Ferner suche ich auch die Möglichkeit dies bequem über ein batch File zu machen.
Denn es sind schon schon recht viele Files, die angepasst werden müssen.

Für meine MKV Dateien hat das super mit dem Programm mkvtoolnix funktioniert. Exakt das selbe suche ich halt für avi Dateien.


vorab vielen Dank und schöne Grüße

Content-Key: 359493

Url: https://administrator.de/contentid/359493

Printed on: April 19, 2024 at 21:04 o'clock

Member: BassFishFox
BassFishFox Dec 29, 2017 updated at 21:31:36 (UTC)
Goto Top
Hallo,

Ich bin mir sicher das es mit ffmpeg klappt. ffmpeg laesst sich auch wunderbar verscripten.

ffmpeg -i input -c copy -map_metadata -1 output

ffmpeg gibt es natuerlich auch fuer Windows. Und bei der Gelegenheit kannst Du die AVI gleich nach *.mkv oder aehnlich wandeln. face-wink

Schleife für variable Dateien-Konvertierung mit ffmpeg

Probieren tu ich es aus Zeitmangel selbst nicht. face-smile

BFF
Member: freeuser616
freeuser616 Dec 29, 2017 at 23:47:00 (UTC)
Goto Top
Hallo und danke für deine schnelle Rückmeldung.

ffmpeg hatte ich bereits getestet. grund warum ich dies nicht als lösung nehmen kann, ist, dass es viel zu lange braucht, weil es eine neue datei erstellt.
bei über 1000 dateien zu aufwendig.
Member: BassFishFox
BassFishFox Dec 30, 2017 updated at 01:40:41 (UTC)
Goto Top
Hallo,

Recht hast Du natuerlich, wenn die Dateien umgewandelt werden sollen in ein anderes Format bzw. die geaenderte Datei auf eine andere Platte geschrieben wird.

Ich habe eben mal ein aktuelles ffmpeg (x64) auf eine 2GB grosse FullHD-MP4 losgelassen.
ffmpeg.exe -i aefhd.mp4 -c copy -map_metadata -1 aefhd1.mp4

Das Dingens war in ca. 15 Sekunden fertig. Die Platte auf der das lief ist eine stinknormale 2TB WD mit 5400U/Min. Und meine Kiste hat nur 16GB mit einem AMD X6 1055T. Wenn Deine 1000 Dateien also auch 2 GB gross sind (je Datei 1h:30m Full HD Film) waere meine Kiste ohne Umwandlung nach irgendwas in ca. 4 Stunden fertig. Ich denke es ist einen neuen Versuch wert. face-wink

Wenn nicht, musst Du auf die Powershell-Fraktion ( @colinardo & @135051 ) warten. Da ist vielleicht auch irgendwas moeglich.
Eventuell schaust Du Dir auch das Programm Handbrake an, das ist auch batchfaehig. Ob es das kann was Du willst, keine Ahnung.

Schoenes WE!
BFF
Mitglied: 135051
135051 Dec 30, 2017 at 09:28:31 (UTC)
Goto Top
Member: freeuser616
freeuser616 Jan 01, 2018 at 17:29:33 (UTC)
Goto Top
danke, sieht nach nem sehr guten programm aus.
nur leider ist genau die funktion, die ich brauche kostenpflichtig. face-confused

gibt es genau sowas auch for free
ne trial mit vollem umfang würde mir auch schon reichen.
Member: colinardo
colinardo Jan 02, 2018 updated at 10:44:29 (UTC)
Goto Top
Servus @freeuser616,
habe mir das damals selbst mal quick n' dirty mit einem Powershell-Skript geschrieben, es entfernt im diesem Beispiel den Titel des Videos ohne eine Kopie zu erstellen direkt im RIFF-Stream des AVIs:
function Find-ByteSequenceOffset([byte[]]$filebytes,[byte[]]$sequence){
    0..($filebytes.Length-1) | %{
        if ([System.Linq.Enumerable]::SequenceEqual([byte[]]$sequence, [byte[]]$filebytes[$_..($_ + $sequence.Count-1)])){
            return $_
        }
    }
    return $null
}

function Get-MetaDataDetail {
    param(
        [byte[]]$metadata,
        [ValidateSet('INAM','IART','ICOP','IPRD','ICRD','IGNR','ISGN','ISBJ','IKEY','ICMT','IWRI','IPRO','ICNM','IPDS','IEDT','ICDS','IMUS','ISTD','IDST','ICNT','ILNG','IRTD','ISTR','ISFT','ITCH','IENG','IWEB','IDIT','ISMP','ISRF','IMED','ISRC','IARL','ICMS','IPRT','IFRM','ICRP','ISHP','IDIM','ILGT','IDPI','IPLT')][string]$detail  
    )
    [int]$offset_detail = Find-ByteSequenceOffset $metadata ([System.Text.Encoding]::ASCII.GetBytes($detail))
    if ($offset_detail -ne $null){
        return [System.Text.Encoding]::ASCII.GetString($metadata[($offset_detail+8)..($offset_detail + 7 + [System.BitConverter]::ToInt32(($metadata[($offset_detail+4)..($offset_detail+8)]),0))])
    }
}

function Clear-MetaDataDetail {
    param(
        [byte[]]$metadata,
        [ValidateSet('INAM','IART','ICOP','IPRD','ICRD','IGNR','ISGN','ISBJ','IKEY','ICMT','IWRI','IPRO','ICNM','IPDS','IEDT','ICDS','IMUS','ISTD','IDST','ICNT','ILNG','IRTD','ISTR','ISFT','ITCH','IENG','IWEB','IDIT','ISMP','ISRF','IMED','ISRC','IARL','ICMS','IPRT','IFRM','ICRP','ISHP','IDIM','ILGT','IDPI','IPLT')][string]$detail  
    )
    $offset_detail = Find-ByteSequenceOffset $metadata ([System.Text.Encoding]::ASCII.GetBytes($detail))
    if ($offset_detail -ne $null){
        $dsize = [System.BitConverter]::ToInt32(($metadata[($offset_detail+4)..($offset_detail+8)]),0)
        ($offset_detail+8)..($offset_detail+7+$dsize) | %{$metadata.Set($_,0)}
    }
    return $metadata
}

function Clear-AVIMetaData {
    param(
        [parameter(mandatory=$true,ValueFromPipelineByPropertyName=$true)][alias('Fullname')][string]$filepath  
    )
    begin{
        $search = [System.Text.Encoding]::ASCII.GetBytes("LIST")  
        $search2 = [System.Text.Encoding]::ASCII.GetBytes("INFO")  
    }
    process{

        try{
            [System.IO.FileStream]$file = [IO.File]::Open($filepath,[System.IO.FileMode]::Open)
            $found = $false
            $cbuffer = new-object 'Byte' 4  
            $cbuffer = $search
            Do {
                $b = $file.ReadByte()
                if ($b -ne -1){
                    if ([char]$b -eq $search){
                        [void]$file.Read($cbuffer,1,3)
                        if([System.Linq.Enumerable]::SequenceEqual($buffer,$search)){
                            $sbuffer = new-object 'Byte' 8  
                            [void]$file.Read($sbuffer,0,8)
                            if ([System.Linq.Enumerable]::SequenceEqual([byte[]]$sbuffer[4..7],$search2)){
                                $infostart = $file.position
                                $infosizebytes = $sbuffer[0..3]
                                $infosize = [System.BitConverter]::ToInt32($infosizebytes,0) - 4
                                $infocontent = new-object 'Byte' $infosize  
                                [void]$file.Read($infocontent,0,$infosize)
                                $found = $true
                            }
                        }
                    }
                }
            }until($found -or $file.Position -eq -1)
            if ($found){
                $infocontent_new = Clear-MetaDataDetail $infocontent INAM
                if($infocontent_new -ne $null){
                    write-host "Clearing the metatag 'Title' from '$filepath'." -F Green  
                    [void]$file.Seek($infostart,0)
                    $file.Write($infocontent_new,0,$infocontent_new.length)
                }
            }
        }catch{
           throw $_.Exception.Message
        }finally{
            $file.Close()
        }
    }
}
# Titel Tag von allen Videos in D:\Videos inkl. Unterordner entfernen
gci "D:\Videos\*.avi" -file -recurse | Clear-AVIMetaData  
Angabe des Ordners in der letzten Zeile.

Probiers mal aus, ist leider schon etwas länger her, sollte aber mit AVI-Containern die dem RIFF-Standard folgen funktionieren zumindest tut es das hier mit meinen zur Verfügung stehenden Videos. Das Skript lässt sich natürlich einfach auf andere Tags erweitern wenn man will. Bei Interesse einfach via PN anklingeln.

Grüße Uwe
Member: colinardo
colinardo Jan 23, 2018 at 15:16:22 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.