import struct def decode_opus_from_file(input_file): """ 从p3文件中解码 Opus 数据,并返回一个 Opus 数据包的列表以及总时长。 """ opus_datas = [] total_frames = 0 sample_rate = 16000 # 文件采样率 frame_duration_ms = 60 # 帧时长 frame_size = int(sample_rate * frame_duration_ms / 1000) with open(input_file, 'rb') as f: while True: # 读取头部(4字节):[1字节类型,1字节保留,2字节长度] header = f.read(4) if not header: break # 解包头部信息 _, _, data_len = struct.unpack('>BBH', header) # 根据头部指定的长度读取 Opus 数据 opus_data = f.read(data_len) if len(opus_data) != data_len: raise ValueError(f"Data length({len(opus_data)}) mismatch({data_len}) in the file.") opus_datas.append(opus_data) total_frames += 1 # 计算总时长 total_duration = (total_frames * frame_duration_ms) / 1000.0 return opus_datas, total_duration def decode_opus_from_bytes(input_bytes): """ 从p3二进制数据中解码 Opus 数据,并返回一个 Opus 数据包的列表以及总时长。 """ import io opus_datas = [] total_frames = 0 sample_rate = 16000 # 文件采样率 frame_duration_ms = 60 # 帧时长 frame_size = int(sample_rate * frame_duration_ms / 1000) f = io.BytesIO(input_bytes) while True: header = f.read(4) if not header: break _, _, data_len = struct.unpack('>BBH', header) opus_data = f.read(data_len) if len(opus_data) != data_len: raise ValueError(f"Data length({len(opus_data)}) mismatch({data_len}) in the bytes.") opus_datas.append(opus_data) total_frames += 1 total_duration = (total_frames * frame_duration_ms) / 1000.0 return opus_datas, total_duration