把 LLM 当成一个「算力旋钮」:拆解 Karpathy nanochat miniseries 的训练哲学
2026/6/4 22:06:16
第一次接触RTSP协议时,我盯着抓包数据看了整整三天。那是在2013年调试海康威视摄像头时,发现明明发送了PLAY请求,视频流却怎么都出不来。后来才发现是SETUP阶段没正确协商传输通道——这个教训让我明白,理解RTSP必须从最基础的概念开始。
RTSP(Real Time Streaming Protocol)本质上是个"网络遥控器"。想象你坐在沙发上用遥控器控制电视:PLAY是播放键,PAUSE是暂停键,TEARDOWN相当于关闭电视。但与HTTP下载视频不同,RTSP不直接传输数据,而是通过RTP/RTCP协议传输媒体流,自己只负责控制指令。
协议栈层级关系是这样的:
我整理了一份RTSP与HTTP的对比表格:
| 特性 | RTSP | HTTP |
|---|---|---|
| 连接状态 | 有状态(维持会话) | 无状态 |
| 端口号 | 554 | 80 |
| 请求方向 | 双向交互 | 仅客户端发起 |
| 数据承载 | 依赖RTP传输 | 直接传输 |
| 典型延迟 | 1-3秒 | 5-30秒 |
去年给某安防厂商做技术培训时,我用Wireshark抓取了完整的RTSP交互过程。让我们通过真实案例看看协议如何工作:
C->S: OPTIONS rtsp://192.168.1.100:554/stream RTSP/1.0 CSeq: 1 S->C: RTSP/1.0 200 OK CSeq: 1 Public: DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWNC->S: DESCRIBE rtsp://192.168.1.100:554/stream RTSP/1.0 CSeq: 2 Accept: application/sdp S->C: RTSP/1.0 200 OK Content-Type: application/sdp Content-Length: 386 v=0 o=- 123456 1 IN IP4 192.168.1.100 m=video 0 RTP/AVP 96 // 视频流 a=rtpmap:96 H264/90000 a=control:track0 m=audio 0 RTP/AVP 97 // 音频流 a=rtpmap:97 mpeg4-generic/44100/2C->S: SETUP rtsp://192.168.1.100:554/stream/track0 RTSP/1.0 CSeq: 3 Transport: RTP/AVP;unicast;client_port=8000-8001 S->C: RTSP/1.0 200 OK CSeq: 3 Transport: RTP/AVP;unicast; client_port=8000-8001; server_port=9000-9001 Session: 12345678 // 重要会话IDC->S: PLAY rtsp://192.168.1.100:554/stream RTSP/1.0 CSeq: 4 Session: 12345678 Range: npt=0.000- S->C: RTSP/1.0 200 OK CSeq: 4 Session: 12345678 RTP-Info: url=...;seq=1001C->S: PAUSE rtsp://192.168.1.100:554/stream RTSP/1.0 CSeq: 5 Session: 12345678C->S: TEARDOWN rtsp://192.168.1.100:554/stream RTSP/1.0 CSeq: 6 Session: 12345678曾有个项目出现视频卡顿问题,最后发现是RTCP反馈被防火墙拦截。这让我意识到理解传输层的重要性。
RTP头部关键字段(以H.264视频为例):
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | synchronization source (SSRC) identifier | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | contributing source (CSRC) identifiers | | .... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | payload data | | ...... |RTCP有五种报文类型,最常用的是:
示例接收报告:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P| RC | PT=RR=201 | length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC of packet sender | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | SSRC_1 (SSRC of first source) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | fraction lost | cumulative number of packets lost | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | extended highest sequence number received | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | interarrival jitter | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | last SR (LSR) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | delay since last SR (DLSR) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+去年实施智慧工地项目时,我们需要对接300多台海康摄像头。总结出以下经验:
标准RTSP URL模板:
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream实际示例:
# 主码流(高清) url1 = "rtsp://admin:123456@192.168.1.64:554/h264/ch1/main/av_stream" # 子码流(标清) url2 = "rtsp://admin:123456@192.168.1.64/mpeg4/ch1/sub/av_stream"Transport: RTP/AVP/TCP;interleaved=0-1在某直播平台项目中,我们设计了这样的架构:
[摄像头] --RTSP--> [边缘节点] --RTMP--> [CDN] --HLS--> [观众] ↳ 转码/录制/分析关键配置项:
# nginx-rtmp配置示例 application live { live on; drop_idle_publisher 5s; # RTSP转RTMP exec_static ffmpeg -i rtsp://cam1/stream -c copy -f flv rtmp://localhost/live/stream1; exec_static ffmpeg -i rtsp://cam2/stream -c copy -f flv rtmp://localhost/live/stream2; }通过以下措施将端到端延迟从3秒降至800ms:
-rtsp_transport tcp -buffer_size 1024000pipeline = ( "rtspsrc location={url} latency=0 ! " "rtph264depay ! h264parse ! nvh264dec ! " "videoconvert ! appsink" )这些实战经验让我深刻理解到,协议不仅要懂原理,更要能在复杂环境中灵活应用。当你下次遇到RTSP问题时,不妨先从抓包分析开始——数据包永远不会说谎。