Betten Sie Albumcover in OGG über die Befehlszeile in Linux ein

7410
dmikalova

Ich möchte meine Musik von flac in ogg konvertieren, und derzeit macht oggenc das perfekt, außer für Albumcover. Metaflac kann Albumcover ausgeben, es scheint jedoch kein Befehlszeilenwerkzeug zum Einbetten von Albumcover in ogg zu geben. MP3Tag und EasyTag ist in der Lage, es zu tun, und es ist eine Spezifikation für sie hier, das fordert, dass das Bild Base64 codiert werden. Bisher war ich jedoch nicht in der Lage, eine Image-Datei zu erstellen, sie in base64 zu konvertieren und in eine ogg-Datei einzubetten.

Wenn ich ein base64-codiertes Bild aus einer ogg-Datei nehme, in die das Bild bereits eingebettet ist, kann ich es mit vorbiscomment leicht in ein anderes Bild einbetten:

vorbiscomment -l withimage.ogg > textfile vorbiscomment -c textfile noimage.ogg 

Mein Problem ist, etwas wie ein JPEG zu nehmen und es in Base64 umzuwandeln. Zur Zeit habe ich:

base64 --wrap=0 ./image.jpg 

Was mir die in base64 konvertierte Bilddatei gibt, unter Verwendung von vorbiscomment und den Tagging-Regeln folgend, kann ich diese wie folgt in eine ogg-Datei einbetten:

echo "METADATA_BLOCK_PICTURE=$(base64 --wrap=0 ./image.jpg)" > ./folder.txt vorbiscomment -c textfile noimage.ogg 

Dies gibt mir jedoch einen ogg, dessen Image nicht richtig funktioniert. Beim Vergleich der base64-Zeichenfolgen ist mir aufgefallen, dass alle Bilder, die richtig eingebettet werden, eine Kopfzeile haben, aber bei allen von mir generierten base64-Zeichenfolgen diese Kopfzeile fehlt. Weitere Analyse des Headers:

od -c header.txt 0000000 \0 \0 \0 003 \0 \0 \0 \n i m a g e / j p 0000020 e g \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000040 \0 \0 \0 \0 \0 \0 \0 \0 035 332 0000052 

Was folgt der oben angegebenen Spezifikation. Hinweis 003 entspricht der vorderen Abdeckung und image / jpeg ist der Mime-Typ.

Meine Frage ist schließlich, wie kann ich eine Datei base64 kodieren und diesen Header zusammen mit dieser Datei erzeugen, um sie in eine ogg-Datei einzubetten?

12

3 Antworten auf die Frage

5
Jason

Hier ist meine Lösung für das / usr / bin / vorbiscomment: Argumentliste zu langes Problem. Ich erstellte ein Skript und nannte es oggart. Führen Sie es einfach von der Befehlszeile aus wie folgt aus:

oggart /path/to/music_file.ogg /path/to/image_file 

Dadurch wird Ihre ogg-Datei mit dem Feld METADATA_BLOCK_PICTURE gekennzeichnet. Easytag verwendet die alte Methode mit COVERART-Feld anstelle von METADATA_BLOCK_PICTURE. Wenn Sie Easytag-Kompatibilität wünschen, können Sie das Skript folgendermaßen ausführen:

oggart /path/to/music_file.ogg /path/to/image_file -e 

Hier ist das Skript:

