web-dev-qa-db-fra.com

Comment convertir des flux 5.1 AAC en AC3 pour une sortie S / PDIF?

Je connecte mon PC à mon home cinéma via SPDIF, donc lorsque vous regardez des fichiers vidéo qui utilisent les canaux AAC 5.1, il est remixé en stéréo et les canaux surround sont perdus.

J'aimerais pouvoir convertir toutes les sorties 5.1 AAC en 5.1 AC3, donc mon HT joue correctement 6 canaux discrets.

Mon approche actuelle consiste à utiliser avconv pour convertir les flux audio de mes fichiers comme ceci:

avconv -i <inputfile> -codec copy -codec:a ac3_fixed -b:a 448k <outputfile>

Cela fonctionne, mais il présente quelques inconvénients:

  • Tous les flux audio sont convertis en AC3, même ceux dont je n'ai pas besoin ou que je veux, comme stéréo, DTS ou AC3. Je voudrais convertir uniquement les AAC 5.1. La commande doit être suffisamment générique pour que je n'aie pas à inspecter le fichier ou à choisir les flux manuellement.

  • Bien que la conversion fonctionne bien, il y a quelques problèmes: le volume est énorme, fort comme je ne l'ai jamais vu auparavant, et je crains que certaines métadonnées ne soient perdues lors de la conversion.

  • Je dois exécuter ceci pour chaque vidéo que je veux regarder. Cela prend du temps et gaspille beaucoup d'espace sur le disque dur.

Alors, existe-t-il une solution qui corrige au moins un de ces inconvénients?

Approches possibles:

  • Configurer OS (Pulse audio?) Pour encoder le PCM multicanal en AC3 à la volée? (ce serait incroyable, car ce ne serait pas seulement avec des vidéos mais aussi pour des jeux.

  • Correction de ma ligne de commande avec quelques paramètres intelligents

Merci!

1
MestreLion

Vous pouvez définir des codecs pour des flux individuels dans avconv avec -c: n - où n est le numéro du flux. Disons que votre flux AAC est le flux 2 (donc, le troisième flux du conteneur):

avconv -i input.mkv -c copy -c:2 ac3_fixed -b:2 448k output.mkv

Voici un script rapide et sale pour trouver le numéro de flux d'un flux AAC et l'introduire dans avconv:

#!/bin/bash

foo=$(avconv -i "$1" 2>&1 | grep aac | grep 5.1 | sed -e 's/    Stream #0.//' -e 's/(.*//')

avconv -i "$1" -c copy -c:$foo ac3_fixed -b:$foo 448k "AC3-$1"

exit 0

Cela ne fonctionnera pas si vous avez plus d'un flux 5.1 AAC, et cela ne fonctionnera qu'avec des noms de fichier qui ont des espaces si vous les citez. Pour l'utiliser, collez ce morceau de code dans gedit et enregistrez-le en tant que 'aac-only-to-ac3', quelque part dans votre $ PATH (comme ~/bin). Assurez-vous de le rendre exécutable.

Ensuite, pour utiliser le script,

aac-only-to-ac3 input.mkv

et de faire chaque MKV dans un répertoire

for i in *mkv; do aac-only-to-ac3 "$i"; done
2
evilsoup