news 2026/9/14 10:24:52

go2rtc 媒体格式 / 协议 / 编解码器全览:Producers、Consumers 与 Snapshots 支持矩阵

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go2rtc 媒体格式 / 协议 / 编解码器全览:Producers、Consumers 与 Snapshots 支持矩阵

go2rtc 媒体格式 / 协议 / 编解码器全览:Producers、Consumers 与 Snapshots 支持矩阵

【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc

go2rtc(Ultimate camera streaming application)是一个以 Go 编写的流媒体应用,其pkg/目录承载着全部媒体格式与协议的编解码实现。本文基于 pkg/README.md 的核心命名约定与三张支持矩阵(输入 Producers、输出 Consumers、快照 Snapshots),结合main.gointernal/README.mdpkg/core/core.go等源码,系统梳理 go2rtc 对音视频格式、传输协议与编解码器的完整支持面,帮助你快速判断某一路流应该用什么格式接入、用哪个 API 输出,以及如何在 go2rtc 中新增一种自定义格式。

命名约定:向 FFmpeg 看齐,兼容其术语体系

go2rtc 在设计上刻意让格式(format)、协议(protocol)与编解码器(codec)的命名方式与 FFmpeg 保持一致:

go2rtc tries to name formats, protocols and codecs the same way they are named in FFmpeg. Some formats and protocols go2rtc supports exclusively. They have no equivalent in FFmpeg.

这一约定带来的直接收益是:熟悉 FFmpeg 的用户几乎不需要学习成本就能读懂 go2rtc 的配置与 API。例如rtsp:rtmp:hlsadtsmpegtspcm_alawpcm_mulaw等术语,在 FFmpeg 生态中含义相同。同时 go2rtc 也有一些 FFmpeg 没有的独占格式与协议(如bubble:doorbird:eseecloud:等私有云/私有设备协议),它们会在下文各矩阵中体现。

Producers(输入):四大角色与全量支持矩阵

在 go2rtc 的输入侧,连接发起方与数据流向决定了模块的角色:

  • Source protocols(源协议):连接由 go2rtc 主动发起,即 go2rtc 作为客户端去拉取远端流;
  • Ingress protocols(入站协议):连接由外部程序发起,go2rtc 作为服务端接收外部推流(对应内部架构中的 ingest 能力);
  • Receiver codecs(接收编解码器):编解码器是"进来"的,即 go2rtc 接收并解码该编码的媒体;
  • Sender codecs(发送编解码器):编解码器是"出去"的,即 go2rtc 向外发送该编码的媒体,用于双向音频(two-way audio)等场景。

Producers 完整矩阵

GroupFormatProtocolsIngressReceiver codecsSender codecsExample
Devicesalsapipepcmalsa:
Devicesv4l2pipev4l2:
Filesadtshttp, tcp, pipehttpaachttp:
Filesflvhttp, tcp, pipehttph264, aachttp:
Filesh264http, tcp, pipehttph264http:
Fileshevchttp, tcp, pipehttphevchttp:
Fileshlshttph264, h265, aac, opushttp:
Filesmjpeghttp, tcp, pipehttpmjpeghttp:
Filesmpegtshttp, tcp, pipehttph264, hevc, aac, opushttp:
Fileswavhttp, tcp, pipehttppcm_alaw, pcm_mulawhttp:
Net (pub)mpjpeghttp, tcp, pipehttpmjpeghttp:
Net (pub)onvifrtsponvif:
Net (pub)rtmprtmprtmph264, aacrtmp:
Net (pub)rtsprtsp, wsrtsph264, hevc, aac, pcm*, opuspcm*, opusrtsp:
Net (pub)webrtc*webrtcwebrtch264, pcm_alaw, pcm_mulaw, opuspcm_alaw, pcm_mulawwebrtc:
Net (pub)yuv4mpegpipehttp, tcp, pipehttprawvideohttp:
Net (priv)bubblehttph264, hevc, pcm_alawbubble:
Net (priv)doorbirdhttpdoorbird:
Net (priv)dvriptcph264, hevc, pcm_alaw, pcm_mulawpcm_alawdvrip:
Net (priv)eseecloudhttpeseecloud:
Net (priv)goproudpTODOgopro:
Net (priv)hasswebrtcTODOhass:
Net (priv)homekithaph264, eld*homekit:
Net (priv)isapihttppcm_alaw, pcm_mulawisapi:
Net (priv)kasahttph264, pcm_mulawkasa:
Net (priv)nestrtsp, webrtcTODOnest:
Net (priv)ringwebrtcring:
Net (priv)roborockwebrtch264, opusopusroborock:
Net (priv)tapohttph264, pcmapcm_alawtapo:
Net (priv)tuyawebrtctuya:
Net (priv)vigihttpvigi:
Net (priv)webtorrentwebrtcTODOTODOTODOwebtorrent:
Net (priv)xiaomi*cs2, tutkxiaomi:
Servicesflussonicwsflussonic:
Servicesivideonwsh264ivideon:
Servicesyandexwebrtcyandex:
Otherecho*echo:
Otherexecpipe, rtspexec:
Otherexpr*expr:
Otherffmpegpipe, rtspffmpeg:
Otherstdinpipepcm_alaw, pcm_mulawstdin:

