Home  >  Article  >  Backend Development  >  Generate CRC-32 for SDT to ts. document

Generate CRC-32 for SDT to ts. document

PHPz
PHPzforward
2024-02-10 20:20:071071browse

为 SDT 到 ts 生成 CRC-32。文件

php Xiaobian Yuzai will introduce a method to generate CRC-32 through SDT to ts to verify the integrity of the file. CRC-32 is a commonly used checksum algorithm that generates a 32-bit check value by calculating the binary data of the file. This check value can be used to verify whether errors or corruption occurred during file transfer or storage. Using this method, we can ensure file integrity and improve data transfer reliability.

Question content

My task is to capture the video stream from the server and write it to ts. document. I'm having trouble trying to write an SDT package to ts. I manually form the packet by bytes but don't know how to calculate the CRC-32 of the 4 bytes at the end of the SDT. (using golang)

I tried to get the CRC based on the checksum of the data that has been written to the SDT packet, but it doesn't work. In the SDT parsed byte by byte, the CRC is different from what I calculated.

Workaround

If you are talking about mpeg-2, the crc is defined as:

width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0x00000000 check=0x0376e6e7 residue=0x00000000 name="crc-32/mpeg-2"
There is an example in

rfc 4326:

00 3f 86 dd 00 01 02 03 04 05 60 00 00 00 00 0d
3a 40 20 01 0d b8 30 08 19 65 00 00 00 00 00 00
00 01 20 01 0d b8 25 09 19 62 00 00 00 00 00 00
00 02 80 00 9d 8c 06 38 00 04 00 00 00 00 00 7c
17 17 63

Where the last four bytes are the crc-32/mpeg-2 (in big-endian order) of all the bytes preceding it.

The following is a c code example to calculate crc:

#include <stddef.h>
#include <stdint.h>

uint32_t crc32mpeg2(uint32_t crc, void const *mem, size_t len) {
    unsigned char const *data = mem;
    if (data == NULL)
        return 0xffffffff;
    for (size_t i = 0; i < len; i++) {
        crc ^= (uint32_t)data[i] << 24;
        for (unsigned k = 0; k < 8; k++) {
            crc = crc & 0x80000000 ? (crc << 1) ^ 0x4c11db7 : crc << 1;
        }
    }
    return crc;
}

(When mem is equal to null, the initial crc value is returned.)

The above is the detailed content of Generate CRC-32 for SDT to ts. document. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete