Adicione silêncio ao final de um MP3


12

Algum de vocês conhece uma maneira de adicionar silêncio de duração fixa ao final de um MP3, no Linux? Por exemplo, usando MEncoder, FFmpeg, etc?

Ele precisa ser de linha de comando, pois será script e executado em nosso servidor.

Eu pesquisei sobre isso e o melhor que pude fazer é usar a padfunção no SoX , mas isso não funcionará com MP3s.

Eu poderia convertê-lo para WAV, usar SoX, convertê-lo novamente para MP3 e copiar os metadados (menos a duração) do original para o novo MP3. Mas, antes de escrever um script, pensei em ver se há uma solução de um clique.


2
Eu acho que você pode realizar algo assim com o mp3DirectCut (apenas Windows, mas eles dizem que é compatível com o Linux no Wine), o que evita recomprimir os dados do som. Se você fosse MP3 -> WAV -> MP3, recomprimiria o fluxo de dados compactados já em MP3, perdendo muita qualidade no caminho.
Revelação

Obrigado. Você pode executar o software Windows via Wine a partir da linha de comando? Prefiro evitar soluções Wine, se possível, pois reluto em instalar o Wine em nosso servidor.
Max Williams

Hmm, você pode querer evitar a rota do vinho, se ainda não a tiver. O Wine em si é um download bastante grande, bem acima de um megabyte ou dois para uma simples ferramenta de corte / mesclagem de MP3. Tenho certeza de que há uma solução nativa equivalente ao Linux. Se eu encontrar outras ferramentas, informarei você.
Revelação

Respostas:


9

Você pode fazer isso facilmente com o padargumento do SoX e a seguinte sintaxe:

sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>

Exemplo:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Esses silêncios estão em segundos. (Outros usos são possíveis usando uma sintaxe diferente, para inserir esses silêncios em posições específicas. Consulte a documentação do SoX para obter mais informações.)


Devo observar que o testei bem com arquivos MP3 (com libmad-0.dll e libmp3lame-0.dll instalados, respectivamente para decodificar e codificar MP3s.) Na medida do possível, eu recomendaria trabalhar com um formato sem perdas e converter apenas para MP3 apenas no final.
Fabien Snauwaert

isso é muito legal - obrigado Fabien!
Max Williams

Isso é sem perdas?
Geremia

Atualização: Eu li na página de manual do sox que ele se converte em um formato interno e depois recodifica ...
Geremia 2/17

MP3 é um formato com perdas. A codificação e recodificação para um formato com perda diminuirão progressivamente a qualidade do áudio (se você o ouvir ou não.) Como tal, é melhor trabalhar com formatos sem perdas e codificar para um formato com perdas apenas uma vez, no final. Para obter uma lista de codecs de áudio com perdas: en.wikipedia.org/wiki/Lossy_compression#Audio e para uma lista de codecs de áudio sem perdas en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert

15

Com o ffmpeg, você pode usar o filtro aevalsrc para gerar silêncio e, em um segundo comando, usar o protocolo concat para combiná-los sem perdas:

ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3

Você pode controlar a duração do silêncio alterando -t 10para o tempo que desejar em segundos. Obviamente, você só precisa gerar o silêncio uma vez, para manter o arquivo por perto e usá-lo para preencher cada um dos arquivos que desejar. Você também pode procurar o desmuxador concat - é um pouco mais demorado do processador, mas pode ser mais fácil inserir um script de shell.

Se você quiser fazer isso em um único comando, poderá usar o filtro concat - isso exigirá que você recodifique o áudio (como as imagens de filtro são incompatíveis -codec copy), portanto a opção acima provavelmente será a melhor para você. Mas isso pode ser útil para quem trabalha com PCM bruto, procurando adicionar silêncio ao final antes de codificar o áudio:

ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3

Controle a duração do silêncio, alterando d=10para o tempo que você quiser (em segundos). Se você usar esse método, poderá encontrar este guia de codificação MP3 FFmpeg útil.


obrigado @evilsoup. Eu apenas tentei isso e tenho a seguinte - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4,61 Silence.mp3ffmpeg version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:33 with gcc 4.6.3 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Unrecognized option 'filter_complex' Failed to set value 'aevalsrc=0' for option 'filter_complex'
Max Williams

@max Antes de tudo, você está realmente usando o avconv do projeto libav - eles são um fork do FFmpeg que o Debian e o Ubuntu estão usando em vez do projeto principal, e fornecem uma versão aleijada do ffmpeg. Tente usar avconv- a sintaxe deve ser a mesma, basta substituir ffmpegpor avconv.
precisa saber é

Se isso não funcionar, tente atualizar para uma versão mais recente do ffmpeg. Como você está no Ubuntu, poderá usar esse PPA ou, para a versão mais recente, poderá compilá-lo da fonte .
precisa saber é

1
@ MaxWilliams Ou você pode fazer o download de uma construção estática , que você não precisa compilar primeiro. Basta baixar, extrair, usar.
slhck

1
para referência futura: se você enfrentar erro como me, tente substituir aspas simples entre aspas
SZT
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.