Schneiden Sie Audiodateien mit Start- und Stoppzeiten

34

Ich habe einen FFmpeg-Befehl zum Trimmen von Audio:

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

Das Problem, das ich mit diesem Befehl habe, ist, dass die Option -teine Dauer (in Sekunden) von 01:43:46 erfordert . Ich möchte Audio mit Start- / Stoppzeiten zuschneiden , z. B. zwischen 01:43:46 und 00: 01: 45.02 .

Ist das möglich?

user8547
quelle
1
Sie möchten also einen Abschnitt einer Audiodatei mit Start- und Stoppzeiten anstelle einer Startzeit und einer Dauer extrahieren. Ist das richtig?
1
@Nasha Das stimmt. Ich werde den Beitrag bearbeiten, um das klarer zu machen.
User8547
1
Ich habe Ihre Frage entsprechend umformuliert. In ffmpegder Tat scheint nichts anderes als eine Startzeit und eine Dauer bereitzustellen. Und mplayerauch nicht.

Antworten:

45

ffmpeg scheint eine neue Option zu haben - dazu in der Dokumentation :

-to position ( Eingabe / Ausgabe )
Stoppt das Schreiben der Ausgabe oder das Lesen der Eingabe an der Position . position muss eine Zeitdauerangabe sein, siehe (ffmpeg-utils) im Abschnitt Time duration im Handbuch zu ffmpeg-utils (1).

-to und -t schließen sich gegenseitig aus und -t hat Priorität.

Beispielbefehl mit zwei Zeitformaten

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

Dies sollte eine Kopie (file-2.mkv) von file.mkv von der 20-Sekunden-Marke bis zur 40-Sekunden-Marke erstellen.

Miati
quelle
2
Tx, das funktioniert gut. Wenn ich den copyTeil nicht entferne, ist das Audio / Video nicht synchron, also entferne ich das und füge -async 1es hinzu und es funktioniert wie ein Zauber. Natürlich erfordert es eine Neuverschlüsselung, daher wäre eine Verbesserung ein Befehl, der das copyaber ohne die Synchronisierungsprobleme zulässt .
User8547
1
Ist es möglich, mehrere Intervalle zu haben und diese zusammenzufügen? dhffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr
@ AvnerBarr Ich weiß nicht, ob dies nur mit FFmpeg möglich ist, aber ich weiß, dass es mit Mencoder möglich ist. Dies funktioniert mit der -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 31.10.18
1

Wenn Sie PHP installiert haben, machen Sie es zu einem Skript:

TimeDiff.php Inhalt:

<?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;

?>

audiochop.sh Inhalt:

#!/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"

Verwendung:

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

Wobei [startchop] und [stopchop] beide absolute Zeitstempel vom Beginn des Tracks sind.

NB: Skript (e) müssen möglicherweise in Abhängigkeit von der Plattformversion usw. angepasst werden.

Litch
quelle
So sieht der Befehl aus wie im folgenden Beispiel? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547
Ja genau das
Litch
Dies ist eigentlich der vollständige Befehl: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Ich hatte vergessen, den Punkt und den Schrägstrich vor den Befehl zu setzen, weshalb dies nicht der Fall war Arbeiten.
User8547
Übrigens, ich habe festgestellt, dass dieses PHP / Bash-Skript auch für MP4-Videos funktioniert, also gehe ich davon aus, dass es mit jedem Videoformat funktioniert.
user8547
1
Es sollte mit jedem Format funktionieren, das Ihr ffmpeg unterstützt.
Litch