Existuje způsob, jak číst značky mp3 souboru z prostředí shell? Něco jako:mp3tags MyFile.mp3 author
by měl vypsat značku autora souboru mp3.
Nejlepší odpověď
Můžete také použít ffprobe
který je součástí ffmpeg
.
sudo apt-get install ffmpeg
ffprobe file.mp3
Pokud nechcete další informace, jako je délka stopy a tak dále, můžete výstup zkombinovat s grep:
ffprobe file.mp3 2>&1 | grep -A90 'Metadata:'
Nebo za účelem získání pouze autora:
ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 file.mp3
Ostatní značky můžete vybrat tak, že je oddělíte čárkou, například format_tags=title,album
.
Chtěl jsem vyhledat klíčové slovo ve všech souborech mp3 ve složce. Složka měla 486 souborů, takže bylo zajímavé vědět, které ze zde zmíněných řešení je nejrychlejší. Zde je smyčka, kterou jsem použil:
# sudo apt-get install ffmpeg lltag eyed3 mp3info id3v2 libimage-exiftool-perl libid3-tools id3tool
keyword='fill_me_in'
getTitleFF() { ffprobe "$1" 2>&1 | sed -E -n 's/^ *title *: (.*)/1/p'; }
getTitleLL() { lltag --show-tags title "$1" | sed -nE 's/^ TITLE=(.*)/1/p'; }
getTitleEyed() { eyeD3 2>&1 "$1" | sed -n 's|x1b[[0-9;]*mtitle[^:]*: ||p'; }
getTitleInfo() { mp3info -p %t "$1"; }
getTitleId3() { id3v2 -l "$1" | sed -nE 's/^(TIT2 ([^)]*)|Title *): (.*)/2/p'; }
getTitleExif() { exiftool -title -b "$1"; }
getTitleId3i() { id3info "$1" | sed -nE 's/^=== TIT2 ([^)]*): //p'; }
getTitleTool() { id3tool "$1" | sed -n 's|^Song Title:t||p'; }
for prog in FF LL Eyed Info Id3 Exif Id3i Tool; do
echo "=== getTitle${prog} ==="
time
for file in *.mp3; do
if "getTitle${prog}" "$file" | grep -q "$keyword"; then
echo "$file"
fi
done
done
Poznámky:
lltag
amp3info
nenašel jsem název, protože soubory, které jsem používal, měly tagy ID3v2, viz komentář od @s-prasanth:Jak číst tagy mp3 v shellu?eyeD3
je problematické programově používat, protože používá barevné kódy (tučné písmo).eyeD3
a takéid3v2
(ale pouze pro ID3 v1 tagy) vrátit název a interpreta na stejný řádek, což věci dále komplikuje; protogetTitleEyed
a někdygetTitleId3
vraťte název i interpreta, takže tyto funkce nekopírujte a nevkládejte.-
getTitleId3 bude fungovat pouze pro značky ID3 v2, protože
id3v2
má různé formáty pro ID3v1- a ID3v2-tagy, tj.Title : Artist:
vs. ID3v2:
TIT2 (Title/songname/content description):
-
Jako jediný program z těchto 5
eyeD3
vytiskne červené varování pro dva ze souborů:Invalid mode/bitrate combination for layer II No ID3 v1.x/v2.x tag found!
Zdá se, že tyto dva soubory mají značky ID3v1, protože tyto dva soubory jsou jediné, kde je
lltag
amp3info
může získat titul. Zajímalo by mě, jestli to není chyba veyeD3
protože žádný jiný zde zmíněný program nemá problém s těmito soubory…
Výsledky (v reálném čase):
Program | Version | Time / s
----------+------------+-----------
exiftool | 10.25 | 49.5 ± 0.5
lltag | 0.14.5 | 41 ± 1.0
ffprobe | 3.1.3-1+b3 | 33 ± 0.5
eyeD3 | 0.6.18 | 24 ± 0.5
id3info | 3.8.3 | 4.2 ± 0.1
id3v2 | 0.1.12 | 2.9 ± 0.1
id3tool | 1.2a | 1.7 ± 0.1
mp3info | 0.8.5a | 1.4 ± 0.1
Časově zde vítězí id3tool
(mp3info je rychlejší, ale nefunguje s ID3 v2). id3v2
je také docela rychlý, ale getTitleId3
Tato funkce by vyžadovala úpravu, aby fungovala také se značkami ID3v1, což ji může v nejhorším případě zpomalit faktorem 2.