Si je dois simplement recadrer l'audio/la vidéo à partir d'une piste plus longue, que puis-je utiliser? J'ai essayé OpenShot, mais je trouve l'export vidéo lent, peut-être compile-t-il toutes les "couches" dans un nouveau film? Peut-être ai-je juste besoin d'un outil de recadrage simple pour l'audio/la vidéo qui suffira?
Réponses
Trop de publicités?Si vous voulez une application GUI, vous pouvez utiliser dmMediaConverter, un frontend ffmpeg, qui a une fonction de division, sans réencodage, rapide. Il suffit d'ajouter les points de division et d'appuyer sur Exécuter. De plus, il peut faire beaucoup d'autres choses. http://dmsimpleapps.blogspot.ro/2014/04/dmmediaconverter.html
J'ai écrit un assistant pour ffmpeg qui imite la syntaxe de substr()
.
Utilisation
ffslice fichier [début [durée [fichier_sortie [arguments_ffmpeg]]]]
Exemples
# Obtenir les 5 dernières minutes d'un MP3
ffslice input.mp3 -5:00
# Obtenir les 30 premières secondes d'un webm
ffslice input.webm 0 30
# Obtenir 5 minutes de vidéo à partir de 2 minutes
ffslice input.mp4 2:00 5:00
Code
#!/bin/bash
# substr() pour les fichiers encodés en MPEG
fichier="$1"; shift
début="$1"; shift
fin="$1"; shift
fichier_sortie="$1"; shift
arguments=()
# Convertir le temps en secondes
# https://unix.stackexchange.com/questions/412868/bash-reverse-an-array
timetosec() {
rev="$(<<< "$1" tr ':' '\n' | sed 's/^0\+\([0-9]+\)/$1/' | tac | tr '\n' ' ')"
IFS=' ' read -a times <<< "$rev"
let secs="${times[0]:-0} + (${times[1]:-0} * 60) + (${times[2]:-0} * 3600)"
printf '%i' "$secs"
}
# Fichier d'entrée requis
if [ -z "$fichier" ]; then
echo "Utilisation: $(basename -- "$0") fichier [début [fin [fichier_sortie [arguments_ffmpeg]]]]" >&2
echo "Exemple: $(basename -- "$0") input.mp3 -5:00" >&2
exit 1
fi
# Début (les nombres négatifs commencent depuis la fin)
if [ "${début:0:1}" = "-" ]; then arguments+=('-sseof' "$début")
elif [ -n "$début" ]; then arguments+=('-ss' "$début")
fi
# Entrée
arguments+=('-i' "$fichier")
# Fin (utilisez + ou - pour spécifier par rapport au point de départ)
if [ "${fin:0:1}" = "+" ]; then arguments+=('-to' "$fin")
elif [ "${fin:0:1}" = "-" ]; then arguments+=('-sseof' "$fin")
elif [ -n "$fin" ]; then
let durée="$(timetosec "$fin") - $(timetosec "$début")"
arguments+=('-to' "$durée")
fi
# Nom de fichier de sortie par défaut
nomfichier=$(basename -- "$fichier")
extension="${nomfichier##*.}"
nomfichier="${nomfichier%.*}"
fichier_sortie_par_defaut="${nomfichier}-${début}-${fin}.${extension}"
if [ -z "$fichier_sortie" ]; then
fichier_sortie="$fichier_sortie_par_defaut"
elif [ -d "$fichier_sortie" ]; then
fichier_sortie="${fichier_sortie}/${fichier_sortie_par_defaut}"
fi
# Ne peut pas avoir de deux points dans le nom de fichier avec ffmpeg
# https://unix.stackexchange.com/questions/412519/ffmpeg-protocol-not-found-for-normal-file-name
fichier_sortie="$(printf '%s' "$fichier_sortie" | sed 's/:/./g')"
# Découper l'audio
ffmpeg "${arguments[@]}" -c copy "$@" "$fichier_sortie" 1>&2
# Afficher l'emplacement final
printf '%s' "$(readlink -f "$fichier_sortie")"
Mise en garde
Remarquez que ffmpeg ne fera la découpe qu'aux images clés. Cela fonctionne généralement assez bien pour la plupart des cas, mais si vous avez besoin de segments vidéo précis, consultez Comment extraire des segments vidéo précis avec ffmpeg?. Vous pouvez forcer toutes les images clés nécessaires avant de découper.
Utilisez ceci
Je l'ai écrit pour couper les publicités des vidéos TV enregistrées. En utilisant le remuxer inclus, vous n'avez même pas besoin de le recoder. Il n'y a rien de fantaisiste à ce sujet. Juste rapide.
Pour juste recadrer sans transcodage
(copier plutôt), je suggère un script yad à exécuter à partir d'un lanceur de fichiers de bureau.
J'ai trouvé le script ici.
Je l'ai modifié un peu pour inclure les formats vidéo et éviter le transcodage.
Il ressemble à ça:
#!/bin/bash
INPUT=$(yad --width=600 --height=400 --file-selection --file-filter='*.mp3 *.mp4 *.avi *.m4a *.ogg *.flac *.aac *.opus')
eval $(yad --width=400 --form --field=start --field=end --field=output:SFL "00:00:00" "00:00:00" "${INPUT/%.*}-out.${INPUT##*.}" | awk -F'|' '{printf "START=%s\nEND=%s\nOUTPUT=\"%s\"\n", $1, $2, $3}')
[[ -z $START || -z $END || -z $OUTPUT ]] && exit 1
DIFF=$(($(date +%s --date="$END")-$(date +%s --date="$START")))
OFFSET=""$(($DIFF / 3600)):$(($DIFF / 60 % 60)):$(($DIFF % 60))
ffmpeg -ss "$START" -t "$OFFSET" -i "$INPUT" -c copy -map 0 "$OUTPUT"
Donc, installez yad
, enregistrez le script sous cut_audio-video.sh
et rendez-le exécutable.
Ensuite, créez le fichier ~/.local/share/applications/cut-audio-video.desktop
similaire à:
[Desktop Entry]
Name=Couper audio & vidéo
Exec=/CHEMIN/VERS/cut_audio-video.sh
Icon=/QUELQUE/ICONE/Audio-icon.png
Terminal=false
Type=Application
Categories=GNOME;GTK;Paramètres;ParamètresMatériels;X-GNOME-Panel de paramètres;Système;
Modifiez les lignes Exec
et Icon
.
Ensuite, il peut être exécuté avec un lanceur d'applications comme Synapse:
Sélectionnez le fichier, puis entrez l'heure de début et de fin du découpage/recadrage