2010-03-30 55 views
4

我想创建一个程序,使aiff或wav文件的前30秒的mp3。我还希望能够选择位置和长度,例如2:12和2:42之间的音频。有没有什么工具可以让我做到这一点?从wav和aiff文件创建mp3预览

剔除是可以的。该应用程序将在Linux服务器上运行,因此它必须是一个适用于Linux的工具。

我不介意分两步做 - 即首先创建aiff/wav剪切的工具,然后将其传递给mp3编码器。

回答

2

我想使用尽可能低的水平,所以我最终使用RubyAudiolibsndfile的包装。

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 
3

SoXtrim谓词可以做到这一点。如果你的sox不是用MP3支持的,那么你必须在输出到lame之后,或者找到一个。

+0

+1 Sox ... ooooo shiny – 2010-03-30 23:26:41

1

使用LAME作为mp3编码部分。使用shntplit来分割文件。你需要将你的分割点放入一个提示文件中,但这很简单。

1

在带有* .wav文件的目录中运行此Bash单行程。

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 

前60秒。 3秒淡入和3秒淡出。原始的wav文件保持不变。预览文件带有“预览”前缀。您可以通过更改“trim 0 60”来选择位置和长度以适应您的需求。 要求:SOX,瘸

如果你有MP3文件的目录,并需要建立预览,运行此:

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 

要求:mpg123的,SOX,跛脚

1

我写了一个python library, pydub,这使得这个微不足道,虽然它使用ffmpeg进行转换以支持更多格式...

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