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()

时间: 2025-01-05 00:34:12

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

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

ffplay是ffmpeg中的一个播放音视频流的功能,现简要对其进行分析: 1. 图1是ffplay的主干代码流程 1)在stream_open函数之前,主要是对入参的一些分析,所有codec,demux以及相关protocool的注册 注册两个信号量:一个是给中断使用,一个是给终端操作使用(比如键盘,鼠标等的一些动作) 2)在stream_open函数中,先是对video,audio,subtitle三个format的消息队列进行初始化, 再对收发数据的队列进行初始化.然后调用SDL_Crea

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

/////////////////////////////////////////////////////// 函数av_probe_input_buffer2()是在函数s->io_open()之后被调用. 其工作流程是:首先会通过函数avio_read()读取文件中的数据,然后调用函数av_probe_input_format2()对已读取的数据进行分析, 主要分析的是文件内的格式,并根据相似度给出相应的评分score. 其调用栈如下: av_probe_input_buffer2() av

(转)ffmpeg 中 av_read_frame_internal分析

作者: chenwei1983    时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析                            原出处:http://www.chinavideo.org/viewthread.php?action=printable&tid=13846av_read_frame_internal 在ffmpeg中实现了将format格式的packet,最终转换成一帧帧的es流packet,并解析填

ffmpeg中av_log的实现分析

[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,av_log, 日志输出] 0 引言 FFmpeg的libavutil中的日志输出的接口整体比较少,但是功能还是不错的,对于后续自己实现日志模块还是值得参考的.本文就libavutil中的日志模块部分的实现做一个简要的整理.希望可以达到解释清楚的目的. 注意:本部分的主要代码位于libavtuil/log.h.libavutil/log.c. 1 AVClass的定义部分 log接口的输出是依赖于AVClass的

ffmpeg中AVBuffer的实现分析

[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,avbuffer, 引用计数] 0 引言 AVBuffer是ffmpeg提供的基于引用计数的智能指针的一个实现版本. FFmpeg中很多结构体是基于AVBuffer实现的,比如AVFrame.AVPacket. AVBuffer实现 主要实现文件位于libavutil中的buffer.h.buffer_internal.h.buffer.c三个文件中.其中最主要的是两个结构体AVBufferRef和AVBuffe

零基础读懂视频播放器控制原理: ffplay 播放器源代码分析

https://www.qcloud.com/community/article/535574001486630869 视频播放器原理其实大抵相同,都是对音视频帧序列的控制.只是一些播放器在音视频同步上可能做了更为复杂的帧预测技术,来保证音频和视频有更好的同步性. ffplay 是 FFMpeg 自带的播放器,使用了 ffmpeg 解码库和用于视频渲染显示的 sdl 库,也是业界播放器最初参考的设计标准.本文对 ffplay 源码进行分析,试图用更基础而系统的方法,来尝试解开播放器的音视频同步,

FFmpeg的H.264解码器源代码简单分析:概述

本文简单记录FFmpeg中libavcodec的H.264解码器(H.264 Decoder)的源代码.这个H.264解码器十分重要,可以说FFmpeg项目今天可以几乎"垄断"视音频编解码技术,很大一部分贡献就来自于这个H.264解码器.这个H.264解码器一方面功能强大,性能稳定:另一方面源代码也比较复杂,难以深入研究.本文打算梳理一下这个H.264解码器的源代码结构,以方便以后深入学习H.264使用.PS:这部分代码挺复杂的,还有不少地方还比较模糊,还需要慢慢学习...... 函数

FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

本文继续分析FFmpeg中libavcodec的H.264解码器(H.264 Decoder).上篇文章概述了FFmpeg中H.264解码器的结构:从这篇文章开始,具体研究H.264解码器的源代码.本文分析H.264解码器中解析器(Parser)部分的源代码.这部分的代码用于分割H.264的NALU,并且解析SPS.PPS.SEI等信息.解析H.264码流(对应AVCodecParser结构体中的函数)和解码H.264码流(对应AVCodec结构体中的函数)的时候都会调用该部分的代码完成相应的功

FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)

本文分析FFmpeg的H.264解码器的宏块解码(Decode)部分的源代码.FFmpeg的H.264解码器调用decode_slice()函数完成了解码工作.这些解码工作可以大体上分为3个步骤:熵解码,宏块解码以及环路滤波.本文分析这3个步骤中的第2个步骤.由于宏块解码部分的内容比较多,因此将本部分内容拆分成两篇文章:一篇文章记录帧内预测宏块(Intra)的宏块解码,另一篇文章记录帧间预测宏块(Inter)的宏块解码. 函数调用关系图 宏块解码(Decode)部分的源代码在整个H.264解码器