一 前言
在《ffmpeg 之 RTSP 一》主要讲解关于RTSP 协议部分, 本文主要讲解关于RTSP 在 ffmpeg 中是如何实现的, 相关代码见libavformat/rtspdec.c , libavformat/rtsp.c.
还是从如下几个函数入手:
AVInputFormat ff_rtsp_demuxer = {
.name = "rtsp",
.long_name = NULL_IF_CONFIG_SMALL("RTSP input"),
.priv_data_size = sizeof(RTSPState),
.read_probe = rtsp_probe,
.read_header = rtsp_read_header,
.read_packet = rtsp_read_packet,
.read_close = rtsp_read_close,
.read_seek = rtsp_read_seek,
.flags = AVFMT_NOFILE,
.read_play = rtsp_read_play,
.read_pause = rtsp_read_pause,
.priv_class = &rtsp_demuxer_class,
};
二 rtsp_probe()
在ffmpeg 中是如何识别当前的是rtsp流呢? 答案是根据url ,比较简单直接贴代码。当然不是所有的协议都是判别URL 的, 如HLS 它就需要判别M3U8 内容。
static int rtsp_probe(AVProbeData *p)
{
if (
#if CONFIG_TLS_PROTOCOL
av_strstart(p->filename, "rtsps:", NULL) ||
#endif
av_strstart(p->filename, "rtsp:", NULL))
return AVPROBE_SCORE_MAX;
return 0;
}
三 rtsp_read_header()