Repository navigation
RTSP
skrtk98 edited this page Oct 24, 2026
·
1 revision
- URL は
rtsp://ユーザ:パスワード@<カメラ>:554/streamN。認証は Digest で、カメラアカウントを使う。 - サーバの名前は SDP の
s=Session streamed by "TP-Link RTSP Server"。 -
stream1・stream2・stream8が使える。stream3は404 Stream Not Found。
| ストリーム | ONVIF のプロファイル | 映像 | 音声 |
|---|---|---|---|
| stream1 | profile_1 | H.264 High 2560×1440、30fps | G.711 A-law 8kHz モノラル |
| stream2 | profile_2 | H.264 High 640×360、30fps | 同上 |
| stream8 | profile_3(jpegStream) | MJPEG 640×360 | 同上 |
Require: www.onvif.org/ver20/backchannel を付けた DESCRIBE の応答(stream1):
s=Session streamed by "TP-Link RTSP Server"
m=video 0 RTP/AVP 96
b=AS:4096
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; profile-level-id=640032; sprop-parameter-sets=Z2QAMqzSgKAC1oQAAA+kAAOqcBA=,aO4wrIKw
m=audio 0 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=control:track2
-
profile-level-id=640032は High プロファイルの Level 5.0。 - backchannel を求めても、トラックは映像と音声(どちらも受信)の2本だけ。カメラへ音声を送るトラックは無い。
- PLAY の応答の RTP-Info は、どちらのトラックも
rtptime=0。 - ONVIF は音声を 16kHz と答えるが、SDP も中身も 8kHz。
30 秒間受け取って数えた値。
| stream1 | stream2 | |
|---|---|---|
| ビットレート | 2041kbps | 219kbps |
| フレームレート | 30.0fps(890 パケット / 30 秒) | 30.0fps |
| キーフレームの間隔 | 1.99〜2.00 秒(30 秒で 15 枚) | 2.00 秒 |
| キーフレームの平均の大きさ | 178,686 B | 24,063 B |
| それ以外のフレームの平均 | 5,578 B | 513 B |
| B フレーム | 無い(dts と pts が違うフレームは 0) | 無い |
- 音声は 1 パケットが 512 バイト(64ms ぶん)で、毎秒約 15.7 パケット(64kbps)。
- ffprobe は
r_frame_rateを stream1 で60/1、stream2 で60000/1001と出すが、実際は 30fps。 - 到着の間隔は、映像が中央値 33ms・p95 42〜43ms・p99 56ms・最大 67〜77ms、音声が中央値 64ms・最大 114〜146ms。
- JPEG は JFIF、yuvj422p、1 枚約 48KB。ffprobe の
r_frame_rateは269/12。 - 5 秒間に届いた 307 枚のうち、別の画像は 5 枚だけだった。同じ画像を送り直してくるので、約 25Mbps(6 秒で 18.8MB)にもなる。
- Chromium ではこの JPEG が灰色にしか描かれなかった。ライブラリでは使っていない。
- 同時に受けられるのは 3 接続まで。同じストリーム 3 本でも、別々のストリームでも同じ。
- 4 本めは約 0.2 秒で拒まれる。ffmpeg は
Operation not permitted、PyAV はPermissionErrorになる(RTSP のステータスコードは記録していない)。 - 6 秒間
-c copyで受けたときの量は、1 本あたり stream1 が 1.53〜1.76MB、stream2 が 0.20〜0.23MB。
音声のトラックだけを SETUP すると(ffmpeg の -allowed_media_types audio)、何も届かず時間切れになる。
録音するときも、映像ごと受けて捨てる必要がある。
RTP のタイムスタンプは正しく進み、パケットも滑らかに届く(12 秒間で RTP の時刻が戻ったのは 0 回)。 問題は、約 0.5 秒ごとに届く RTCP の Sender Report(SR)である。SR が示す NTP 時刻と RTP 時刻の対応が、交互に大きくずれる。
SR ごとのずれ:+0 → −382 → −24 → +360 → −51 → +333 ms …
libav(ffmpeg)は SR に合わせて pts を直すので、pts が 327〜376ms 戻っては 390〜443ms 飛ぶことを毎秒くり返す。
影響:
- ffmpeg で MP4 に録画すると、16 秒で 24 回、最大 420ms の乱れが映像に出る。音声(AAC)も最大 510ms 乱れる。WAV への録音は影響を受けない。
-
-vnで音声だけ取り出すとNon-monotonic DTSの警告が続く。 - WebRTC では、ブラウザが映像を毎秒止め(20 秒で 20 回・計 7 秒)、音声の約 43% を補間で埋めた。
対策:
| 方法 | 結果 |
|---|---|
-fflags nobuffer+igndts |
直らない |
-use_wallclock_as_timestamps 1(届いた時刻を使う) |
戻りは 0 回。MP4 の乱れは 12 秒で 1〜5 回、最大 73〜110ms に減った |
| 自前で付け直す(映像は飛びを1つ前の進み幅に置き換え、音声は標本の数で数える) | WebRTC で止まり 0 回、補間 0%、30fps(WebRTC でブラウザへ送る) |
スピーカーへ送っている途中に、カメラが受信を止めたことが 1 回あった。
- 約 42 秒ぶんを送ったところで TCP の確認が止まり、同じ時間帯の RTSP の新規接続は 10 秒で時間切れになった。
- このとき RTSP の 3 枠は、残ってしまった録音用の ffmpeg 2 本と WebRTC で埋まっていた。
- ping と 4 つのポートの応答は、あとで戻った。
- 1 回試した再現では起きなかった。原因は分かっていない。