焦作电子商务网站建设实例,南京 郑州网站建设公司 网络服务,动感十足的网站,个人网站一键生成目录 0.avformat_open_input的rtsp流程程纯净版1.rtsp拉流流程图2.rtsp拉流对象图 标准rtsp协议的基石是tcp#xff0c;本节探索下ffmpeg的rtsp拉流协议tcp的创建及rtsp协商过程。
0.avformat_open_input的rtsp流程程纯净版
ffmpeg拉流#xff0c;从avformat_open_input接口… 目录 0.avformat_open_input的rtsp流程程纯净版1.rtsp拉流流程图2.rtsp拉流对象图 标准rtsp协议的基石是tcp本节探索下ffmpeg的rtsp拉流协议tcp的创建及rtsp协商过程。
0.avformat_open_input的rtsp流程程纯净版
ffmpeg拉流从avformat_open_input接口开始去除与rtsp拉流无关的代码后如下 int avformat_open_input(AVFormatContext **ps, const char *filename,const AVInputFormat *fmt, AVDictionary **options)
{AVFormatContext *s *ps;FFFormatContext *si;AVDictionary *tmp NULL;int ret 0;if (!s !(s avformat_alloc_context()))return AVERROR(ENOMEM);si ffformatcontext(s);if (!s-av_class) {av_log(NULL, AV_LOG_ERROR, Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n);return AVERROR(EINVAL);}if (options)av_dict_copy(tmp, *options, 0);if ((ret av_opt_set_dict(s, tmp)) 0)goto fail;if (!(s-url av_strdup(filename ? filename : ))) {ret AVERROR(ENOMEM);goto fail;}if ((ret init_input(s, filename, tmp)) 0)goto fail;s-probe_score ret;s-duration s-start_time AV_NOPTS_VALUE;/* Allocate private data. */if (s-iformat-priv_data_size 0) {if (!(s-priv_data av_mallocz(s-iformat-priv_data_size))) {ret AVERROR(ENOMEM);goto fail;}if (s-iformat-priv_class) {*(const AVClass **) s-priv_data s-iformat-priv_class;av_opt_set_defaults(s-priv_data);if ((ret av_opt_set_dict(s-priv_data, tmp)) 0)goto fail;}}if (s-iformat-read_header){if ((ret s-iformat-read_header(s)) 0) {if (s-iformat-flags_internal FF_FMT_INIT_CLEANUP)goto close;goto fail;}}si-raw_packet_buffer_size 0;update_stream_avctx(s);if (options) {av_dict_free(options);*options tmp;}*ps s;return 0;close:if (s-iformat-read_close)s-iformat-read_close(s);
fail:av_dict_free(tmp);avformat_free_context(s);*ps NULL;return ret;
}
其中留下了字典参数配置流程因为基本会有所设置参数配置参见《ffmpeg面向对象——参数配置机制及其设计模式探索》。
输入格式匹配看下面流程图会清晰点参见《ffmpeg面向对象-rtsp拉流相关对象》的第2节。
协议匹配机制看下面流程图会清晰点参见《ffmpeg面向对象——拉流协议匹配机制探索》。
输入格式类与协议类什么关系参见《ffmpeg面向对象——AVInputFormat与URLProtocol啥关系》。
这些结合流层图与对象图看会清晰点。
1.rtsp拉流流程图 rtsp的tcp链接创建在图中最右边。 rtsp协商流程也比较清晰可以看到ff_rtsp_send_cmd是各个协商方法最终都要调用的中心转发节点。 另外可以看到底层tcp协议读写是如何对接的结合下面对象图就能深入理解输入格式类与协议类的关系它们面向接口编程各自分层迭代开发互不影响。
2.rtsp拉流对象图 可琢磨的比较多其中输入格式类与底层协议类型都是“可变的”因为这两者都是代码运行中匹配出来的所以它们都被更上一层的进行“托管”。参见《ffmpeg面向对象——priv_data设计原理探索》。