矩阵注释(Codec 组定义)

  • eld:aac 编解码器的罕见变体(AAC-ELD,常见于 HomeKit 视频门铃/对讲场景),见 pkg/core/core.go 中的CodecELD = "ELD"定义;
  • pcm:指pcm_alawpcm_mulawpcm_s16bepcm_s16le四种 PCM 变体;
  • webrtc:指 WebRTC 在 go2rtc 中的一系列专有客户端变体:webrtc/kinesiswebrtc/openipcwebrtc/milestonewebrtc/wyzewebrtc/whep

从源码看 Producers 的角色划分

矩阵中四类角色的划分并非文档发明,而是直接体现在核心接口上。pkg/core/core.go 定义了Producer接口:

type Producer interface { // GetMedias - return Media(s) with local Media.Direction: // - recvonly for Producer Video/Audio // - sendonly for Producer backchannel GetMedias() []*Media // GetTrack - return Receiver, that can only produce rtp.Packet(s) GetTrack(media *Media, codec *Codec) (*Receiver, error) // Deprecated: rename to Run() Start() error // Deprecated: rename to Close() Stop() error }

注释清楚地说明了"双向音频"(backchannel)在实现上的落点:普通 Producer 的 Media 方向是recvonly(接收远端视频/音频),而回传通道(Sender codecs)的 Media 方向是sendonly。以 RTSP 为例,pkg/rtsp/producer.go 中的GetTrackcore.ModeActiveProducer(go2rtc 主动拉流)与core.ModePassiveConsumer(backchannel 回传)两种模式下分别分配 RTP 通道,正是矩阵中rtsp同时具备 Receiver codecs(h264、hevc、aac、pcm*、opus)与 Sender codecs(pcm*、opus)的实现依据。

另外注意 Devices 分组:alsav4l2都使用pipe协议(本地设备走管道),其中alsa同时具备pcm的 Sender codecs,说明 go2rtc 支持通过 ALSA 设备进行音频采集与回放(双向音频),对应实现位于 pkg/alsa 与 internal/alsa。

Consumers(输出):格式、协议与 API 端点

输出侧(Consumers)矩阵列出了 go2rtc 对外提供流服务的所有方式,其中 "Send codecs" 是 go2rtc 向客户端发送的编码,"Recv codecs" 是 go2rtc 从客户端接收的编码(同样服务于双向音频等场景):

FormatProtocolSend codecsRecv codecsExample
adtshttpaacGET /api/stream.adts
asciihttpmjpegGET /api/stream.ascii
flvhttph264, aacGET /api/stream.flv
hls/mpegtshttph264, hevc, aacGET /api/stream.m3u8
hls/fmp4httph264, hevc, aac, pcm*, opusGET /api/stream.m3u8?mp4
homekithaph264, opusApple HomeKit app
mjpegwsmjpeg{"type":"mjpeg"}->/api/ws
mpjpeghttpmjpegGET /api/stream.mjpeg
mp4httph264, hevc, aac, pcm*, opusGET /api/stream.mp4
mse/fmp4wsh264, hevc, aac, pcm*, opus{"type":"mse"}->/api/ws
mpegtshttph264, hevc, aacGET /api/stream.ts
rtmprtmph264, aacrtmp://localhost:1935/{stream_name}
rtsprtsph264, hevc, aac, pcm*, opusrtsp://localhost:8554/{stream_name}
webrtcwebrtch264, pcm_alaw, pcm_mulaw, opuspcm_alaw, pcm_mulaw, opus{"type":"webrtc"}->/api/ws
yuv4mpegpipehttprawvideoGET /api/stream.y4m

其中pcm同样指pcm_alawpcm_mulawpcm_s16bepcm_s16le

输出侧的三个观察点

  1. HTTP API 是主输出通道:绝大多数输出格式通过 HTTP REST 端点暴露,形式统一为GET /api/stream.{format},由 internal/api/api.go 与各输出模块(internal/hls、internal/mp4、internal/mjpeg、internal/mpeg 等)共同实现;前端 Web UI 中的播放器(www 目录)正是通过这些端点拉流。
  2. WebSocket 通道承载交互式协议mjpegmse/fmp4webrtc三种输出都通过{"type":"..."}的 JSON 消息路由到/api/ws,由 internal/api/ws/ws.go 统一处理;其中webrtc是唯一同时具备 Recv codecs 的输出格式(支持pcm_alawpcm_mulawopus回传),即浏览器端经 WebRTC 实现双向音频。
  3. RTSP/RTMP 同时是输入与输出rtsp://localhost:8554/{stream_name}rtmp://localhost:1935/{stream_name}既可被 go2rtc 拉取(Source),也可由 go2rtc 对外分发(输出),对应 internal/rtsp 与 internal/rtmp 中 server 与 client 的双重实现。

Snapshots(快照):单帧抓取接口

go2rtc 还提供两种轻量级快照端点,适合门禁联动、缩略图、定时抓帧等场景:

FormatProtocolSend codecsExample
jpeghttpmjpegGET /api/frame.jpeg
mp4httph264,hevcGET /api/frame.mp4
  • GET /api/frame.jpeg:以 MJPEG 编码输出一帧 JPEG 图片;
  • GET /api/frame.mp4:输出一小段 MP4 视频(h264/hevc 编码),通常作为"几秒短视频快照"使用。

两者均由 internal/mjpeg / internal/mp4 模块承载,与 Web UI 的实时预览共用同一套流媒体管线。

Developers:如何新增一种格式(源码结构约定)

对于想在 go2rtc 中接入新设备/新格式的开发者,pkg/README.md给出了清晰的文件命名规范(File naming):

  • pkg/{format}/producer.go—— 该格式的 producer 实现(若支持 backchannel,backchannel 能力也在此文件内);
  • pkg/{format}/consumer.go—— 该格式的 consumer 实现;
  • pkg/{format}/backchannel.go—— 仅含 backchannel 功能的 producer。

这与实际仓库结构完全吻合,例如 RTSP 模块 pkg/rtsp 下同时存在producer.goconsumer.gohelpers.go;而仅做回传通道的模块如 pkg/doorbird/backchannel.go、pkg/tapo/backchannel.go、pkg/xiaomi/miss/backchannel.go 则遵循backchannel.go的独立命名约定。

新增模块时需要同步"提及"的位置(Mentioning modules)

文档明确列出,新增/修改一个模块时,需要同步更新以下文件中与该模块相关的注册或引用信息:

  • main.go —— 模块的Init注册列表(源码中以modules := []module{...}的形式按分组顺序执行初始化,例如 HTTP/RTSP/WebRTC 作为 Main sources 最先注册,硬件源与私有云源随后注册);
  • README.md —— 项目主文档中的功能说明;
  • internal/README.md —— 模块-格式-协议对照总表(该表进一步把模块细分为 "Modules 实现通信 API"、"Formats 描述数据结构"、"Protocols 实现传输",并在 internal/README.md 中列出每个模块的 formats、protocols、input/output/ingest/two-way 能力);
  • website/.vitepress/config.js —— 文档站点的侧边栏导航(注意该配置中srcDir: '..'srcExclude: ['examples/', 'pkg/'],即文档站点从仓库根目录构建,但pkg/目录被排除在站点之外,属于内部实现层);
  • website/api/openapi.yaml —— API 的 OpenAPI 描述文件;
  • www/schema.json —— 前端 Web UI 的配置 schema。

其中 main.go 的模块注册顺序值得一提:它先初始化app(配置与日志)、apiws(API 端点)、streams(流管理核心),然后是 "Main sources and servers"(http、rtsp、webrtc),再是 "Main API"(mp4、hls、mjpeg),最后是各类脚本源、硬件源与私有云源。新增格式若需要服务端能力(如监听端口),必须参考这一顺序在合适的位置注册Init

总结

pkg/README.md本质上是一张 go2rtc 的"能力全景图":输入侧按 Devices / Files / Net (pub) / Net (priv) / Services / Other 六个分组,输出侧按 Format-Protocol-API 三元组,加上 JPEG/MP4 快照端点,共同构成了完整的媒体接入与分发体系。搭配 pkg/core/core.go 的Producer/Consumer接口、main.go 的模块注册顺序以及 internal/README.md 的模块能力总表,你可以快速判断:

  • 某路摄像头(RTSP/ONVIF/私有云)该用哪个xxx:前缀接入;
  • 浏览器、播放器、Home Assistant 等下游分别该走哪个/api/stream.*端点;
  • 双向往来(双向音频、语音回传)依赖哪些 Sender/Recv codecs;
  • 新协议接入时该在pkg/下如何组织producer.go/consumer.go/backchannel.go文件,以及需要同步修改哪些注册与文档文件。

【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 10:24:37

Python虚拟环境实战:从原理到企业级应用

1. Python虚拟环境核心价值解析在Python开发领域,虚拟环境(venv)是项目依赖管理的基石工具。我经历过多个Python项目因缺乏环境隔离导致的"依赖地狱"——不同项目对同一包有冲突版本要求时,系统级的Python环境会陷入混乱…

作者头像 李华
网站建设 2026/9/14 10:22:54

AI论文写作工具测评与继续教育应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 10:19:12

UNIHIKER便携录音机:Python+Flask嵌入式音频终端设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 10:15:41

MATLAB交通标志识别课设:BP网络与图像预处理全解析

简介:基于MATLAB的道路路标识别源码,源于大三图像处理期末课程设计,利用BP神经网络与图像预处理技术,实现对指示类、警示类、禁止类交通标志的自动分类与识别。项目代码完整、运行稳定,既适合计算机、人工智能、大数据…

作者头像 李华
网站建设 2026/9/14 10:15:07

PLC与组态软件在停车场收费系统中的电气控制设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华