Recorte el archivo de audio usando las horas de inicio y finalización


34

Tengo un comando FFmpeg para recortar audio:

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

El problema que tengo con este comando es que esa opción -trequiere una duración (en segundos) de 01:43:46 . Quiero recortar el audio usando las horas de inicio / parada, por ejemplo, entre 01:43:46 y 00: 01: 45.02 .

es posible?


1
Entonces, si desea extraer una sección de un archivo de audio utilizando las horas de inicio y finalización en lugar de una hora de inicio y una duración, ¿es correcto?

1
@Nasha Eso es correcto. Editaré la publicación para aclarar eso.
user8547

1
He reformulado su pregunta en consecuencia. De hecho ffmpeg, no parece proporcionar nada más que una hora de inicio y una duración. Y mplayertampoco lo hace.

Respuestas:


45

ffmpeg parece tener una nueva opción -to en la documentación :

-para posición ( entrada / salida )
dejar de escribir la salida o la lectura de la entrada en posición . la posición debe ser una especificación de duración de tiempo, consulte (ffmpeg-utils) la sección Duración de tiempo en el manual de ffmpeg-utils (1).

-to y -t son mutuamente excluyentes y -t tiene prioridad.

Comando de muestra con dos formatos de hora

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

Esto debería crear una copia (file-2.mkv) de file.mkv desde la marca de 20 segundos a la marca de 40 segundos.


2
Tx, eso funciona muy bien. Me parece que si no elimino la copyparte, el audio / video no está sincronizado, así que lo elimino y agrego -async 1y funciona de maravilla. Por supuesto, requiere una nueva codificación, por lo que una mejora sería un comando que permitiría copylos problemas de sincronización, pero sin ellos.
user8547

1
¿Es posible tener múltiples intervalos y se unirían? es decirffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr

@AvnerBarr No sé si esto es posible únicamente con FFmpeg, pero sé que es posible con Mencoder. Esto funciona, usando la -toopción: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

Si tiene PHP instalado, conviértalo en un script:

Contenido de 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;

?>

contenido de 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]

Donde [startchop] y [stopchop] son ​​marcas de tiempo absolutas desde el comienzo de la pista.

NB: los scripts pueden necesitar ajustes según la versión de la plataforma, etc.


Entonces, ¿el comando se parece al siguiente ejemplo? audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3
user8547

Si, exactamente eso.
Litch

Este es en realidad el comando completo: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Se me había olvidado poner el punto y la barra delante del comando, por lo que no fue así. trabajando.
user8547

Por cierto, descubrí que este script php / bash también funciona en videos mp4, por lo que supongo que funcionará con cualquier formato de video.
user8547

1
Debería funcionar con cualquier formato que admita su ffmpeg.
Litch
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.