天天看點

FFmpeg RTSP HEVC碼流探測剖析

例如:"rtsp://admin:[email protected]:554/h265/ch1/main/av_stream"

請求海康錄影機H265碼流

SDP封包如下:

v=0

o=- 1566124110963848 1566124110963848 IN IP4 192.168.28.136

s=Media Presentation

e=NONE

b=AS:5100

t=0 0

a=control:rtsp://192.168.28.136:554/h265/ch1/main/av_stream/

m=video 0 RTP/AVP 96

c=IN IP4 0.0.0.0

b=AS:5000

a=recvonly

a=x-dimensions:1920,1080

a=control:rtsp://192.168.28.136:554/h265/ch1/main/av_stream/trackID=1

a=rtpmap:96 H265/90000

a=fmtp:96 sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB7oAPAgBDlja5JMvTcBAQEAg==; sprop-pps=RAHA8vA8kAA=

m=audio 0 RTP/AVP 8

b=AS:50

a=control:rtsp://192.168.28.136:554/h265/ch1/main/av_stream/trackID=2

a=rtpmap:8 PCMA/8000

a=Media_header:MEDIAINFO=494D4B48010200000400050011710110401F000000FA000000000000000000000000000000000000;

a=appversion:1.0

static int sdp_parse_rtpmap(AVFormatContext *s,

                            AVStream *st, RTSPStream *rtsp_st,

                            int payload_type, const char *p)

通過sdp_parse_rtpmap函數分析SDP中的a=rtpmap:96 H265/90000

在調用函數        const RTPDynamicProtocolHandler *handler =

            ff_rtp_handler_find_by_name(buf, par->codec_type);中 擷取到h265的處理句柄

rtsp 分包NALU

       if (codec_id == AV_CODEC_ID_HEVC)

            ret = hevc_parse_nal_header(nal, logctx);

        else

            ret = h264_parse_nal_header(nal, logctx);

static void parse_fmtp(AVFormatContext *s, RTSPState *rt,

                       int payload_type, const char *line)

通過h265的句柄調用

static av_cold int hevc_parse_sdp_line(AVFormatContext *ctx, int st_index,

                                       PayloadContext *hevc_data, const char *line)

該函數将SPS/PPS的内容儲存在(AVFormatContext結構體中的AVStream流中的extradata變量

建立視訊流和音頻流

update_stream_avctx函數隻是将avcodec_parameters_to_context(st->internal->avctx, st->codecpar);

并沒有做其他的操作