Обріжте аудіофайл, використовуючи час початку та зупинки


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 .

Чи можливо це?


1
Отже, ви хочете витягти розділ аудіофайлу, використовуючи час початку та зупинки замість часу початку та тривалості, чи правильно це?

1
@Nasha Це правильно. Я відредагую публікацію, щоб зробити це зрозумілішим.
користувач8547

1
Я відповідно переформулював ваше запитання. Насправді ffmpeg, схоже, не передбачено нічого іншого, крім часу початку та тривалості. І mplayerне так.

Відповіді:


45

FFmpeg , здається, новий варіант в документації :

-по позиції ( вхід / вихід )
Зупиніть записувати вихід або читати вхід у позиції . позиція повинна бути специфікацією тривалості часу, див. (ffmpeg-utils) розділ Тривалість часу в посібнику ffmpeg-utils (1).

-до і -т є взаємовиключними і -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) file.mkv від 20-секундної позначки до 40-секундної позначки.


2
Tx, це прекрасно працює. Я вважаю, що якщо я не видаляю copyчастину, аудіо / відео не синхронізовано, тому я видаляю це і додаю, -async 1і це працює як шарм. Звичайно, воно потребує перекодування, тому вдосконалення було б командою, яка дозволила б мати, copyале без проблем синхронізації.
користувач8547

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
користувач8547

Так, саме так.
Лич

Це насправді повна команда: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Я забув поставити період і косу рису перед командою, тому це не було робочий.
користувач8547

Між іншим, я виявив, що цей php / bash скрипт також працює на mp4 відео, тому я припускаю, що він буде працювати з будь-яким відеоформатом.
користувач8547

1
Він повинен працювати з будь-яким форматом, який підтримує ваш ffmpeg.
Лич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.