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?


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.