如何在没有 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
此代码有效:
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