Обрезать аудио файл, используя время начала и окончания

34

У меня есть команда FFmpeg для обрезки аудио:

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

Проблема, с которой я сталкиваюсь в этой команде, заключается в том, что для этой опции -tтребуется продолжительность (в секундах) от 01:43:46 . Я хочу обрезать звук, используя время запуска / остановки, например, между 01:43:46 и 00: 01: 45.02 .

Это возможно?

user8547
источник
1
Итак, вы хотите извлечь часть аудиофайла, используя время начала и окончания вместо времени начала и продолжительности, это правильно?
1
@Nasha Это правильно. Я отредактирую пост, чтобы сделать это понятнее.
user8547
1
Я перефразировал ваш вопрос соответственно. Действительно, ffmpegкажется, не предоставляет ничего, кроме времени начала и продолжительности. И mplayerне тоже.

Ответы:

45

FFmpeg , кажется, новый вариант в документации :

положение ( ввод / вывод )
Прекратить запись вывода или чтение ввода в положении . position должна быть спецификацией продолжительности времени, см. (ffmpeg-utils) раздел «Продолжительность времени» в руководстве ffmpeg-utils (1).

-to и -t являются взаимоисключающими и имеют приоритет.

Пример команды с двумя форматами времени

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

Это должно создать копию (file-2.mkv) файла.m.mv с отметки 20 секунд до отметки 40 секунд.

Miati
источник
2
Тх, это хорошо работает. Я обнаружил, что если я не удаляю copyчасть, аудио / видео не синхронизировано, то я удаляю это и добавляю, -async 1и это работает как шарм. Конечно, это требует перекодирования, поэтому улучшением будет команда, которая позволит, copyно без проблем с синхронизацией.
user8547
1
Возможно ли иметь несколько интервалов, и они будут объединены? т.е.ffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Авнер Барр
@AvnerBarr Я не знаю, возможно ли это только с FFmpeg, но я знаю, что это возможно с Mencoder. Это работает, используя -toопцию: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

Если у вас установлен PHP, сделайте его скриптом:

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;

?>

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"

Использование:

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

Где [startchop] и [stopchop] являются абсолютными временными метками от начала трека.

Примечание: скрипты могут нуждаться в настройке в зависимости от версии платформы и т. Д.

Лич
источник
Так выглядит ли команда в следующем примере? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547
Да, именно так.
Литч
Это на самом деле полная команда: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Я забыл поставить точку и косую черту перед командой, поэтому она не была за работой.
user8547
Кстати, я обнаружил, что этот скрипт php / bash также работает с mp4-видео, поэтому я предполагаю, что он будет работать с любым видеоформатом.
user8547
1
Он должен работать с любым форматом, который поддерживает ваш ffmpeg.
Литч