在一个单独的项目中,我在套接字之间传输 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
我尝试了几种不同的阅读/计算方法,但对我不起作用。
您似乎假设帧等于字节,这是不正确的,因为还应该通过调用
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