Taglia i file audio usando i tempi di inizio e fine


34

Ho un comando FFmpeg per tagliare l'audio:

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

Il problema che ho con questo comando è che l'opzione -trichiede una durata (in secondi) dalle 01:43:46 . Voglio tagliare l'audio utilizzando i tempi di avvio / arresto, ad esempio tra 01:43:46 e 00: 01: 45.02 .

È possibile?


1
Quindi vuoi estrarre una sezione di un file audio usando l'ora di inizio e di fine anziché l'ora di inizio e la durata, è corretto?

1
@Nasha È corretto. Modificherò il post per renderlo più chiaro.
user8547

1
Ho riformulato la tua domanda di conseguenza. In effetti ffmpeg, non sembra fornire altro che un'ora di inizio e una durata. E mplayerneanche.

Risposte:


45

ffmpeg sembra avere una nuova opzione -to nella documentazione :

-per posizionare ( input / output )
Interrompere la scrittura dell'uscita o la lettura dell'ingresso in posizione . posizione deve essere una specifica di durata, vedere (ffmpeg-utils) la sezione Durata nel manuale di ffmpeg-utils (1).

-to e -t si escludono a vicenda e -t ha la priorità.

Comando di esempio con due formati temporali

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

Questo dovrebbe creare una copia (file-2.mkv) di file.mkv dal segno di 20 secondi al segno di 40 secondi.


2
Tx, funziona bene. Trovo che se non rimuovo la copyparte audio / video non è sincronizzata, quindi la rimuovo e aggiungo -async 1e funziona come un incantesimo. Ovviamente richiede una ricodifica, quindi un miglioramento sarebbe un comando che consentirebbe copyi problemi senza sincronizzazione.
user8547

1
È possibile avere più intervalli e sarebbero uniti? vale a direffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr,

@AvnerBarr Non so se questo è possibile solo con FFmpeg, ma so che è possibile con Mencoder. Funziona utilizzando l' -toopzione: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

Se hai installato PHP, rendilo uno script:

Contenuti di 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;

?>

contenuti 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"

Uso:

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

Dove [startchop] e [stopchop] sono entrambi timestamp assoluti dall'inizio della traccia.

NB: Potrebbe essere necessario modificare gli script a seconda della versione della piattaforma, ecc.


Quindi il comando è simile al seguente esempio? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547

Sì, esattamente quello.
Litch

Questo è in realtà il comando completo: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Avevo dimenticato di mettere il punto e la barra davanti al comando, motivo per cui non lo era lavoro.
user8547

Per inciso, ho scoperto che questo script php / bash funziona anche su video mp4, quindi suppongo che funzionerà con qualsiasi formato video.
user8547

1
Dovrebbe funzionare con qualsiasi formato supportato da ffmpeg.
Litch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.