我決定嘗試使用檔案格式,并使用 python 來讀取所述檔案。我從 Ogg 標頭中提取的所有內容都是正確的,除了 crc 檢查。檔案
說您必須檢查
整個標題和頁面,并將原始 crc 檢查值設定為 0。
我想知道我缺少哪些步驟來獲得預期的結果。
import zlib
import struct
with open("sample3.opus", "rb") as f_:
file_data = f_.read()
cp, ssv, htf, agp, ssn, psn, pc, ps = struct.unpack_from("<4sBBQIIIB", file_data, 0)
offset = struct.calcsize("<4sBBQIIIB")
segments = struct.unpack_from(f"<{ps}B", file_data, offset)
packet_size = 0
for num in segments:
packet_size = num
header_size = offset len(segments) packet_size
# Copying the entire packet then changing the crc to 0.
header_copy = bytearray()
header_copy.extend(file_data[0:header_size])
struct.pack_into("<I", header_copy, struct.calcsize("<4sBBQII"), 0)
print(pc)
print(zlib.crc32(header_copy))
該腳本導致:
277013243
752049619
我正在使用的音頻檔案:
https ://filesamples.com/formats/opus
uj5u.com熱心網友回復:
zlib.crc32()
不是他們指定的CRC。他們說初始值和最終異或為零,而對于zlib.crc32()
,這些值都是0xffffffff
。他們沒有指定他們的 CRC 是否被反映,所以你需要同時嘗試看看它是哪個。
更新:
我查了一下,這是一個正向CRC。不幸的是,你不能用zlib.crc32()
它來計算它。你可以用這個來計算它:
def crc32ogg(seq):
crc = 0
for b in seq:
crc ^= b << 24
for _ in range(8):
crc = (crc << 1) ^ 0x104c11db7 if crc & 0x80000000 else crc << 1
return crc
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507184.html