下面先解析AVInputFormat ff_rtsp_demuxer结构体
ffmpeg中打开流的函数如下所示:
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
函数第三个参数就是 AVInputFormat *fmt,当参数为非NULL时,则该参数由调用者指定,否则由ffmpeg自动获取。
因此在读流时,这个参数是绕不开的。
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、 rtsp_read_header、 rtsp_read_packet、 rtsp_read_close、 rtsp_read_seek、 rtsp_read_play、 rtsp_read_pause 7个操作
rtsp_probe用于探测视频流格式
rtsp_read_header 用于连接 rtsp server并读取rtsp的头信息
rtsp_read_packet 用于获取rtsp视频流的packet数据
rtsp_read_close 关闭RSTP视频流
rtsp_read_seek 用于跳转到RTSP视频流指定帧位置
rtsp_read_play 用于开始播放RTSP视频流
rtsp_read_pause 用于暂停RTSP视频流
对应rtsp协议看可以加深rtsp协议中
DESCRIBE、ANNOUNCE、OPTIONS、PAUSE、PLAY、RECORD、
SETUP、SET PARAMETER、TEARDOWN、GET PARAMETER等Method的理解