Étant donné que le format m4a n'est qu'un conteneur et qu'il peut contenir de la musique codée avec un codec avec perte (AAC) ou sans perte (ALAC), existe-t-il un moyen simple de déterminer quel codec a été utilisé pour un fichier donné ?
Réponses
Trop de publicités?Lorsque j'utilise le file
sur un fichier .m4a, je reçois une réponse générique "ISO Media, Apple iTunes ALAC/AAC-LC (.M4A) Audio" pour les fichiers AAC et ALAC. Il me vient à l'esprit deux autres approches qui ne nécessitent ni la main lourde d'iTunes ni l'installation d'un nouveau logiciel :
-
Ouvrez le fichier audio en question avec QuickTime Player. Sélectionnez "Show Movie Inspector" dans le menu "Window" (ou appuyez sur -i) pour voir la taille du fichier, le débit de données et le codec utilisé pour sa création.
-
Utilisez le
afinfo
(audio file info) dans Terminal.app pour obtenir plus d'informations que celles fournies par QuickTime Player. Voici quelques exemples de résultats :$ afinfo /Users/admin/Desktop/01\ The\ Guns\ of\ August\ 1.m4a Num Tracks: 1 Data format: 2 ch, 44100 Hz, 'alac' (0x00000001) from 16-bit source 4096 frames/packet Channel layout: Stereo (L R) estimated duration: 18702.930431 sec audio bytes: 1006059541 audio packets: 201367 bit rate: 430332 bits per second packet size upper bound: 12334 maximum packet size: 12334 audio data file offset: 48 optimized audio 824799232 valid frames + 0 priming + 0 remainder = 824799232
Pour les lecteurs qui ne sont pas familiers avec l'utilisation du terminal, c'est assez simple, et vous ne casserez rien. Ouvrez le Terminal, et tapez - ou coupez et collez depuis le bas - le mot afinfo suivi d'un simple espace :
afinfo
Ensuite, faites glisser un fichier audio vers la fenêtre du terminal et déposez-le. Vous verrez que le chemin du fichier sera ajouté à la commande afinfo. Si, en faisant glisser l'icône, le Finder est devenu le processus actif, vous devrez cliquer sur la fenêtre du Terminal pour le réveiller avant l'étape finale consistant à appuyer sur la touche Entrée pour exécuter la commande. Si vous le souhaitez, vous pouvez obtenir des informations sur plusieurs fichiers à la fois en faisant glisser et en déposant plusieurs icônes au lieu d'une seule. Lorsque vous avez terminé, quittez Terminal.app comme vous le feriez pour n'importe quel autre programme.
Je voulais faire cela afin d'identifier quels fichiers m4a dans un dossier étaient ALAC et quels étaient AAC. Il est facile de faire cela sur un dossier entier comme celui-ci :
afinfo ./*.m4a |grep -B 4 alac
ce qui donne un résultat comme :
File: Track 09.m4a
File type ID: m4af
Num Tracks: 1
----
Data format: 2 ch, 44100 Hz, 'alac' (0x00000001) from 16-bit source, 4096 frames/packet
Pour obtenir les noms de fichiers, j'ai utilisé ceci :
afinfo ./*.m4a |grep -B 4 alac |grep File: |sed 's/.*\///'
résultant en :
Track 09.m4a
J'ai fini par chercher ce type de question car j'avais besoin de regarder le niveau supérieur de mon disque dur de musique pour identifier lesquelles étaient alac
afin que je puisse les convertir en m4a(aac) compressé pour une meilleure compatibilité avec les plateformes.
J'ai écrit une fonction qui regarde récursivement le dossier courant ( c'est-à-dire si vous avez besoin d'aller plus loin que le répertoire de travail sur lequel vous l'avez exécutée )
si vous devez modifier la profondeur, le -maxdepth
peut être ajoutée à l'option find
dans $m4a_files
ainsi que de spécifier des chemins à ne pas regarder, comme je l'ai fait avec ! -path "*.app*"
.
J'ai utilisé echo
pour imprimer la commande dans une variable et l'exécuter via eval
parce que j'ai eu des problèmes ici et dans le passé avec d'autres outils en ligne de commande ( comme qpdf
) itérant la sortie de find
dans un autre outil via une boucle for.
allu () {
# alac lookup
echo
echo "looking up m4a files"
echo
# bypasses paths with .app in their name so if you run it on some place like ~/Downloads
# and you have an app downloaded there it won't look in it
m4a_files=$( echo $( find . -name "*.m4a" ! -path "*.app*" | sed "s|.*|\"&\"|" ) );
# syntax afinfo $m4a_files |grep -B 4 m4a |grep File: |sed 's/.*\///'
echo 'checking for alac'
echo
# looks alac files up
file_lookup_merger=$( echo "afinfo" $m4a_files "|grep -B 4 alac |grep File: |sed 's/.m4a*\///'" ) ;
# uses eval to return the list of files it found *with srnd. quotes*
eval $file_lookup_merger |sed 's/File: //'| sed "s|.*|\"&\"|";
}
Edit : Un jour plus tard, après avoir écrit ce qui précède, j'ai voulu écrire une version plus simple et plus compatible qui fonctionne à la fois sur Mac et Linux. J'ai donc écrit une version utilisant Exiftool de Phillip Harvey. https://exiftool.org/ ( installation homebrew ) https://formulae.brew.sh/formula/exiftool#default
# finds alac files
( find . -name *.m4a -exec exiftool -T -audioformat -filepath {} \; )|grep alac
# prints list of alac files for use as a string separated by spaces
echo $( ( find . -name *.m4a -exec exiftool -T -audioformat -filepath {} \; )|grep alac |sed 's.alac..g'|sed "s|.*|\"&\"|")|sed 's." /."/.g'