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

///////////////////////////////////////////////////////

函数av_probe_input_buffer2()是在函数s->io_open()之后被调用。

其工作流程是:首先会通过函数avio_read()读取文件中的数据,然后调用函数av_probe_input_format2()对已读取的数据进行分析,

主要分析的是文件内的格式,并根据相似度给出相应的评分score。

其调用栈如下:

av_probe_input_buffer2()

  avio_read()  //读取文件中的数据

    av_probe_input_format2()

      av_probe_input_format3()

        av_iformat_next()

          fmt1->read_probe()

a)根据不同的format,fmt1->read_probe()会映射不同的API来进行数据分析,

比如acm格式会调用函数acm_probe(), act格式会调用函数probe(), adp格式会调

用函数adp_probe(), ac3格式会调用函数ac3_eac3_probe()等等。

b)同时还会分析文件格式是否符合格式扩展fmt1->extensions。

c)以上操作都会根据比对分析的结果会给出一定的评分score.

///////////////////////////////////////////////////////

函数ff_id3v2_read()分析:

ff_id3v2_read()函数的调用栈如下:

  ff_id3v2_read()

    id3v2_read_internal()     //对AVIOContext{}中的文件指针进行操作

      avio_tell()

      avio_read()         //读取文件中的内容

      ff_id3v2_match()  //比较流中是否有特定字符,即文件流的头

      id3v2_parse()     //未分析

      avio_seek()

      ff_metadata_conv()

///////////////////////////////////////////////////////

函数s->iformat->read_header()分析:

该函数的映射是由函数av_probe_input_format3()来决定的。在xx_format3()函数中主要通过从format链表first_iformat中不断取出链表项同数据流中包含的格式信息进行比对,当找到符合的表项的时候,

就将表项中的信息都保存在AVInputFormat{}结构体中:AVFormatContext{}->AVInputFormat{iformat}

  s->iformat->read_header()

    mov_read_header()    //入参为AVFormatContext,是否MOV header

      mov_read_default()

如该例子中就是确认媒体流的数据格式是MOV,则调用mov_read_header()函数进行处理。

///////////////////////////////////////////////////////

函数ff_id3v2_parse_apic()分析:

当媒体流格式为”mp3”,”aac”,”tta”的时候,该函数就会被调用。

ff_id3v2_parse_apic()

avformat_new_stream() //申请memory

a) 函数avformat_new_stream()分配memory给结构体数组

  AVFormatContext{}->AVStream{*streams[]}

b) 函数ff_id3v2_parse_apic()主要判断:

  ID3v2ExtraMeta **extra_meta带进来的数据中的tag标记是否是”APIC”,

  是否extra_meta含有数据0x89504e470d0a1a0a

  解析extra_meta中的数据放入AVFormatContext{}->AVStream{*streams[]}

时间: 2024-10-12 15:36:11

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

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部分的概要分析-2

全局变量options[] 包含了所支持的所有的命令行选项,可以用来确认所输入的变量是否能对应到options[]中,若解析正确则将得到的值赋予给options[]中所提前指定的变量中,比如video_disable和audio_disable的值就来自于命令行.函数parse_options()会对命令行中输入的参数进行解析,解析的依据就是全局变量 options[]. 函数SDL_Init(flags),其中flags=SDL_INIT_VIDEO | SDL_INIT_AUDIO | SD

(转)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解码器