Przytnij plik audio, używając czasów rozpoczęcia i zakończenia

34

Mam polecenie FFmpeg do przycinania dźwięku:

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

Problem z tym poleceniem polega na tym, że opcja -twymaga czasu (w sekundach) od 01:43:46 . Chcę przyciąć dźwięk przy użyciu czasów rozpoczęcia / zakończenia, np. Między 01:43:46 a 00: 01: 45.02 .

czy to możliwe?

użytkownik8547
źródło
1
Czy chcesz wyodrębnić sekcję pliku audio przy użyciu czasów rozpoczęcia i zakończenia zamiast czasu rozpoczęcia i czasu trwania, czy to prawda?
1
@Nasha To prawda. Zedytuję post, aby było to bardziej zrozumiałe.
user8547,
1
Odpowiednio sformułowałem twoje pytanie. Rzeczywiście ffmpegwydaje się, że nie zapewnia niczego poza czasem rozpoczęcia i czasem trwania. I mplayerteż nie.

Odpowiedzi:

45

ffmpeg wydaje się mieć nową opcję -to w dokumentacji :

-do pozycji ( wejście / wyjście )
Przestań zapisywać dane wyjściowe lub czytać dane wejściowe w pozycji . pozycja musi być specyfikacją czasu trwania, patrz (ffmpeg-utils) sekcja Czas trwania w podręczniku ffmpeg-utils (1).

-to i -t wzajemnie się wykluczają i -t ma priorytet.

Przykładowe polecenie z dwoma formatami czasu

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

To powinno utworzyć kopię (plik-2.mkv) pliku.mkv od znaku 20 sekund do znaku 40 sekund.

Miati
źródło
2
Tx, to ładnie działa. Uważam, że jeśli nie usunę copyczęści, audio / wideo nie jest zsynchronizowane, więc usuwam to i dodam -async 1i działa to jak urok. Oczywiście wymaga to ponownego kodowania, więc ulepszenie byłoby poleceniem, które pozwoliłoby na copyproblemy z synchronizacją, ale bez nich.
user8547,
1
Czy można mieć wiele interwałów i będą one ze sobą łączone? tj.ffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr
@AvnerBarr Nie wiem, czy jest to możliwe wyłącznie z FFmpeg, ale wiem, że jest to możliwe z Mencoderem. Działa to przy użyciu -toopcji: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
użytkownik8547
1

Jeśli masz zainstalowany PHP, zrób z niego skrypt:

Zawartość 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;

?>

zawartość 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"

Stosowanie:

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

Gdzie [startchop] i [stopchop] są absolutnymi znacznikami czasu od początku ścieżki.

Uwaga: Skrypty mogą wymagać dostosowania w zależności od wersji platformy itp.

Litch
źródło
Czy to polecenie wygląda jak w poniższym przykładzie? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547
Tak, dokładnie to.
Litch
To jest właściwie pełne polecenie: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Zapomniałem umieścić kropkę i ukośnik przed poleceniem, dlatego nie było pracujący.
user8547,
Nawiasem mówiąc, odkryłem, że ten skrypt php / bash działa również na filmach MP4, więc zakładam, że będzie działał z dowolnym formatem wideo.
user8547,
1
Powinien działać z dowolnym formatem obsługiwanym przez ffmpeg.
Litch