Apare o arquivo de áudio usando os horários de início e término

34

Eu tenho um comando FFmpeg para aparar o áudio:

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

O problema que tenho com este comando é que essa opção -trequer uma duração (em segundos) de 01:43:46 . Quero cortar o áudio usando os horários de início / parada, por exemplo, entre 01:43:46 e 00: 01: 45.02 .

Isso é possível?

user8547
fonte
1
Então, você deseja extrair uma seção de um arquivo de áudio usando os horários de início e término em vez de um horário de início e uma duração, está correto?
1
@Nasha Isso está correto. Vou editar a postagem para deixar isso mais claro.
user8547
1
Eu reformulei sua pergunta de acordo. Na verdade ffmpeg, parece não fornecer nada além de um horário de início e uma duração. E mplayertambém não.

Respostas:

45

O ffmpeg parece ter uma nova opção - na documentação :

-para a posição ( entrada / saída )
Pare de escrever a saída ou de ler a entrada na posição . posição deve ser uma especificação de duração, consulte (ffmpeg-utils) a seção Duração do tempo no manual ffmpeg-utils (1).

-to e -t são mutuamente exclusivos e -t tem prioridade.

Comando de amostra com dois 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

Isso deve criar uma cópia (arquivo-2.mkv) do arquivo.mkv da marca de 20 segundos para a marca de 40 segundos.

Miati
fonte
2
Tx, isso funciona bem. Acho que, se eu não remover a copyparte, o áudio / vídeo está fora de sincronia. Por isso, removo e adiciono -async 1e funciona como um encanto. É claro que isso requer reencodificação, portanto, uma melhoria seria um comando que permitiria os problemas, copymas sem os problemas de sincronização.
user8547
1
É possível ter vários intervalos e eles seriam unidos? ou seja,ffmpeg -i file.mp3 -ss 10 -to 11 -ss 20 -to 21 -ss 30 -to 31 ....
Avner Barr
@AvnerBarr Não sei se isso é possível apenas com o FFmpeg, mas sei que é possível com o Mencoder. Isso funciona, usando a -toopção: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 você possui o PHP instalado, crie um script:

TimeDiff.php conteúdo:

<?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;

?>

conteúdo 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]

Onde [startchop] e [stopchop] são ambos carimbos de data e hora absolutos desde o início da faixa.

Nota: os scripts podem precisar de ajustes, dependendo da versão da plataforma, etc.

Litch
fonte
Então, o comando se parece com o exemplo a seguir? input.mp3 audiochop.sh 00:01:30 00:01:50 output.mp3
user8547
Sim exatamente isso.
Litch
Na verdade, este é o comando completo: ./audiochop.sh input.mp3 00:01:30 00:01:50 output.mp3 Esqueci de colocar o ponto e a barra na frente do comando, e é por isso que não foi trabalhando.
user8547
Aliás, eu descobri que esse script php / bash também funciona em vídeos mp4, então suponho que funcione com qualquer formato de vídeo.
user8547
1
Ele deve funcionar com qualquer formato que seu ffmpeg suporte.
Litch