将循环应用于Python中的子处理调用FFMPEG

时间:2019-11-23 20:45:08

标签: python audio ffmpeg subprocess

假设我有一个音频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

但是,子流程部分花费了很长时间,并且似乎卡住了。我搜索了一些见解,但没有发现任何有关循环的内容。任何帮助表示赞赏。

2 个答案:

答案 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