GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak číst značky MP3 v prostředí Shell?

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 a mp3info 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; proto getTitleEyed a někdy getTitleId3 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 a mp3info může získat titul. Zajímalo by mě, jestli to není chyba v eyeD3 protože žádný jiný zde zmíněný program nemá problém s těmito soubory…

Související:Prázdné (chybějící) ligatury (tt, ti, fi, ff atd.) ve FF při použití písem Cambria / Calibri?

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.


Ubuntu
  1. Jak vytvořit Git Tagy

  2. Jak číst proměnnou ze souboru?

  3. Přidání značek Replaygain?

  1. Jak změnit Shell v Linuxu

  2. Jak načtu zdrojový kód příkazů shellu?

  3. Jak číst odezvu websocket v linuxovém shellu

  1. Jak nainstalovat Zsh na Ubuntu 20.04?

  2. Jak číst celý skript Shell před jeho spuštěním?

  3. Jak číst výsledky „service – status-all“?