Golang视频流中的PAT与PMT详解

Golang视频流中的PAT与PMT详解 我正在研究获取视频流的视频包ID、PMT和PAT详细信息。使用下面的包我能够获取视频的PID详细信息。 https://github.com/Comcast/gots/tree/master/packet(我已导入此包)

是否有其他包可用于获取流媒体视频的PMT和PAT详细信息?

谢谢

3 回复

感谢 Calmh

更多关于Golang视频流中的PAT与PMT详解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


它就在您引用的包(或其同级包)中:https://godoc.org/github.com/Comcast/gots/psi

在Go语言中,处理MPEG传输流(TS)的PAT(Program Association Table)和PMT(Program Map Table)时,除了gots包,还可以使用github.com/asticode/go-astits库,它专门用于解析MPEG传输流,包括PAT和PMT的提取。以下是一个示例代码,展示如何使用astits包从视频流中读取PAT和PMT详细信息。

首先,确保安装astits包:

go get github.com/asticode/go-astits

然后,使用以下代码解析传输流文件或流,提取PAT和PMT数据:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/asticode/go-astits"
)

func main() {
    // 打开传输流文件(例如 .ts 文件)
    f, err := os.Open("example.ts")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    // 创建ASTits demuxer
    dmx := astits.NewDemuxer(f)

    // 循环读取数据包
    for {
        // 读取下一个数据
        data, err := dmx.NextData()
        if err != nil {
            log.Fatal(err)
        }

        // 检查是否为PAT
        if data.PAT != nil {
            fmt.Printf("PAT 发现: 传输流ID %d\n", data.PAT.TransportStreamID)
            for _, program := range data.PAT.Programs {
                fmt.Printf("  节目号: %d, PMT PID: %d\n", program.ProgramNumber, program.ProgramMapPID)
            }
        }

        // 检查是否为PMT
        if data.PMT != nil {
            fmt.Printf("PMT 发现: 节目号 %d, PCR PID: %d\n", data.PMT.ProgramNumber, data.PMT.PCRPID)
            for _, stream := range data.PMT.ElementaryStreams {
                fmt.Printf("  流类型: %d, PID: %d\n", stream.StreamType, stream.ElementaryPID)
            }
        }

        // 可选:处理其他数据,如PES包
        if data.PES != nil {
            // 这里可以处理PES数据,例如提取视频或音频包
            fmt.Printf("PES PID: %d, 数据长度: %d\n", data.PES.Header.PID, len(data.PES.Data))
        }
    }
}

此代码会打开一个传输流文件(如example.ts),使用astits解析器读取数据包。当检测到PAT时,它会输出传输流ID和每个节目的PMT PID;对于PMT,它会显示节目号、PCR PID以及每个基本流的类型和PID。这有助于识别视频包ID(通常从PMT中获取)。

注意:实际应用中,可能需要处理文件结束或错误情况,例如在NextData()返回错误时退出循环。如果处理实时流,可以调整输入源为网络连接或其他流接口。astits库提供了更全面的MPEG-TS解析功能,包括处理PSI/SI表。

回到顶部