如何在没有 ffmpeg 或 wave 的情况下读取频道数?

how to read number of channels without ffmpeg or wave?

此代码有效:

import wave

f1 = wave.open(file1, "r")
num_channels_file1 = int(f1.getnchannels())

但是当读取具有不同比特率或其他 属性 的 wav 文件时它不起作用。 我无法弄清楚 wav 文件或其他错综复杂的区别,我只需要一种方法来检查 wav 文件是否有 2 个通道。

声道数是RIFF头中0x16位置的一个双字节整数,直接读取即可:

import struct

with open(file1, 'rb') as f1:
    header_beginning = f1.read(0x18)
    num_channels_file1, = struct.unpack_from('<H', header_beginning, 0x16)

如果您有兴趣支持大端 WAV 文件(我认为这种文件并不常见),您可以通过读取文件的前四个字节(“RIFF”或“XFIR”代表小端,“FFIR”或“RIFX”代表大端)。然后,对于big-endian文件,读取通道数时从'<H'切换到'>H'

SOX,“声音处理程序的瑞士军刀”,也是一个选项:

from sox import file_info

ch = file_info.channels("WAV_2MG.wav") # https://file-examples.com/wp-content/uploads/2017/11/file_example_WAV_2MG.wav
print(ch)
# 2

Python 安装

pip3 install sox

确保系统上安装了 SOX,如果没有:

apt-get install sox # ubuntu
yum install sox # redhat/fedora/centos