为什么两种不同的方法找出 wav 文件中的块总数会返回不同的结果?

问题描述 投票:0回答:1

在一个单独的项目中,我在套接字之间传输 wav 文件,我发现了一个错误,要么我没有读取足够的 wav 文件,要么我过度计算了我必须发送的块数,所以我隔离了这个问题。 (忽略custom_logging模块)

from custom_logging import CustomLogger
import logging
import wave
import math
import os

testing_logger = CustomLogger(log_files=["testing.log"])


CHUNK = 4096

def calc_total_chunks(song_dir, song_name, chunk):
    song_path = os.path.join(song_dir, song_name)
    with wave.open(song_path) as mywav:
        nframes = mywav.getnframes()
        
    total_chunks = math.ceil(nframes / chunk)
    return total_chunks


def count_chunks_in_song(song_dir, song_name, chunk):
    song_path = os.path.join(song_dir, song_name)
    chunk_count = 0

    with wave.open(song_path) as mywav:
        while True:
            song_data_chunk = mywav.readframes(chunk)
            if not song_data_chunk:
                break
            chunk_count += 1

    return chunk_count


songs = ["american.wav", "beats.wav", "No_38.wav"]

for song in songs:
    logging.info(f"total chunks calc for {song}: {calc_total_chunks('songs', song, CHUNK)}")
    logging.info(f"total chunks read for {song}: {count_chunks_in_song('songs', song, CHUNK)}")



输出:

[13:40:31] <module> INFO total chunks calc for american.wav: 5530
[13:40:31] <module> INFO total chunks read for american.wav: 669
[13:40:31] <module> INFO total chunks calc for beats.wav: 690  
[13:40:31] <module> INFO total chunks read for beats.wav: 690  
[13:40:31] <module> INFO total chunks calc for No_38.wav: 20156
[13:40:31] <module> INFO total chunks read for No_38.wav: 129

我尝试了几种不同的阅读/计算方法,但对我不起作用。

python wav
1个回答
0
投票

您似乎假设帧等于字节,这是不正确的,因为还应该通过调用

getsamplewidth()
:

来考虑更宽的样本宽度
def calc_total_chunks(song_dir, song_name, chunk):
    song_path = os.path.join(song_dir, song_name)
    with wave.open(song_path) as mywav:
        nframes = mywav.getnframes()
        sample_width = mywav.getsampwidth()
        
    total_bytes = nframes * sample_width
    total_chunks = math.ceil(total_bytes / chunk)
    return total_chunks
© www.soinside.com 2019 - 2024. All rights reserved.