首页 > 代码库 > ffmpeg中关于ffplay部分的概要分析-2
ffmpeg中关于ffplay部分的概要分析-2
- 全局变量options[] 包含了所支持的所有的命令行选项,可以用来确认所输入的变量是否能对应到options[]中,若解析正确则将得到的值赋予给options[]中所提前指定的变量中,比如video_disable和audio_disable的值就来自于命令行。函数parse_options()会对命令行中输入的参数进行解析,解析的依据就是全局变量 options[]。
- 函数SDL_Init(flags),其中flags=SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER,猜测是初始化SDL中对应的模块,比如Video,Audio等。
- 函数: SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
该函数的作用意思是当对应的事件发生时,忽略该事件。
4. 函数SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL)设定按下按键的时长以及连续按下键的间隔。
5. 全局变量VideoState{}存储着三个模式(Video, Audio, Subtitle)各自的状态信息,该内存区域被后续开辟的线程所共享。
它是在函数stream_open()中申请的内存。
函数avformat_open_input()的调用栈分析:
1. 在函数init_input()中,当判断是非文件格式的数据流时,则直接调用函数av_probe_input_format2()对该数据流文件的后缀名进行probe探测分析,当判断是文件类的数据流时,会先调用函数s->io_open()先打开该文件,然后再调用函数av_probe_input_buffer2()进行数据流文件后缀名的分析。
疑问:非文件流的文件也有后缀名吗?
2. 函数av_iformat_next()从format链表first_iformat中不断的取出链表项。每个链表项中的数据包含一个文件类型比如:avfoundation, lavfi等,同时对每种类型的数据流,链表项中又包含一组API函数可以被调来对该类数据流进行分析,比如 read_probe(), read_header(), read_packet(), read_close(), read_seek(), read_play(), read_pause()等等这些API函数。
3. 函数ff_guess_image2_codec()使用文件后缀名数组ff_img_tags[]和输入的文件名后缀进行比较,该函数在img_read_probe()中被调用。img_read_probe()在检测完文件后缀名后,会返回一个score评分。如果后缀名匹配,则评分比较高。
4. 函数s->io_open()映射的是函数io_open_default(),这是该函数调用栈结构
io_open_default()
ffio_open_whitelist()
ffurl_open_whitelist()
ffurl_connect()
uc->prot->url_open()
file_open()
file_open()会最终打开由命令行送入的文件,得到文件的句柄。
io_open_default()
ffio_open_whitelist()
ffurl_open_whitelist()
ffio_fdopen()
函数ffio_fdopen()会打开对应的io函数为该文件的操作做准备,这些io函数列表如下:
io_read_packet()
io_write_packet()
io_seek()
io_read_pause()
io_read_seek()
ffmpeg中关于ffplay部分的概要分析-2