(gelöst) ffmpeg Metadaten ändern

Sound, Digitalkameras, TV+Video und Spiele.
Antworten
guennid

(gelöst) ffmpeg Metadaten ändern

Beitrag von guennid » 24.11.2016 09:39:49

Ich möchte in einem MKV-Video (1x Video und 2x Audio) die korrekte Sprachbezeichnung für die beiden Tonspuren einsetzen. Bisher erscheint da in smplayer bei beiden "und", ich nehme an, das steht für "undefined". Es ist aber deutsch und französisch. Ich vermute, dass ich mit ffmpeg an den Metadaten drehen muss, weiß aber nicht wie. Aus der Info zu "meatadata" und "-map_metadata" in der englischsprachigen Dokumentation bin ich nicht schlau geworden.

Grüße, Günther
Zuletzt geändert von guennid am 24.11.2016 10:51:04, insgesamt 1-mal geändert.

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: ffmpeg Metadaten

Beitrag von Lord_Carlos » 24.11.2016 09:50:07

Was ich auf die schnelle gefunden habe: http://superuser.com/a/835069

ffmpeg -i input.mp4 -map 0 -metadata:s:a:0 title="One" \
-metadata:s:a:1 title="Two" output.mp4

You can also set the language: -metadata:s:a:1 lang=eng.
Hilft dir das weiter?

Edit: Auch ein netter Faden: https://ffmpeg.org/pipermail/ffmpeg-use ... 24080.html

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

guennid

Re: ffmpeg Metadaten

Beitrag von guennid » 24.11.2016 10:01:21

Danke sehr! Die Seite hatte ich auch schon.
-metadata:s:a:1
wurde von ffmpeg angemeckert.

mkvmerge-gui macht den Job übrigens. :wink: Aber ich will wissen, was ich tue.

Grüße, Günther

guennid

Re: ffmpeg Metadaten

Beitrag von guennid » 24.11.2016 10:10:13

Hier der komplette Befehl, den ich versucht habe:

Code: Alles auswählen

ffmpeg -i [input].mkv -map 0 -metadata:s:a:0 language="deu" metadata:s:a:1 language="fra" [autput].mkv
... und hier die Fehlermeldung

Code: Alles auswählen

Input #0, matroska,webm, from '[input].mkv':
  Metadata:
    ENCODER         : Lavf57.25.100
  Duration: 01:45:40.45, start: 0.120000, bitrate: 2388 kb/s
    Stream #0:0: Video: h264 (High), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 111.11 fps, 111.11 tbr, 1k tbn, 100 tbc (default)
    Metadata:
      DURATION        : 01:45:40,449000000
    Stream #0:1: Audio: mp3, 48000 Hz, stereo, s16p, 192 kb/s (default)
    Metadata:
      DURATION        : 01:45:40,393000000
    Stream #0:2: Audio: mp3, 48000 Hz, stereo, s16p, 192 kb/s (default)
    Metadata:
      DURATION        : 01:45:40,393000000
[NULL @ 0x10a9b60] Unable to find a suitable output format for 'metadata:s:a:1'
metadata:s:a:1: Invalid argument

guennid

Re: ffmpeg Metadaten

Beitrag von guennid » 24.11.2016 10:39:48

:facepalm: :facepalm: :facepalm:

Code: Alles auswählen

metadata:s:a:1
Bindestrich vergessen!

Das Kommando tut jetzt, vermindert aber die Bild- und Tonqualität.

(edit)
So, geschafft:

Code: Alles auswählen

ffmpeg -i [ein].mkv -map 0 -metadata:s:a:0 language="deu" -metadata:s:a:1 language="fra" -vcodec copy -acodec copy [aus].mkv
:wink:

Somebody111
Beiträge: 1
Registriert: 19.04.2024 08:11:05

Re: (gelöst) ffmpeg Metadaten ändern

Beitrag von Somebody111 » 19.04.2024 11:00:32

Hallo, bin neu hier und sende zuerst einen Gruß an alle.

Danke für den Post, dadurch ist mir ein Fehler aufgefallen, den ich gemacht hatte. Auch wenn der Beitrag hier schon etwas älter ist, möchte ich meine Lösung hier Posten. Man kann sich die Angabe der Codecs sparen; dadurch ist es auf alle ffmpeg-unterstützten Formate mit dem gleichen Code anwendbar.

Beispieldatei: geladene WebM (VP9+Opus), Video (Tag=Englisch), Audio-Sprache: Deutsch, aber Tag=Englisch. Dateien mit solchen Tags wird man oft finden. Ziel = Ändern der Tags in: Video ohne Sprache und Audio in deutsch, ohne neu zu kodieren und damit ohne Qualitätsverluste in ganz kurzer Zeit. Datei wird lediglich mit den angegebenen neuen Tags kopiert. Einzige Änderungen sind das Datei-Erstelldatum und ffmpeg-Programmversion. Kodierungszeit und andere Tags bleiben erhalten. Falls nicht, neuere/aktuelle ffmpeg-Version verwenden.

Erläuterungen:
-hide_banner = unnötiges wird nicht angezeigt (Programmversion, Parameter, Syntax)
-map 0 = alle Streams einschließen. Standard, nur 1 Stream pro Typ. Siehe » FFmpeg-Wiki
-metadata:s:a:0 (Stream:Typ:Nummer[0=1]). Audio1=0; Audio2=1 etc.). Siehe » FFmpeg-Documentation (engl.)
language="" = um Tags zu entfernen, oder leer zu lassen
language=deu oder ger für deutsch, eng für englisch etc. Siehe » Wikipedia Sprachcodes (List of ISO 639-2 codes)
-c copy = um zu streamen (zu kopieren), statt neu zu kodieren. Siehe » FFmpeg-Wiki

Code: Alles auswählen

ffmpeg -hide_banner -i "INPUT.webm" -map 0 -metadata:s:v:0 language="" -metadata:s:a:0 language=deu -c copy "OUTPUT.webm"
Code für den Thread-Ersteller (1 Video 2 Audio / MKV):

Code: Alles auswählen

ffmpeg -hide_banner -i "INPUT.mkv" -map 0 -metadata:s:v:0 language="" -metadata:s:a:0 language=deu -metadata:s:a:1 language=fra -c copy "OUTPUT.mkv"
Ohne -map 0 werden nur die angegebenen Spuren kopiert; so kann man ungewollte ausschließen. Wenn eine MP4 bspw. 2 Audiospuren hätte, würde im folgenden Beispiel nur 1 Video und 1 Audio kopiert.

Code: Alles auswählen

ffmpeg -hide_banner -i "INPUT.mp4" -metadata:s:v:0 language="" -metadata:s:a:0 language=deu -c copy "OUTPUT.mp4"
Statt .webm, mkv oder .mp4 kann jedes von ffmpeg unterstütze Format bzw. Container verwendet werden. Dabei spielen weder die verwendeten Video- als auch Audio-Codecs eine Rolle; ffmpeg liest sie selbständig korrekt aus und schreibt sie auch genauso wieder zurück. In- und Output-Container sollten grundsätzlich gleich sein, oder die Quell-Codecs unterstützen.

Ich hoffe, es hilft jemand weiter. :wink:

Grüße SB

Antworten