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-ID: 359493

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

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

BassFishFox
BassFishFox 29.12.2017 aktualisiert um 22:31:36 Uhr
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
freeuser616
freeuser616 30.12.2017 um 00:47:00 Uhr
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.
BassFishFox
BassFishFox 30.12.2017 aktualisiert um 02:40:41 Uhr
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
135051
135051 30.12.2017 um 10:28:31 Uhr
Goto Top
freeuser616
freeuser616 01.01.2018 um 18:29:33 Uhr
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.
colinardo
colinardo 02.01.2018 aktualisiert um 11:44:29 Uhr
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
colinardo
colinardo 23.01.2018 um 16:16:22 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.