首页 > 代码库 > ffmpeg中关于ffplay部分的概要分析-2

ffmpeg中关于ffplay部分的概要分析-2

 

  1. 全局变量options[] 包含了所支持的所有的命令行选项,可以用来确认所输入的变量是否能对应到options[]中,若解析正确则将得到的值赋予给options[]中所提前指定的变量中,比如video_disable和audio_disable的值就来自于命令行。函数parse_options()会对命令行中输入的参数进行解析,解析的依据就是全局变量 options[]。
  2. 函数SDL_Init(flags),其中flags=SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER,猜测是初始化SDL中对应的模块,比如Video,Audio等。
  3. 函数: 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