假设我有一个音频mp3文件,长度为00:04:00(240秒)。我想在2秒内提取每个所述文件的一部分,所以它将是:
File_01 00:00:00-00:00:02,File_02 00:00:02-00:00:04,File_03 00:00:04-00:00:06 ... File_120 00:03:58 -00:04:00。
我正在使用python,调用模块子进程来运行ffmpeg函数。我所做的只是将其放入这样的循环中:
count = 0
count2 = 2
count3 = 1
while count2 <= audio_length:
ffmpeg = 'ffmpeg -i input.mp3 -c copy -ss %d -to %d output%d.wav' % (count, count2, count3)
subprocess.call(ffmpeg, shell=True)
count = count + 2
count2 = count2 + 2
count3 = count3 + 1
但是,子流程部分花费了很长时间,并且似乎卡住了。我搜索了一些见解,但没有发现任何有关循环的内容。任何帮助表示赞赏。
答案 0 :(得分:2)
如果您愿意使用外部库并处理离线音频文件,pydub内置了实用程序,可以制作给定长度的可播放音频块。
从pydub.utils中简单地调用make_chunk
方法,并提供块大小并导出可播放的音频块。
我拿了一个34.6秒的文件,分成18个块,每个块2秒。最后一块可能少于2秒,具体取决于长度(在我的情况下为0.6秒)。
工作代码:
from pydub import AudioSegment
from pydub.utils import make_chunks
audiofile = 'example.wav'
#set chunk duration in milliseconds
chunk_duration = 2000 #2 seconds
#Convert audio to audio segment
audio_segment = AudioSegment.from_wav(audiofile)
print("audio length in seconds={}".format(len(audio_segment) / float(1000.0)))
#make chunks
chunks = make_chunks(audio_segment, chunk_duration)
end = 0
for idx,chunk in enumerate(chunks):
start = end
end = start + (chunk_duration//1000)
count = idx + 1
print("Exporting File_{}_{}:{}.wav".format(count,start,end))
chunk.export("File_{}_{}:{}.wav".format(count,start,end))
输出:
$python splitaudio.py
audio length in seconds=34.6
Exporting File_1_0:2.wav
Exporting File_2_2:4.wav
Exporting File_3_4:6.wav
Exporting File_4_6:8.wav
Exporting File_5_8:10.wav
Exporting File_6_10:12.wav
Exporting File_7_12:14.wav
Exporting File_8_14:16.wav
Exporting File_9_16:18.wav
Exporting File_10_18:20.wav
Exporting File_11_20:22.wav
Exporting File_12_22:24.wav
Exporting File_13_24:26.wav
Exporting File_14_26:28.wav
Exporting File_15_28:30.wav
Exporting File_16_30:32.wav
Exporting File_17_32:34.wav
Exporting File_18_34:36.wav
答案 1 :(得分:1)
来自Anil_M的答案是完全有效的,但我认为最好提及另外两种快速且不需要使用Python编写脚本的方式(此外,如果需要,还可以提供大量额外功能)。
已尝试使用ffmpeg
:
ffmpeg -i input.mp3 -f segment -segment_time 2 -c copy output%03d.mp3
还有SoX
:
sox input.mp3 output.mp3 trim 0 2 : newfile : restart