web-dev-qa-db-fra.com

Comment changer le framerate d'une vidéo sans reencodage

J'essaie de changer le nombre d'images par seconde d'une vidéo MP4 (c'est une vidéo GoPro à 120 images par seconde, je veux la lire à 30 images par seconde pour obtenir un effet de ralenti).

J'utilise avconv pour cela:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

Cela fonctionne techniquement, mais cela réencode le film. En plus d'être lent, c'est évidemment un problème de qualité. Techniquement, il devrait y avoir un moyen de simplement définir le fps dans l'en-tête de la vidéo, comment puis-je changer cela? (N'importe quel outil autre que avconv fonctionnerait aussi.)

14
EboMike

MP4Box peut le faire.

La commande

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

crée les fichiers test et test_track1.h264. Vous pouvez maintenant créer un fichier mp4 avec la fréquence d'images prise en charge de votre choix (30 dans cet exemple):

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Box fait partie du paquetage gpac, assurez-vous qu'il est installé.

15
Mitch

Changer le nombre d'images par seconde dans l'en-tête de la vidéo (conteneur) n'a aucun effet sur le flux vidéo (ou audio) lui-même. Le recodage est la seule option.

Les séquences vidéo ont des horodatages et dans la plupart des vidéos, les images sont interdépendantes en raison de la compression inter-images. Certains joueurs peuvent accélérer et ralentir la vidéo, mais pas avec des commandes intégrées ou quelque chose du genre. Aucun joueur ne peut changer le framerate à la volée quand une commande de conteneur le lui demande. Le fichier vidéo finira par être hors spécifications (c'est-à-dire ne pas respecter les normes) et 99,9% des joueurs refuseront de s'y conformer. Il est tout à fait impossible de faire ce que vous voulez sans recoder. Bien sûr, vous pouvez attendre la dernière étape de votre édition avec recodage.

6
thom

Si votre objectif principal est de le lire au ralenti et de ne pas conserver le fichier au format MP4, vous pouvez utiliser l’outil graphique MKVmerge pour le remuxer dans un conteneur Matroska, ce qui permet de modifier facilement le framerate. Le remixage est bien meilleur que le réencodage, car il ne modifie que les métadonnées, et non le flux lui-même.

D'abord, vous installez le paquet

Sudo apt-get install mkvtoolnix-gui

Ensuite, vous démarrez MKVmerge GUI. Vous serez confronté à une fenêtre comme celle-ci

mkvmerge gui 1

Appuyez simplement sur le bouton Ajouter et sélectionnez votre fichier ou faites simplement glisser-déposer le fichier dans la zone "Fichiers d'entrée". À ce stade, vous devriez pouvoir sélectionner le flux vidéo dans votre vidéo. Vous pouvez également supprimer d'autres flux, car ils ne feront que gêner de toute façon.

Après l'avoir sélectionné, vous devriez voir les onglets du bas devenir actifs:

enter image description here

Changer en "Formater des actions spécifiques"

enter image description here

Vous pouvez voir qu'il existe un champ "FPS", où vous pouvez entrer la valeur des images par seconde. On aurait dit que vous aviez l'intention de ralentir les choses quatre fois, votre objectif serait donc de 7 images par seconde. Vous pouvez également utiliser l'option "Étirer par".

Après cela, vous pouvez simplement changer le nom du fichier de sortie (si vous le souhaitez) et cliquer sur "Démarrer le multiplexage".

Le programme fonctionnera et vous devriez avoir votre fichier.

3
v010dya

Je voulais aussi ralentir sans perte mes films de 120 FPS à 30 FPS. J'ai créé un script qui modifie le tempo du son et le FPS directement dans le conteneur MP4. Les outils suivants sont requis:

  1. avconv pour convertir les flux audio
  2. sondstretch pour ralentir le tempo audio
  3. gpac pour obtenir MP4Box pour changer de FPS

Le script utilisé pour la conversion est ici:

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE="$1"
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

Ce script crée une copie de MP4 avec _slow postfix.

2
OSi