Pergunta

Eu gostaria de criar um programa que faça MP3s dos primeiros 30 segundos de um arquivo AIFF ou WAV. Eu também gostaria de poder escolher localização e comprimento, como o áudio entre 2:12 e 2:42. Existem ferramentas que me permitem fazer isso?

Descobrir está ok. O aplicativo será executado em um servidor Linux, por isso teria que ser uma ferramenta que funcione no Linux.

Não me importo de fazer isso em duas etapas - ou seja, uma ferramenta que primeiro cria o recorte do AIFF/WAV e depois o passe para um codificador MP3.

Foi útil?

Solução 2

Eu queria usar algo o mais baixo nível possível, então acabei usando RubyAudio, um invólucro para LibsndFile.

require "rubygems"
require "ruby-audio"

EXTRACT_BEGIN = 11.2
EXTRACT_LENGTH = 3.5

RubyAudio::Sound.open("/home/augustl/sandbox/test.aif") do |snd|
  info = snd.info
  ["channels", "format", "frames", "samplerate", "sections", "seekable"].each do |key|
    puts "#{key}: #{info.send(key)}"
  end

  # TODO: should we use a 1000 byte buffer? Does it matter? See RubyAudio::Sound rdocs.
  bytes_to_read = (info.samplerate * EXTRACT_LENGTH).to_i
  buffer = RubyAudio::Buffer.new("float", bytes_to_read, info.channels)

  snd.seek(info.samplerate * EXTRACT_BEGIN)
  snd.read(buffer, bytes_to_read)

  out = RubyAudio::Sound.open("/home/augustl/sandbox/out.aif", "w", info.clone)
  out.write(buffer)
end

Outras dicas

SoX com o trim O predicado pode fazer isso. Se o seu Sox não for construído com suporte a MP3, você terá que colocar a saída para lame Depois, ou encontre um que seja.

Usar MUITO RUIM Para a parte de codificação MP3. Usar shntplit para dividir o arquivo. Você precisará colocar seus pontos divididos em um arquivo de sugestão, mas isso é fácil.

Execute esta liner bash em um diretório com os arquivos *.wav.

for wavfile in *.wav; do \
  sox "${wavfile}" "preview-${wavfile}" trim 0 60 fade 3 57 3; \
  lame --preset standard "preview-${wavfile}" \
    "preview-`basename ${wavfile} .wav`".mp3; \
  rm "preview-${wavfile}"; \
done

Primeiros 60 segundos. 3 segundos desaparecem e 3 segundos desaparecem. Os arquivos WAV originais permanecem intocados. Os arquivos de visualização vêm com um prefixo "visualização-". Você poderá escolher o local e o comprimento alterando "Trim 0 60" para atender às suas necessidades. Requer: Sox, coxo

Se você possui um diretório com arquivos MP3 e precisar criar visualizações, execute isso:

for mp3file in *.mp3; do \
  mpg123 -w "${mp3file}.wav" "${mp3file}"; \
  sox "${mp3file}.wav" "preview-${mp3file}.wav" trim 0 60 fade 3 57 3; \
  rm "${mp3file}.wav"; \
  lame --preset standard "preview-${mp3file}.wav" "preview-${mp3file}"; \
  rm -v "preview-${mp3file}.wav"; \
done

Requer: mpg123, sox, coxo

Eu escrevi a Biblioteca Python, Pydub, isso torna isso trivial, embora use o FFMPEG para fazer as conversões para apoiar mais formatos…

from pydub import AudioSegment

sound = AudioSegment.from_file("/input/file.aiff", format="aif")

# 2 min and 12 sec, them convert to milliseconds
start = (2*60 + 12) * 1000
end = start +  (30 * 1000)
snip = sound[start:end]

# add 3 second fade in and fade out
snip = snip.fadeIn(3000).fadeOut(3000)

# save as mp3
snip.export("/output/file.mp3", format="mp3")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top