Golang视频流中的PAT与PMT详解
Golang视频流中的PAT与PMT详解 我正在研究获取视频流的视频包ID、PMT和PAT详细信息。使用下面的包我能够获取视频的PID详细信息。 https://github.com/Comcast/gots/tree/master/packet(我已导入此包)
是否有其他包可用于获取流媒体视频的PMT和PAT详细信息?
谢谢
它就在您引用的包(或其同级包)中: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表。

