=====================================================

FFmpeg的库函数源代码分析文章列表:

【架构图】

FFmpeg源代码结构图 - 解码

FFmpeg源代码结构图 - 编码

【通用】

FFmpeg 源代码简单分析:av_register_all()

FFmpeg 源代码简单分析:avcodec_register_all()

FFmpeg 源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)

FFmpeg 源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)

FFmpeg 源代码简单分析:avio_open2()

FFmpeg 源代码简单分析:av_find_decoder()和av_find_encoder()

FFmpeg 源代码简单分析:avcodec_open2()

FFmpeg 源代码简单分析:avcodec_close()

【解码】

图解FFMPEG打开媒体的函数avformat_open_input

FFmpeg 源代码简单分析:avformat_open_input()

FFmpeg 源代码简单分析:avformat_find_stream_info()

FFmpeg 源代码简单分析:av_read_frame()

FFmpeg 源代码简单分析:avcodec_decode_video2()

FFmpeg 源代码简单分析:avformat_close_input()

【编码】

FFmpeg 源代码简单分析:avformat_alloc_output_context2()

FFmpeg 源代码简单分析:avformat_write_header()

FFmpeg 源代码简单分析:avcodec_encode_video()

FFmpeg 源代码简单分析:av_write_frame()

FFmpeg 源代码简单分析:av_write_trailer()

【其它】

FFmpeg源代码简单分析:日志输出系统(av_log()等)

FFmpeg源代码简单分析:结构体成员管理系统-AVClass

FFmpeg源代码简单分析:结构体成员管理系统-AVOption

FFmpeg源代码简单分析:libswscale的sws_getContext()

FFmpeg源代码简单分析:libswscale的sws_scale()

FFmpeg源代码简单分析:libavdevice的avdevice_register_all()

FFmpeg源代码简单分析:libavdevice的gdigrab

【脚本】

FFmpeg源代码简单分析:makefile

FFmpeg源代码简单分析:configure

【H.264】

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

=====================================================

FFMPEG打开媒体的的过程开始于avformat_open_input,因此该函数的重要性不可忽视。

在该函数中,FFMPEG完成了:

输入输出结构体AVIOContext的初始化;

输入数据的协议(例如RTMP,或者file)的识别(通过一套评分机制):1判断文件名的后缀 2读取文件头的数据进行比对;

使用获得最高分的文件协议对应的URLProtocol,通过函数指针的方式,与FFMPEG连接(非专业用词);

剩下的就是调用该URLProtocol的函数进行open,read等操作了

以下是通过eclipse+MinGW调试FFMPEG源代码获得的函数调用关系图

可见最终都调用了URLProtocol结构体中的函数指针。

URLProtocol结构如下,是一大堆函数指针的集合(avio.h文件)

typedef struct URLProtocol {const char *name;int (*url_open)(URLContext *h, const char *url, int flags);int (*url_read)(URLContext *h, unsigned char *buf, int size);int (*url_write)(URLContext *h, const unsigned char *buf, int size);int64_t (*url_seek)(URLContext *h, int64_t pos, int whence);int (*url_close)(URLContext *h);struct URLProtocol *next;int (*url_read_pause)(URLContext *h, int pause);int64_t (*url_read_seek)(URLContext *h, int stream_index,int64_t timestamp, int flags);int (*url_get_file_handle)(URLContext *h);int priv_data_size;const AVClass *priv_data_class;int flags;int (*url_check)(URLContext *h, int mask);
} URLProtocol;

URLProtocol功能就是完成各种输入协议的读写等操作

但输入协议种类繁多,它是怎样做到“大一统”的呢?

原来,每个具体的输入协议都有自己对应的URLProtocol。

比如file协议(FFMPEG把文件也当做一种特殊的协议)(*file.c文件)

URLProtocol ff_pipe_protocol = {.name                = "pipe",.url_open            = pipe_open,.url_read            = file_read,.url_write           = file_write,.url_get_file_handle = file_get_handle,.url_check           = file_check,
};

或者rtmp协议(此处使用了librtmp)(librtmp.c文件)

URLProtocol ff_rtmp_protocol = {.name                = "rtmp",.url_open            = rtmp_open,.url_read            = rtmp_read,.url_write           = rtmp_write,.url_close           = rtmp_close,.url_read_pause      = rtmp_read_pause,.url_read_seek       = rtmp_read_seek,.url_get_file_handle = rtmp_get_file_handle,.priv_data_size      = sizeof(RTMP),.flags               = URL_PROTOCOL_FLAG_NETWORK,
};

可见它们把各自的函数指针都赋值给了URLProtocol结构体的函数指针

