web-dev-qa-db-fra.com

Comment puis-je extraire par lots de l'audio à partir de fichiers mp4 avec ffmpeg sans décompression (détection automatique du codec audio)?

J'ai 228 fichiers mp4 (2,6 Go) et voudrais en extraire l'audio (mp3 ou ogg). Je veux les extraire par lot - de préférence avec bash. Je ne sais pas si tous les fichiers utilisent le même codec audio, car ils ont été enregistrés au cours d'années différentes, allant de 2006 à 2012.

Je veux les parcourir tous en boucle, choisir le nom du fichier, détecter le codec audio et utiliser ffmpeg pour extraire l'audio.

C'est possible?

19
wryrych

Vous dites que vous voulez "extraire l'audio d'eux (mp3 ou ogg)". Mais que se passe-t-il si l'audio dans le fichier mp4 n'en fait pas partie? il faudrait quand même transcoder. Alors pourquoi ne pas laisser la détection du format audio jusqu’à ffmpeg?

Pour convertir un fichier:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

Pour convertir plusieurs fichiers:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

Vous pouvez bien sûr sélectionner tous les paramètres ffmpeg pour le codage audio que vous aimez, pour définir des paramètres tels que le débit binaire, etc.

Utilisez -acodec libmp3lame et modifiez l'extension de .ogg à .mp3 pour le codage mp3.

Si vous voulez réellement extraire l'audio, vous pouvez simplement "copier" la piste audio dans un fichier à l'aide de -acodec copy. Bien entendu, la principale différence est que le transcodage est lent et nécessite beaucoup de ressources processeur, tandis que la copie est très rapide car vous ne déplacez que des octets d'un fichier à un autre. Voici comment copier uniquement la piste audio (en supposant qu'elle soit au format mp3):

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

Notez que dans ce cas, le format de fichier audio doit être cohérent avec le contenu du conteneur (c.-à-d. Si le format audio est au format AAC, vous devez indiquer audiofile.aac ). Vous pouvez utiliser la commande ffprobepour voir le codec que vous avez. Cela peut fournir des informations:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

Un moyen possible d’analyser automatiquement le codec audio et de nommer le fichier audio en conséquence serait:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

Remarques: les fichiers de sortie sont créés dans le sous-répertoire outputqu'il crée au début (si nécessaire). Pour les codecs autres que mp3 et vorbis, il convertit l'audio en ogg. Ubuntu 14.04 n'a pas ffmpeg dans les référentiels standard, mais vous pouvez ajouter un référentiel ppa: mc3man/trusty-media et installer le paquet ffmpeg pour obtenir le logiciel nécessaire. Voir ici pour plus de détails.

28
roadmr

Comme l'a dit Nicolas Raoul, cela nécessite une mise à jour. Voici la même ligne que roadmr a donnée mais en utilisant avconv à la place:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done

1
Scooby-2