Découper un fichier audio en utilisant les heures de début et de fin

34

J'ai une commande FFmpeg pour couper l'audio:

ffmpeg -ss 01:43:46 -t 00:00:44.30 -i input.mp3 output.mp3

Le problème que j'ai avec cette commande est que cette option -tnécessite une durée (en secondes) de 01:43:46 . Je veux couper l'audio en utilisant les heures de début / fin, par exemple entre 01:43:46 et 00: 01: 45.02 .

Est-ce possible?

user8547
la source
1
Vous voulez donc extraire une section d'un fichier audio en utilisant les heures de début et de fin au lieu d'une heure de début et d'une durée, est-ce correct?
1
@Nasha C'est vrai. Je vais modifier le message pour que ce soit plus clair.
user8547
1
J'ai reformulé votre question en conséquence. En effet, ffmpegil ne semble rien fournir d'autre qu'une heure de début et une durée. Et mplayernon plus.

Réponses:

45

ffmpeg semble avoir une nouvelle option -to dans la documentation :

-to position ( entrée / sortie )
Arrêtez d'écrire la sortie ou de lire l'entrée à la position . position doit être une spécification de durée, voir (ffmpeg-utils) la section Durée dans le manuel ffmpeg-utils (1).

-to et -t s'excluent mutuellement et -t est prioritaire.

Exemple de commande avec deux formats d'heure

ffmpeg -i file.mkv -ss 20 -to 40 -c copy file-2.mkv
ffmpeg -i file.mkv -ss 00:00:20 -to 00:00:40 -c copy file-2.mkv

Cela devrait créer une copie (fichier-2.mkv) de file.mkv de la marque de 20 secondes à la marque de 40 secondes.

Miati
la source
2
Tx, ça marche bien. Je trouve que si je ne supprime pas la copypartie, l'audio / vidéo n'est pas synchronisé, donc je supprime cela et j'ajoute -async 1et cela fonctionne comme un charme. Bien sûr, cela nécessite un réencodage, donc une amélioration serait une commande qui permettrait le copymais sans les problèmes de synchronisation.
user8547
1
Est-il possible d'avoir plusieurs intervalles et ils seraient réunis? c'est-àffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr
@AvnerBarr Je ne sais pas si c'est possible uniquement avec FFmpeg, mais je sais que c'est possible avec Mencoder. Cela fonctionne, en utilisant l' -tooption:ffmpeg -i mmm.mp4 -ss 00:04:04 -to 00:04:35 -c copy output1.mp4 && ffmpeg -i mmm.mp4 -ss 00:05:47 -to 00:06:05 -c copy output2.mp4 && mencoder -ovc copy -oac mp3lame -idx output1.mp4 output2.mp4 -o complete.mp4
user8547
1

Si vous avez installé PHP, faites-en un script:

Contenu de TimeDiff.php:

<?php
// Create datetime objcects
$dt1 = new DateTime($argv[1]);
$dt2 = new DateTime($argv[2]);

// Conver difference to seconds
$dt3 = $dt2->format('U') - $dt1->format('U');

// echo $dt3."\n";
$h = (int)($dt3 / 3600);
$dt3 %= 3600;
$m = (int)($dt3 / 60);
$dt3 %= 60;
$s = $dt3;

// Dump as H:M:S
echo $h . ":" . $m . ":" . $s;

?>

contenu audiochop.sh:

#!/bin/bash
INFILE=$1
START=$2
STOP=$3
OUTFILE=$4

OFFSET=`php TimeDiff.php "$START" "$STOP"`

echo "Disecting $INFILE starting from $START to $STOP (duration $OFFSET)"
ffmpeg -ss "$START" -t "$OFFSET" -i "$INFILE" "$OUTFILE"

Usage:

./audiochop.sh [input.mp3] [startchop] [stopchop] [output.mp3]

Où [startchop] et [stopchop] sont tous deux des horodatages absolus depuis le début de la piste.

NB: Les scripts peuvent nécessiter des ajustements en fonction de la version de la plate-forme, etc.

Litch
la source
La commande ressemble-t-elle donc à l'exemple suivant? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547
Oui, c'est exactement ça.
Litch
C'est en fait la commande complète: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 J'avais oublié de mettre le point et la barre oblique devant la commande, c'est pourquoi ce n'était pas travail.
user8547
Par ailleurs, j'ai trouvé que ce script php / bash fonctionne également sur les vidéos mp4, donc je suppose qu'il fonctionnera avec n'importe quel format vidéo.
user8547
1
Il devrait fonctionner avec le format pris en charge par ffmpeg.
Litch