cacatoès

ffmpeg

A la grande question : est-il possible de recoller des videos de format différents avec ffmpeg, en évitant les transcodages ? Nous devrons répondre par un “houlala, c’est très périlleux”, comme attendu, j’aurai quand même essayé.

Les contraintes techniques :

  • même framerate
  • même résolution
  • même codec
  • bandes audio et video de la même taille sinon la concaténation provoquera une désynchro
  • des sous-titres à décaler

Corriger le framerate

D’abord, extraire la piste video.

Le filtre bsf:v sert à produire une encapsulation minimale afin que le résultat soit lisible par des lecteurs videos.

ffmpeg -i source.mp4 -vcodec copy -bsf:v h264_mp4toannexb output.h264

Ensuite, relire la video en changeant le framerate.

ffmpeg -r 25.000 -i "${fn%.*}.h264" -vcodec copy "${fn%.*}-frameratefixed.mp4"

Problème constaté : le framerate constaté est 25.001, et non pas 25.000.

Corriger la résolution

Là, c’est le filtre scale, avec quelques calculs pour recentrer l’image et créer d’éventuelles bandes noires. Les variables $W et $H indiquent la largeur et hauteur souhaitées.

ffmpeg -i "$fn" -vf "scale=(iw*sar)*min($W/(iw*sar)\,$H/ih):ih*min($W/(iw*sar)\,$H/ih), pad=$W:$H:($W-iw*min($W/iw\,$H/ih))/2:($H-ih*min($W/iw\,$H/ih))/2" "${fn%.*}-scaled.mp4"

Obtenir une info du codec video

Avec mediainfo, le format de la chaîne est mal décrit dans la doc. On peut isoler les valeurs en répétant des commandes du type :

W=$(mediainfo --Inform="Video;%Width%" "$fn")

La concaténation

Le wiki ffmpeg décrit deux modes. Les deux requièrent que les caractéristiques des videos soient semblables (résolution, framerate). Pour l’un, il éxigera aussi le même codec, l’autre effectuera par contre un transcodage.

Le filtre concat est décrit succintement dans la doc.

Production d’un WebM

Ici, on intègre en dur les sous-titres, car c’est destiné à la lecture web, mais on devrait plutôt utiliser vtt

Les critères de qualité sont tirés de cette page.

ffmpeg -i marea.mp4 -vf subtitles=marea.srt -s 1280x720 -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis output.webm