Encodage audio

Maintenant que tu sais (au moins à peu près) comment te servir de ffmpeg, parlons un peu plus d'encodage, et d'abord d'encodage audio.

Encore une fois le plus important est de comprendre ce qu'on fait et pour ça rien de mieux que ffprobe. Pour cette partie je vais cacher les infos de la vidéo puisqu'elles ne nous intéressent pas pour le moment.

Un audio déjà encodé dans un format lossy

$ ffprobe 'in.mkv'
Input #0, matroska,webm, from 'in.mkv':
  Duration: 00:01:30.09, start: 0.000000, bitrate: 8173 kb/s
    Stream #0:1(jpn): Audio: aac (LC), 48000 Hz, stereo, fltp (default)

Ici, la source est déjà encodée en AAC donc on va éviter de réencoder l'audio si on doit réencoder la vidéo. Pour cela il faut préciser dans la commande ffmpeg que l'on veut copier l'audio du fichier d'entrée vers le fichier de sortie.

$ ffmpeg -i 'in.mkv' -c:a copy 'out.aac'

A priori si le fichier d'entrée est dans un format lossy tu devras toujours faire une copie de l'audio. Le seul cas où tu pourrais penser à réencoder c'est si l'audio est dans un format extrèment bizarre qui n'est pas supporté par mkv (comme Bink audio).

Un audio dans un format lossless

$ ffprobe 'in.mkv'
Input #0, matroska,webm, from 'in.mkv':
  Duration: 00:01:32.10, start: 0.000000, bitrate: 33724 kb/s
    Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)

La source est en FLAC donc un format lossless qu'on va réencoder en AAC.

$ ffmpeg -i 'in.mkv' -c:a aac -b:a 128k 'out.aac'

Si tu arrives à installer le codec libfdk_aac il est sensé être un peu plus efficace que aac. Il a une option -vbr qui permet de viser une qualité audio plutôt qu'un bitrate de sortie (un peu comme l'option -crf pour la vidéo):

$ ffmpeg -i 'in.mkv' -c:a libfdk_aac -vbr 5 'out.aac'

Et sinon tu peux également utiliser le codec libopus qui est le plus efficace (d'après à peu près tous les tests que j'ai pu voir):

$ ffmpeg -i 'in.mkv' -c:a libopus -b:a 128k 'out.opus'

Un audio lossless mais pas en stéréo

Si le fichier d'entrée n'est pas en stéréo et que l'on donne un bitrate à viser dans notre commande ffmpeg il faut bien faire attention à donner un bitrate suffisant pour que l'audio soit de bonne qualité. Il faut généralement 64 kb/s par channel audio. Donc 128 kb/s pour du stéréo, 256 kb/s pour 4 channels et 374 kb/s pour du 6 channel.

Input #0, mpegts, from '00004.m2ts':
  Duration: 03:17:08.48, start: 4344.833333, bitrate: 27267 kb/s
    Stream #0:2[0x1101]: Audio: dts (DTS-HD MA) ([134][0][0][0] / 0x0086), 48000 Hz, 5.1(side), s16p

Ici, le 5.1(side) veut dire qu'il y a 6 channels dans ce fichier1, il faudra donc en prendre compte lors de l'encodage.

$ ffmpeg -i '00004.m2ts' -c:a libopus -b:a 374k 'out.opus'

Et maintenant le piège

$ ffmpeg 'in.mkv'
Input #0, matroska,webm, from 'in.mkv':
  Duration: 00:01:30.55, start: 0.000000, bitrate: 3045 kb/s
    Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s (default)

Ici, on voit que l'audio est dans le format pcm_s16le. Globalement, c'est le format d'un fichier WAV et c'est donc de l'audio lossless. Mais dans ce cas là il vaut mieux ne pas le réencoder. Et là tu vas me dire:

Mais t'as dit l'inverse 2 lignes au dessus

Et oui c'est vrai mais ce fichier fait peur pour plusieurs raisons. Déjà il est rare de voir un audio en format pcm dans une vidéo parce que c'est de l'audio non compressé, le seul cas possible serait que le fichier vienne d'un bluray et que personne ait pensé à réencoder l'audio en FLAC par exemple (qui est lossless mais compressé donc on peut gagner quelques MB sur la vidéo). Et encore dans ce cas là on devrait voir du pcm_bluray:

Input #0, mpegts, from '00004.m2ts':
  Duration: 03:17:08.48, start: 4344.833333, bitrate: 27267 kb/s
    Stream #0:1[0x1100]: Audio: pcm_bluray (HDMV / 0x564D4448), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s
    Stream #0:2[0x1101]: Audio: dts (DTS-HD MA) ([134][0][0][0] / 0x0086), 48000 Hz, 5.1(side), s16p
    Stream #0:3[0x1102]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 640 kb/s

Bon si c'était que ça il se pourrait que ça soit juste un gars qui a oublié de réencoder et du coup c'est resté en pcm_s16le. Mais on peut voir le bitrate total du fichier juste au dessus: 3045 kb/s
On a donc ici un stream audio qui est plus grand que le stream vidéo. Donc ma théorie c'est que ce fichier est une source de merde et que l'audio en "pcm" est en fait du mp3 qui a été réencodé en pcm et si tu réencodes encore l'audio il y a moyen que ça fasse mal aux oreilles au prochain kara. Donc il vaudrait mieux aller chercher une autre source parce que celle-là elle fait peur.

tl;dr: Si tu vois un fichier comme ça, c'est probablement que t'as regardé des vieilles vidéos dans notre base, et ce paragraphe est là pour te décourager de réencoder leur audio en masse.