Découper un fichier audio/vidéo sans le recompresser/réencoder
Aujourd’hui, et au risque de me faire taper sur les doigts, je vais vous montrer quelque chose de bien illégal, que je ne recommande pas, mais qui va me permettre de vous démontrer un peu plus la puissance de ffmpeg en tant que couteau suisse du multimédia. Quand l’offre légale ne permet pas de profiter de la musique dans des conditions acceptables, les bidouilleurs prennent la relève !
Vous avez certainement déjà croisé des compilations ou des albums complets sur YouTube, qui se matérialisent donc sous la forme de vidéos d’une ou deux heures voire plus, avec en description une playlist avec des timecodes. Dernièrement, après avoir écouté l’une d’entre elles, j’ai été frustré de ne pouvoir trouver l’intégralité des morceaux de cette compilation de manière légale en achat à l’unité (principalement Amazon pour moi, n’ayant rien d’autre sous la main) : certains ne sont dispos qu’en streaming, très rares ceux qui sont sur Bandcamp -ce qui est quand même cool-, d’autres sont à acheter physiquement mais à importer depuis d’autres pays pour un surcoût pas raisonnable du tout et qui ne rentrera pas dans les poches de l’artiste de toute façon. Du coup l’idée a germé dans mon esprit de faire mon gros pirate. Après tout, c’est déjà plus ou moins ce que je fais pour regarder YouTube dans mon salon, alors…
NB : par la suite l’URL de la vidéo a été volontairement modifiée. Je rappelle en outre que ce que je présente est la plupart du temps illégal, d’autant que ces compilations sont réalisées sans l’accord des artistes. Donc quand c’est possible, achetez directement à la source, c’est bien plus sympa pour eux, et BandCamp est super cool pour ça. Aussi, si vous pêchez un peu, je vous invite à relire les termes expliqués sur le multimédia pour mieux comprendre certains points de vocabulaire.
Première étape : récupération de l’audio dans le bon format
Malheureusement, l’audio est comme trop souvent le parent pauvre dans l’affaire : si YouTube propose 4K, 360, VR et tout le toutim pour la vidéo, l’audio, au max, tient à du 192kbps au format m4a inséré dans un conteneur MP4 « legacy » en 720p, ou 160kbps en Opus pour les autres via DASH. C’est pas folichon par rapport à du FLAC (j’aurai peut-être l’occasion d’y revenir dans un autre article) ou du MP3 320kbps, mais j’ai décidé de me tourner vers Opus du coup. Pour info, Opus est un codec libre de compression et diffusion audio, qui peut être utilisé aussi bien en fichier qu’en streaming live (notamment utilisé sur Mumble et donc sur Youtube pour les vidéos et les lives).
YouTube introduit une subtilité cependant : le flux est récupéré dans un conteneur Webm (simplification du MKV par Google pour embarquer de la vidéo VP8/9, concurrent du H264, utilisé notamment sur Youtube, et pour le Web de manière générale, d’où son nom). Pas vraiment ce qu’on recherche pour lancer un programme de gestion et de lecture de bibliothèque musicale.
On y va quand même :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[seboss666@seboss666-ltp ~/Téléchargements ]$ youtube-dl -F https://www.youtube.com/watch?v=MT0Bqzd3SRY [youtube] MT0Bqzd3SRY: Downloading webpage [youtube] MT0Bqzd3SRY: Downloading video info webpage [youtube] MT0Bqzd3SRY: Extracting video information [youtube] MT0Bqzd3SRY: Downloading js player vflrwQIQw [youtube] MT0Bqzd3SRY: Downloading js player vflrwQIQw [youtube] MT0Bqzd3SRY: Downloading MPD manifest [info] Available formats for MT0Bqzd3SRY: format code extension resolution note 139 m4a audio only DASH audio 55k , m4a_dash container, mp4a.40.5@ 48k (22050Hz), 41.03MiB 249 webm audio only DASH audio 72k , opus @ 50k, 43.72MiB 250 webm audio only DASH audio 90k , opus @ 70k, 57.96MiB 140 m4a audio only DASH audio 134k , m4a_dash container, mp4a.40.2@128k (44100Hz), 109.58MiB 171 webm audio only DASH audio 152k , vorbis@128k, 111.64MiB 251 webm audio only DASH audio 169k , opus @160k, 114.09MiB 278 webm 256x144 144p 61k , webm container, vp9, 30fps, video only, 20.88MiB 242 webm 426x240 240p 75k , vp9, 30fps, video only, 37.00MiB 243 webm 640x360 360p 110k , vp9, 30fps, video only, 73.01MiB 160 mp4 256x144 DASH video 134k , avc1.4d400c, 30fps, video only, 57.90MiB 134 mp4 640x360 DASH video 145k , avc1.4d401e, 30fps, video only, 79.14MiB 244 webm 854x480 480p 169k , vp9, 30fps, video only, 116.69MiB 133 mp4 426x240 DASH video 229k , avc1.4d4015, 30fps, video only, 98.79MiB 135 mp4 854x480 DASH video 259k , avc1.4d401f, 30fps, video only, 139.97MiB 247 webm 1280x720 720p 318k , vp9, 30fps, video only, 195.60MiB 136 mp4 1280x720 DASH video 473k , avc1.4d401f, 30fps, video only, 241.37MiB 248 webm 1920x1080 1080p 780k , vp9, 30fps, video only, 357.83MiB 137 mp4 1920x1080 DASH video 818k , avc1.640028, 30fps, video only, 375.13MiB 17 3gp 176x144 small , mp4v.20.3, mp4a.40.2@ 24k 36 3gp 320x180 small , mp4v.20.3, mp4a.40.2 43 webm 640x360 medium , vp8.0, vorbis@128k 18 mp4 640x360 medium , avc1.42001E, mp4a.40.2@ 96k 22 mp4 1280x720 hd720 , avc1.64001F, mp4a.40.2@192k (best) |
Je me tourne donc vers le code 251 pour récupérer le flux Opus dans un conteneur Webm :
1 2 3 4 5 6 7 8 9 |
[seboss666@seboss666-ltp ~/Téléchargements ]$ youtube-dl -f 251 https://www.youtube.com/watch?v=MT0Bqzd3SRY [youtube] MT0Bqzd3SRY: Downloading webpage [youtube] MT0Bqzd3SRY: Downloading video info webpage [youtube] MT0Bqzd3SRY: Extracting video information WARNING: unable to extract uploader nickname [youtube] MT0Bqzd3SRY: Downloading js player en_US-vfln4fWRV [youtube] MT0Bqzd3SRY: Downloading MPD manifest [download] Destination: Epic Compilation-MT0Bqzd3SRY.webm [download] 100% of 114.09MiB in 01:42 |
J’ai le donc le fichier Webm, je voudrais que ça soit maintenant un fichier exploitable par des lecteurs de musique (Amarok, Clementine, RythmBox, Banshee), mais je veux éviter de recompresser au passage, ce qui dégraderait la qualité. ffmpeg sait faire, c’est cool :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[seboss666@seboss666-ltp ~/Téléchargements ]$ ffmpeg -i Epic\ Compilation-MT0Bqzd3SRY.webm -vn -acodec copy Epic\ Compilation-MT0Bqzd3SRY.opus ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 7.1.1 (GCC) 20170630 configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxvid --enable-shared --enable-version3 libavutil 55. 58.100 / 55. 58.100 libavcodec 57. 89.100 / 57. 89.100 libavformat 57. 71.100 / 57. 71.100 libavdevice 57. 6.100 / 57. 6.100 libavfilter 6. 82.100 / 6. 82.100 libavresample 3. 5. 0 / 3. 5. 0 libswscale 4. 6.100 / 4. 6.100 libswresample 2. 7.100 / 2. 7.100 libpostproc 54. 5.100 / 54. 5.100 Input #0, matroska,webm, from 'Epic Compilation-MT0Bqzd3SRY.webm': Metadata: encoder : google Duration: 02:00:34.82, start: -0.007000, bitrate: 132 kb/s Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default) Output #0, opus, to 'Epic Compilation-MT0Bqzd3SRY.opus': Metadata: encoder : Lavf57.71.100 Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default) Metadata: encoder : Lavf57.71.100 Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help size= 115227kB time=02:00:34.82 bitrate= 130.5kbits/s speed=2.79e+03x video:0kB audio:114328kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.786729% [seboss666@seboss666-ltp ~/Téléchargements ]$ file Epic\ Compilation-MT0Bqzd3SRY.opus Female Metal Vocals _ Epic Compilation-MT_Bqzd3SRY.opus: Ogg data, Opus audio, |
Deux petites choses à retenir ici : par principe, je demande à retirer tout flux vidéo qui pourrait se trouver là (-vn
), et je dis à ffmpeg de ne pas recompresser/réencoder le flux (-acodec copy
). Simple, efficace, et on a notre flux exploitable. Au passage on gagne 1Mo à passer à un conteneur audio/vidéo à audio pur (ogg en l’occurrence qui avait d’abord été créé pour embarquer du Vorbis, un autre codec audio qu’on comparait au MP3 à sa création).
Deuxième étape : les coups de ciseaux logiciel
Bien, maintenant on veut un fichier par morceau, ce qui est bien plus pratique, si par exemple comme moi vous laissez l’autoradio de la voiture en mode shuffle, ce qui peut conduire à 4h de route sans entendre deux fois le même artiste ou le même morceau; et ça c’est cool.
Dans mon cas j’ai les timecodes, mais si vous ne les avez pas, vous pouvez toujours utiliser Audacity pour visualiser le son du fichier et déterminer où couper, l’ouverture prend du temps (un peu plus d’une minute dans mon cas), mais voilà le résultat :
Alors oui, certains me diront qu’on pourrait potentiellement tout faire avec Audacity, je ne sais pas s’il permet d’éviter de recompresser, sachant que techniquement il « importe » le fichier quand on l’ouvre pour pouvoir le manipuler (et donc recompresse à l’exportation). Et puis c’est pas assez geek, mince. Bref, ici, vous avez compris que je vais essayer d’extraire le morceau qui semble un peu plus calme que les autres (moins saturé).
Le morceau commence à 26:48 et termine à 33:21, ce qui donne un morceau de 6 minutes 33 secondes. Ce sont ces éléments que l’on va passer à ffmpeg pour faire le taf :
1 |
ffmpeg -i Epic\ Compilation-MT0Bqzd3SRY.opus -ss 00:26:48.0 -t 00:06:33.0 -acodec copy Epic\ Compilation-Track06.opus |
On passe donc la position de départ (-ss
), la durée du morceau (-t
) et comme tout à l’heure on indique de ne pas réencoder (-acodec copy
). A noter que j’indique un .0 à la fin de la seconde, en effet, lors d’une première mesure avec Audacity j’étais plutôt sur une base de 6 minutes 32 secondes et 5 dixièmes. J’aurai pu donc indiquer une durée de 00:06:32.5.
L’opération est très rapide, et si on vérifie le fichier de sortie :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[seboss666@seboss666-ltp ~/Téléchargements ]$ ffmpeg -i Epic\ Compilation-Track06.opus ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 7.1.1 (GCC) 20170630 configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxvid --enable-shared --enable-version3 libavutil 55. 58.100 / 55. 58.100 libavcodec 57. 89.100 / 57. 89.100 libavformat 57. 71.100 / 57. 71.100 libavdevice 57. 6.100 / 57. 6.100 libavfilter 6. 82.100 / 6. 82.100 libavresample 3. 5. 0 / 3. 5. 0 libswscale 4. 6.100 / 4. 6.100 libswresample 2. 7.100 / 2. 7.100 libpostproc 54. 5.100 / 54. 5.100 Input #0, ogg, from 'Epic Compilation-Track06.opus': Duration: 00:06:33.02, start: 0.020000, bitrate: 133 kb/s Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp Metadata: LANGUAGE : eng ENCODER : Lavf57.71.100 |
Une petite passe dans Audacity pour confirmer la bonne opération :
Et voilà. Ne reste plus qu’à faire la même avec les autres morceaux, à rajouter les noms et pourquoi pas des tags, convertir dans un autre format si vous ne pouvez pas lire de l’Opus dans votre voiture par exemple (préférez un bitrate assez élevé en destination pour ne pas trop distordre les morceaux et perdre en qualité, on part d’un Opus 160kbps en VBR tout de même).
Attention, on se rend compte que le morceau final ne fait que 6:32 et pas 6:33 comme je l’ai indiqué. Ça peut arriver (j’ai déjà eu l’occasion d’avoir les détails technique du pourquoi, j’ai pas tout compris et c’était en anglais), si vous avez également ce genre d’écart et qu’il vous manque quelques notes à la fin, n’hésitez pas à ajuster avec les dixièmes de secondes voire rajouter une seconde, étant donné la vitesse du traitement, ça ne sera pas long à refaire.
Un outil vraiment cool, et multi-plateforme en plus
En effet, même les windowsiens peuvent expérimenter ce que je présente aujourd’hui puisqu’il existe une version compilée pour eux. C’est d’ailleurs un outil recommandé si vous utilisez également Youtube-dl aussi sous Windows…
Cette trousse à outils est d’ailleurs au cœur d’autres logiciels plus ou moins connus de nos jours. J’ai évoqué en introduction l’aspect couteau suisse, ce n’est pas pour rien, et c’est une expression que j’ai déjà pu employer à propos de VLC Media Player, qui utilise la bibliothèque comme base pour son support des différents formats existants de vidéo et d’audio. On le retrouve aussi dans différents outils de conversion vidéo, soit de manière explicite, soit un peu plus masqué (ce qui est souvent le cas sous Windows malheureusement). L’utilitaire Youtube Downloader HD l’exploite lorsqu’il a besoin de fusionner des flux DASH si vous avez sélectionné une résolution type Full HD/4K.
Bref, c’est un très bon outil qu’il faut garder sous la main en cas de besoin (surtout sa documentation), la preuve, ici j’ai présenté comment découper, mais on peut aussi fusionner :P.
Pourquoi faudra-t-il que ce soit forcément illégal ?
https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000033219336&cidTexte=LEGITEXT000006069414&dateTexte=20170730
» l’auteur ne peut interdire… » 😉