如何在不实际转换的情况下确定转换后音频文件的理论文件大小(即 mp3 到 wav)

Posted

技术标签:

【中文标题】如何在不实际转换的情况下确定转换后音频文件的理论文件大小(即 mp3 到 wav)【英文标题】:How to determine theoretical filesize of converted audio file without actually converting (i.e. mp3 to wav) 【发布时间】:2020-12-10 18:03:00 【问题描述】:

背景:我正在编写一个 python 脚本,它将接收一个音频文件并使用 pydub 对其进行修改。 Pydub 似乎需要将音频输入转换为 wav 格式,它有 4GB 的限制。于是我把一个400MB的.m4a文件放入pydub,报错文件太大。

我不想让 pydub 运行几分钟,然后如果转换后的解压缩后的大小太大会抛出错误,我想提前快速计算解压后的文件大小。如果超过 4GB,我的脚本会切掉原始音频,然后通过 pydub 运行。

谢谢。

【问题讨论】:

【参考方案1】:

计算理论上的 .WAV 文件大小是一种简单的算法。大小(以字节为单位)是位深度除以 8,乘以采样率,乘以持续时间,乘以通道数。

因此,如果您有一个长度为 3:20、44100Hz、16 位和立体声的音频剪辑,则计算如下:

sample_rate = 44100 # Hz/Samples per second - CD Quality
bit_depth = 16 # 2 bytes; CD quality
channels = 2 # stereo
duration = 200.0 # seconds

file_size = sample_rate * (bit_depth / 8) * channels * duration
        # = 44100 * (2) * 2 * 200
        # = 35280000 bytes
        # = 35.28 MB (megabytes)

我发现了这个在线音频文件大小计算器,您也可以使用它来确认您的数学:https://www.colincrawley.com/audio-file-size-calculator/

如果您想找出另一个方向,即理论上 压缩 文件的大小,这取决于您如何进行压缩。幸运的是,典型的压缩只使用固定的比特率,这意味着计算得到的压缩文件大小的数学非常简单。

因此,如果您有一个 3:20 的音频剪辑要转换为 MP3,比特率为 128kbps(千比特每秒,128 是常见的中等质量设置),则计算的只是比特率,除以 8(每字节位数)乘以持续时间:

bits_per_kb = 1000
bitrate_kbps = 128
bits_per_byte = 8
duration_seconds = 200
filesize_bytes = (bitrate_kbps * bits_per_kb / bits_per_byte) * duration_seconds
             # = (128000 / 8) * 200
             # = (16) * 200
             # = 3200000 bytes
             # = 3.2 MB

【讨论】:

我认为我的问题的标题错误,我应该更多地使用“转换”这个词。如果我有一个压缩的 mp3/m4a 文件,并且如果我转换为解压缩文件,我想要理论文件大小.wav 文件,我怎么能找到理论大小?如果我错了,请纠正我,但我假设这会给我原始 mp3/m4a 文件的文件大小? 我不确定您的困惑在哪里,因为这个答案 .WAV 文件的理论大小。如果压缩音频的理论大小是可变比特率,则计算压缩音频的理论大小要困难得多,但如果它是固定比特率,这是一种更简单的计算,因为您基本上只需将比特率乘以持续时间。我提到的所有变量——采样率、位深度、持续时间和通道数——都与压缩音频无关。这些都是任何数字 PCM 音频的最基本属性。 如果是这样,那就太棒了。谢谢你。我需要今晚晚些时候检查 @JohnG。如果它最终对你有用,记得接受这个答案。

以上是关于如何在不实际转换的情况下确定转换后音频文件的理论文件大小(即 mp3 到 wav)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用循环的情况下将二进制转换为十进制?

如何在不实际滚动的情况下确定滚动方向

如何在不向下转换的情况下调用派生类的成员函数

如何在不进行任何舍入的情况下将浮点数转换为小数点后 4 位?

如何在不将字体转换为轮廓的情况下将 cairo-pdf 转换为 eps

在不加载到内存的情况下将 HDF5 转换为 Parquet