尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RTMP 世界里的“身份证”——CodecID 与 FourCC

RTMP 世界里的“身份证”——CodecID 与 FourCC 目标理解 RTMP 为什么需要 CodecID搞懂 FourCC 与 CodecID 的区别看懂ParseAudioCodec / ParseVideoCodec的设计意图故事开场凌晨两点你的直播服务器收到一个 RTMP 推流。数据里只有一堆字节播放器怎么知道这是 H.264 还是 H.265答案藏在CodecID里。核心知识什么是 CodecIDRTMP / FLV 协议规定的“编码格式编号”例如7 H.2640xC H.265FourCC 是什么国际标准ISO/IEC 14496-12例如avc1、hvc1、av01为什么需要“翻译”RTMP 不认 FourCC只认 CodecID代码中ParseVideoCodec就是“翻译官”源码精读func ParseVideoCodec(name codec.FourCC) VideoCodecID { switch name { case codec.FourCC_H264: return CodecID_H264 case codec.FourCC_H265: return CodecID_H265 case codec.FourCC_AV1: return CodecID_AV1 } return 0 }常见问题为什么 RTMP 不用 FourCC​历史原因 节省带宽。RTMP 诞生时 FourCC 尚未统一且 1 字节 CodecID 比 4 字节 FourCC 更紧凑。代码示例package main import ( fmt m7s.live/v5/pkg/codec m7s.live/v5/pkg/codec/rtmp ) func main() { testCases : []codec.FourCC{ codec.FourCC_H264, codec.FourCC_H265, codec.FourCC_AV1, codec.FourCC_MP4A, codec.FourCC_OPUS, } for _, fourcc : range testCases { videoCodec : rtmp.ParseVideoCodec(fourcc) audioCodec : rtmp.ParseAudioCodec(fourcc) fmt.Printf(FourCC: %s\n, string(fourcc[:])) fmt.Printf( - VideoCodecID: %d (%s)\n, videoCodec, videoCodec) fmt.Printf( - AudioCodecID: %d (%s)\n, audioCodec, audioCodec) fmt.Println() } }运行结果FourCC: avc1 - VideoCodecID: 7 (h264) - AudioCodecID: 0 (unknow) FourCC: hvc1 - VideoCodecID: 12 (h265) - AudioCodecID: 0 (unknow) FourCC: av01 - VideoCodecID: 13 (av1) - AudioCodecID: 0 (unknow) FourCC: mp4a - VideoCodecID: 0 (unknow) - AudioCodecID: 10 (aac) FourCC: opus - VideoCodecID: 0 (unknow) - AudioCodecID: 12 (opus)总结CodecID 是 RTMP 的“内部工牌”FourCC 是国际标准的“身份证”翻译函数让两种体系可以共存
返回列表