#!/bin/sh  FILE1="`basename \"$1\"`" EXT1=$ EXTTYPE1=`echo $EXT1 | tr '[:upper:]' '[:lower:]'`  FILE2="`basename \"$2\"`" EXT2=$ EXTTYPE2=`echo $EXT2 | tr '[:upper:]' '[:lower:]'`  OGG="" if [ "$EXTTYPE1" = ogg ]; then OGG="$1" elif [ "$EXTTYPE2" = ogg ]; then OGG="$2" fi if [ "$OGG" = "" ]; then echo no ogg file selected exit 0 fi  PIC="" array=(jpeg jpg png) for item in $ do if [ "$item" = "$EXTTYPE1" ]; then PIC="$1" elif [ "$item" = "$EXTTYPE2" ]; then PIC="$2" fi done if [ "$PIC" = "" ]; then echo no jpg or png file selected exit 0 fi  if [ "$3" = -e ]; then EASYTAG=Y else EASYTAG=N fi  DESC=`basename "$PIC"` APIC=`base64 --wrap=0 "$PIC"` if [ "`which exiv2`" != "" ]; then MIME=`exiv2 "$PIC" | grep 'MIME type ' | sed 's/: /|/' | cut -f 2 -d '|' | tail -n 1` fi if [ "$MIME" = "" ]; then MIME="image/jpeg" fi  vorbiscomment -l "$OGG" | grep -v '^COVERART=' | grep -v '^COVERARTDESCRIPTION=' | grep -v '^COVERARTMIME=' | grep -v 'METADATA_BLOCK_PICTURE=' > "$OGG".tags  if [ "$EASYTAG" = N ]; then echo METADATA_BLOCK_PICTURE="$APIC" > "$OGG".tags2 else echo COVERART="$APIC" > "$OGG".tags2 fi vorbiscomment -w -R -c "$OGG".tags2 "$OGG" vorbiscomment -a -R -t COVERARTDESCRIPTION="$DESC" "$OGG" vorbiscomment -a -R -t COVERARTMIME="$MIME" "$OGG" vorbiscomment -a -R -c "$OGG".tags "$OGG"  rm -f "$OGG".tags rm -f "$OGG".tags2 
Das Skript wurde hier lustig veröffentlicht. Sie können oggart.tar.gz unter http://www.murga-linux.com/puppy/viewtopic.php?mode=attach&id=44270 herunterladen Jason vor 12 Jahren 0
Ich habe die Skriptformatierung in der Post korrigiert. 3498DB vor 12 Jahren 0
Wenn Sie einen "Syntaxfehler" ("unerwartet" in Ubuntu erhalten, hat dies wahrscheinlich etwas mit der Shell zu tun, die zum Ausführen verwendet wird. Ich habe die erste Zeile in #! / Bin / bash geändert und es hat funktioniert. Dan Gravell vor 11 Jahren 1
Dieses Skript funktioniert nicht für mich. Wie ich sehen kann, wird nur base64 des Bildes verwendet, es muss jedoch ein spezieller Header vorhanden sein Sergey vor 10 Jahren 1
3
Biapy

Ich habe gerade ein Skript geschrieben, das Bilder aus OGG / Vorbis-Dateien mit Vorbiscomment exportiert / importiert. Es ist Teil eines Konvertierungswerkzeugs für Musikbibliotheken.

Das aufschlussreiche Skript befindet sich in der Funktion "mussync-tools-transfert_images" dieses Tools:

https://github.com/biapy/howto.biapy.com/blob/master/various/mussync-tools

Grundsätzlich habe ich einen Leser und einen Autor für das Format metadata_block_picture geschrieben.

Der Code ist ziemlich komplex:

 OUTPUT_FILE="/path/to/my-ogg-file.ogg" IMAGE_PATH="/path/to/my-cover-art.jpg" IMAGE_MIME_TYPE="image/jpeg" # Export existing comments to file. local COMMENTS_PATH="$(command mktemp -t "tmp.XXXXXXXXXX")" command vorbiscomment --list --raw "$" > "$"  # Remove existing images. command sed -i -e '/^metadata_block_picture/d' "$"  # Insert cover image from file.  # metadata_block_picture format. # See: https://xiph.org/flac/format.html#metadata_block_picture  local IMAGE_WITH_HEADER="$(command mktemp -t "tmp.XXXXXXXXXX")" local DESCRIPTION=""  # Reset cache file. echo -n "" > "$"  # Picture type <32>. command printf "0: %.8x" 3 | command xxd -r -g0 \ >> "$" # Mime type length <32>. command printf "0: %.8x" $(echo -n "$" | command wc -c) \ | command xxd -r -g0 \ >> "$" # Mime type (n * 8) echo -n "$" >> "$" # Description length <32>. command printf "0: %.8x" $(echo -n "$" | command wc -c) \ | command xxd -r -g0 \ >> "$" # Description (n * 8) echo -n "$" >> "$" # Picture with <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Picture height <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Picture color depth <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Picture color count <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Image file size <32>. command printf "0: %.8x" $(command wc -c "$" \ | command cut --delimiter=' ' --fields=1) \ | command xxd -r -g0 \ >> "$" # Image file. command cat "$" >> "$"  echo "metadata_block_picture=$(command base64 --wrap=0 < "$")" >> "$"  # Update vorbis file comments. command vorbiscomment --write --raw --commentfile "$" "$"  # Delete cache file. command rm "$" # Delete comments file. command rm "$" 
2
sml

Mir ist nichts bewusst, was dies automatisch tut, indem ich einfach auf das Bild zeige.

Allerdings Vorbis Comment beliebige Tags einbetten kann, müssen Sie nur das Bild in base64 kodieren und dann den Tag in dem richtigen Format zu konstruieren .

z.B vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

Sie müssen diese Schritte in ein Skript irgendeiner Art hacken, damit es nützlich ist.

Das wäre machbar, aber wenn das Bild über 64 KByte groß ist, gibt vorbiscomments "/ usr / bin / vorbiscomment: Argumentliste zu lang" zurück. Irgendeine Idee, wie man das umgehen kann? dmikalova vor 13 Jahren 0
Was ist Ihr System und was ist die Ausgabe von `getconf ARG_MAX`? Leider gibt es keinen Weg an diesem Limit vorbei, ohne den Kernel neu zu kompilieren. Hier auf 64-Bit 2.6.32-24 habe ich 2 MB. sml vor 13 Jahren 0
Ich arbeite mit arch linux 64-bit 2.6.34.1-1 und habe auch 2mb. Wäre es möglich, einen Marker in das Format zu setzen, z. B. vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = marker' file.ogg newfile.ogg, dann etwas die ogg-Datei lesen und den Marker durch das base64-Image ersetzen? dmikalova vor 13 Jahren 0
Absolut. Wenn Sie das von mir verknüpfte Tag-Format angeben, können Sie mit vorbiscomment ein temporäres (kleines) Bild einfügen und dann direkt in die Datei schreiben, indem Sie die letzten beiden Teile des Tags - Datenlänge und die Daten selbst - aktualisieren. Natürlich müssen Sie selbst etwas zusammen hacken. sml vor 13 Jahren 0
Ich probiere Mutagen aus, eine Low-Level-Python-Bibliothek für das Audio-Tagging, und mein vorläufiges Aussehen scheint zu tun, was ich brauche. Ich werde berichten, wenn ich die Dinge herausfinde. dmikalova vor 13 Jahren 0
Ich konnte ein Skript für vorbiscomment schreiben und es funktioniert, allerdings weiß ich immer noch nicht, wie ich ein Bild richtig in base64 konvertieren kann. Folgendes habe ich bisher: base64 --wrap = 0 ./image.jpg> ./image. ./image echo $ Picture vorbiscomment -a -t METADATA_BLOCK_PICTURE = "$ Picture" ./1.ogg Allerdings scheint base64 das Bild zu nehmen und die Kopfzeilen einzuschließen. In ogg funktioniert das Bild dann nicht. Ansonsten funktioniert der Rest des Skripts. dmikalova vor 13 Jahren 0