将音频文件拆分为多个文件,每个文件都低于一个大小阈值
Split audio file into several files, each below a size threshold
我有一个 FLAC 文件,我需要将其拆分为几个不同的 FLAC 文件,每个文件的大小必须低于 100 MB。有没有可以为我做这件事的 UNIX 工具?我可以自己实现这个逻辑吗?
旁注:由于 FLAC 是压缩的,我认为最简单的解决方案需要先将文件转换为 WAV。
你的问题分为两部分。
- 将现有的
FLAC
音频文件转换为其他格式,例如 wav
- 将转换后的
wav
文件拆分为特定大小的块。
显然,有不止一种方法可以做到这一点。但是,pydub
提供了更简单的方法来完成上述操作。
pydub
文档的详细信息可以是 found here.
1) 将现有的 FLAC
音频文件转换为其他格式,例如 wav
使用pydub
你可以读取FLAC
音频格式然后转换为wav
如下
flac_audio = AudioSegment.from_file("sample.flac", "flac")
flac_audio.export("audio.wav", format="wav")
2) 将转换后的 wav
文件拆分为特定大小的块。
同样,有多种方法可以做到这一点。我这样做的方法是确定转换后的 wavfile
的总长度和大小,然后将其近似为所需的块大小。
使用的样本 wav file
大小为 101,612 KB
,大约 589 sec
或稍微超过 9 minutes
。
Wav 文件大小观察:
立体声frame_rate 44.1KHz 音频文件大约每分钟 10 Mb。 48K 会有点 larger.That 意味着相应的单声道文件将是每分钟 5 兆
近似值适用于我们的样本文件,每分钟约 10 Mb
Wav 文件大小计算:
wav 文件大小和持续时间之间的相关关系由
给出
wav_file_size_in_bytes = (sample rate (44100) * bit rate (16-bit) * number of channels (2 for stereo) * number of seconds) / 8 (8 bits = 1 byte)
来源:http://manual.audacityteam.org/o/man/digital_audio.html
我用来计算音频文件块的公式:
通过以下方法获取块大小
for duration_in_sec (X) we get wav_file_size (Y)
So whats duration in sec (K) given file size of 10Mb
这给出 K = X * 10Mb / Y
pydub.utils
有方法 make_chunks
可以制作特定持续时间的块(在 milliseconds
中)。我们使用上述公式确定所需大小的持续时间。
我们用它来创建 10Mb(或接近 10Mb)的块并分别导出每个块。根据大小,最后一个块可能会更小。
这是一个工作代码。
from pydub import AudioSegment
#from pydub.utils import mediainfo
from pydub.utils import make_chunks
import math
flac_audio = AudioSegment.from_file("sample.flac", "flac")
flac_audio.export("audio.wav", format="wav")
myaudio = AudioSegment.from_file("audio.wav" , "wav")
channel_count = myaudio.channels #Get channels
sample_width = myaudio.sample_width #Get sample width
duration_in_sec = len(myaudio) / 1000#Length of audio in sec
sample_rate = myaudio.frame_rate
print "sample_width=", sample_width
print "channel_count=", channel_count
print "duration_in_sec=", duration_in_sec
print "frame_rate=", sample_rate
bit_rate =16 #assumption , you can extract from mediainfo("test.wav") dynamically
wav_file_size = (sample_rate * bit_rate * channel_count * duration_in_sec) / 8
print "wav_file_size = ",wav_file_size
file_split_size = 10000000 # 10Mb OR 10, 000, 000 bytes
total_chunks = wav_file_size // file_split_size
#Get chunk size by following method #There are more than one ofcourse
#for duration_in_sec (X) --> wav_file_size (Y)
#So whats duration in sec (K) --> for file size of 10Mb
# K = X * 10Mb / Y
chunk_length_in_sec = math.ceil((duration_in_sec * 10000000 ) /wav_file_size) #in sec
chunk_length_ms = chunk_length_in_sec * 1000
chunks = make_chunks(myaudio, chunk_length_ms)
#Export all of the individual chunks as wav files
for i, chunk in enumerate(chunks):
chunk_name = "chunk{0}.wav".format(i)
print "exporting", chunk_name
chunk.export(chunk_name, format="wav")
输出:
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
sample_width= 2
channel_count= 2
duration_in_sec= 589
frame_rate= 44100
wav_file_size = 103899600
exporting chunk0.wav
exporting chunk1.wav
exporting chunk2.wav
exporting chunk3.wav
exporting chunk4.wav
exporting chunk5.wav
exporting chunk6.wav
exporting chunk7.wav
exporting chunk8.wav
exporting chunk9.wav
exporting chunk10.wav
>>>
我有一个 FLAC 文件,我需要将其拆分为几个不同的 FLAC 文件,每个文件的大小必须低于 100 MB。有没有可以为我做这件事的 UNIX 工具?我可以自己实现这个逻辑吗?
旁注:由于 FLAC 是压缩的,我认为最简单的解决方案需要先将文件转换为 WAV。
你的问题分为两部分。
- 将现有的
FLAC
音频文件转换为其他格式,例如wav
- 将转换后的
wav
文件拆分为特定大小的块。
显然,有不止一种方法可以做到这一点。但是,pydub
提供了更简单的方法来完成上述操作。
pydub
文档的详细信息可以是 found here.
1) 将现有的 FLAC
音频文件转换为其他格式,例如 wav
使用pydub
你可以读取FLAC
音频格式然后转换为wav
如下
flac_audio = AudioSegment.from_file("sample.flac", "flac")
flac_audio.export("audio.wav", format="wav")
2) 将转换后的 wav
文件拆分为特定大小的块。
同样,有多种方法可以做到这一点。我这样做的方法是确定转换后的 wavfile
的总长度和大小,然后将其近似为所需的块大小。
使用的样本 wav file
大小为 101,612 KB
,大约 589 sec
或稍微超过 9 minutes
。
Wav 文件大小观察:
立体声frame_rate 44.1KHz 音频文件大约每分钟 10 Mb。 48K 会有点 larger.That 意味着相应的单声道文件将是每分钟 5 兆
近似值适用于我们的样本文件,每分钟约 10 Mb
Wav 文件大小计算:
wav 文件大小和持续时间之间的相关关系由
给出wav_file_size_in_bytes = (sample rate (44100) * bit rate (16-bit) * number of channels (2 for stereo) * number of seconds) / 8 (8 bits = 1 byte)
来源:http://manual.audacityteam.org/o/man/digital_audio.html
我用来计算音频文件块的公式:
通过以下方法获取块大小
for duration_in_sec (X) we get wav_file_size (Y)
So whats duration in sec (K) given file size of 10Mb
这给出 K = X * 10Mb / Y
pydub.utils
有方法 make_chunks
可以制作特定持续时间的块(在 milliseconds
中)。我们使用上述公式确定所需大小的持续时间。
我们用它来创建 10Mb(或接近 10Mb)的块并分别导出每个块。根据大小,最后一个块可能会更小。
这是一个工作代码。
from pydub import AudioSegment
#from pydub.utils import mediainfo
from pydub.utils import make_chunks
import math
flac_audio = AudioSegment.from_file("sample.flac", "flac")
flac_audio.export("audio.wav", format="wav")
myaudio = AudioSegment.from_file("audio.wav" , "wav")
channel_count = myaudio.channels #Get channels
sample_width = myaudio.sample_width #Get sample width
duration_in_sec = len(myaudio) / 1000#Length of audio in sec
sample_rate = myaudio.frame_rate
print "sample_width=", sample_width
print "channel_count=", channel_count
print "duration_in_sec=", duration_in_sec
print "frame_rate=", sample_rate
bit_rate =16 #assumption , you can extract from mediainfo("test.wav") dynamically
wav_file_size = (sample_rate * bit_rate * channel_count * duration_in_sec) / 8
print "wav_file_size = ",wav_file_size
file_split_size = 10000000 # 10Mb OR 10, 000, 000 bytes
total_chunks = wav_file_size // file_split_size
#Get chunk size by following method #There are more than one ofcourse
#for duration_in_sec (X) --> wav_file_size (Y)
#So whats duration in sec (K) --> for file size of 10Mb
# K = X * 10Mb / Y
chunk_length_in_sec = math.ceil((duration_in_sec * 10000000 ) /wav_file_size) #in sec
chunk_length_ms = chunk_length_in_sec * 1000
chunks = make_chunks(myaudio, chunk_length_ms)
#Export all of the individual chunks as wav files
for i, chunk in enumerate(chunks):
chunk_name = "chunk{0}.wav".format(i)
print "exporting", chunk_name
chunk.export(chunk_name, format="wav")
输出:
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
sample_width= 2
channel_count= 2
duration_in_sec= 589
frame_rate= 44100
wav_file_size = 103899600
exporting chunk0.wav
exporting chunk1.wav
exporting chunk2.wav
exporting chunk3.wav
exporting chunk4.wav
exporting chunk5.wav
exporting chunk6.wav
exporting chunk7.wav
exporting chunk8.wav
exporting chunk9.wav
exporting chunk10.wav
>>>