因此avformat_open_input只需调用url_open,url_read这些函数就可以完成各种具体输入协议的open,read等操作了

图解FFMPEG打开媒体的函数avformat_open_input相关推荐

  1. (转)FFmpeg源代码简单分析:avformat_open_input()

    目录(?)[+] ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结 ...

  2. FFMPEG源码分析:avformat_open_input()(媒体打开函数)

    本文分析了FFMPEG中的媒体打开函数avformat_open_input() //参数ps包含一切媒体相关的上下文结构,有它就有了一切,本函数如果打开媒体成功, //会返回一个AVFormatCo ...

  3. FFmpeg中调用av_read_frame函数导致的内存泄漏问题

    使用FFmpeg的av_read_frame函数后,每读完一个packet,必须调用av_packet_unref函数进行内存释放,否则会导致内存释泄漏. 在vs(博主所用的ffmpeg版本是3.4. ...

  4. 如何利用ffmpeg提供的API函数进行多媒体文件的解封装

    多媒体已经无处不在,程序员必须知道的一些多媒体封装知识 如何利用ffmpeg提供的API函数进行多媒体文件的解封装. 上一篇文章我们搭好了环境并编译出所需的ffmpeg库,本篇我们讨论如何利用ffmp ...

  5. ffmpeg rtmp 封装发送函数_基于FFmpeg进行RTMP推流(一)

    简介 开发环境 FFmpeg sdk下载 项目配置 代码流程 开发环境 vs 2017 FFmpeg sdk下载 下载地址 这里下载3.3.3 - 32bit - share和Dev 8.png Sh ...

  6. php打开文件读写函数,php中常用文件操作读写函数介绍

    本文章介绍了下面几个常用的文件操作函数 file_get_contents 读取整个文件内容 fopen 创建和打开文件 fclose 关闭文件 fgets 读取文件一行内容 file_exists ...

  7. php中fopen函数,PHP的fopen()打开文件的函数

    打开文件 fopen() 函数用于在 PHP 中打开文件. 此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件: $file=fopen("welcome.tx ...

  8. 计算机无法启用媒体流,电脑流媒体打不开怎么回事?电脑打开媒体流的方法

    流媒体是边传边播的媒体,它采用流式传输的方式在Internet播放媒体.电脑开启媒体流服务后,我们可以方便的传送多媒体文件.有的网友反馈说电脑流媒体打不开,这是怎么回事?可能是第三方优化软件无意禁用相 ...

  9. FFmpeg源码分析:avformat_open_input()打开媒体流

    avformat_open_input()用于打开输入媒体流与读取头部信息,包括本地文件.网络流.自定义缓冲区.关键流程:打开avio.探测输入流的封装格式.对应的释放方法为avformat_clos ...

最新文章

  1. Java类加载机制详解【java面试题】
  2. QCustomPlot的简单用法总结
  3. PHP7实战开发简单CMS内容管理系统(8)登录权限控制功能分离
  4. Linux下修改root密码以及找回root密码的方法
  5. C++的精髓——虚函数
  6. 在SAP WebIDE里开发一个React component
  7. 用得最多的冒泡排序是不是少了个关键点?
  8. 全栈深度学习第1期:如何启动一个机器学习项目?
  9. excel if in函数_Office教程:Excel函数AVERAGE与IF函数的组合标记平均值
  10. everything下载哪个版本_Everything敏感信息泄露
  11. 为特定的提交生成一个git补丁
  12. 前端工程化(ES6模块化和webpack打包)
  13. JavaScript 比较和逻辑运算符
  14. 批处理删除7天以上的文件
  15. 版本管理工具Git记录
  16. 删除win10添加的网络位置
  17. java图片合成_Java图片处理(一)图片合成
  18. 给大家推荐一款超低功耗的4G低功耗摄像头方案强大的AI功能
  19. Windows 10 自带输入法微软拼音「简体」「繁体」切换快捷键
  20. virtualhackinglabs靶机 NATURAL 10.12.1.77

热门文章

  1. HDU2028 Lowest Common Multiple Plus【GCD+LCM】
  2. Bailian2899 Bailian3242 矩阵交换行【矩阵】
  3. UVA10026 Shoemaker's Problem【贪心】
  4. HDU1253 胜利大逃亡【BFS】
  5. python 分段拟合(curve fit)
  6. 设计模式在各编程语言类库及框架上的应用
  7. windows 下 opencv 3.x 的安装及常见问题的解决
  8. pandas 时间序列分析(一)—— 基础
  9. 鲁棒性的获得 —— 测试的架构
  10. 极简代码(一)—— 精确率和错误率的计算