当前位置: 首页 > news >正文

FFmpeg 基本API avio_read函数内部调用流程分析

1、avio_read函数介绍

avio_read 函数是 FFmpeg 中的一个 I/O 函数,它用于从流中读取数据。与 avio_write 类似,avio_read 也通过 AVIOContext 来抽象读操作。avio_read 用于从文件、网络连接或其他数据源中读取字节数据。

int avio_read(AVIOContext *s, unsigned char *buf, int size);
  • 参数:
    • s: 一个指向 AVIOContext 的指针,表示输入流的上下文。
    • buf: 一个缓冲区,用来存放从流中读取的数据。
    • size: 要读取的字节数。
  • 返回值:
    • 如果成功,返回读取的字节数。
    • 如果到达文件末尾或出错,返回负值。
      • 如果返回值是 0,表示已到达文件末尾(EOF)。
      • 如果返回负值,表示发生了错误。

主要用途:

  • 读取音视频数据:avio_read 用于从输入流(如文件或网络流)中读取音视频数据,通常是从文件、流媒体协议(如 RTSP、HTTP)或者网络套接字读取数据。
  • 流媒体处理:当接收流媒体数据时,avio_read 会被用来从网络流中获取音视频数据包。

例如:

  • 对于文件读取,avio_read 会调用操作系统的文件 I/O 操作。
  • 对于网络流读取,avio_read 会使用套接字操作,通过网络协议接收数据。

2、avio_read内部调用流程分析

2.1 参数检查

  • 检查 size 是否有效(非负)。
  • 验证 AVIOContext 是否包含有效的读回调 (read_packet)。

2.2 缓冲区直接读取

/*如果请求的数据量 小于等于缓冲区可用数据:*/
if (s->buf_end - s->buf_ptr >= size) {memcpy(buf, s->buf_ptr, size);  // 直接拷贝数据s->buf_ptr += size;             // 移动缓冲区指针return size;                    // 返回实际读取大小
}

2.3 大文件直接读取(Direct I/O)

/*
当满足以下条件时,绕过内部缓冲区直接调用用户回调:
请求的 size 大于缓冲区大小。
AVIOContext 启用了 direct 标志。
*/
if (s->direct && size > s->buffer_size) {len = s->read_packet(s->opaque, buf, size);  // 直接调用用户回调s->pos += len;                               // 更新文件位置return len;
}

2.4 缓冲区填充与混合读取

/*
若数据不足,分阶段处理:
步骤1:拷贝缓冲区剩余数据(若有)。
步骤2:循环填充缓冲区并拷贝数据,直到满足请求或遇到错误。
*/
while (size > 0) {// 填充缓冲区(内部调用 read_packet)fill_buffer(s);// 计算本次可拷贝的数据量len = FFMIN(s->buf_end - s->buf_ptr, size);memcpy(buf, s->buf_ptr, len);// 更新指针和计数器buf += len;size -= len;total_read += len;}

3、avio_read调用时序图

在这里插入图片描述

http://www.dtcms.com/a/490002.html

相关文章:

  • 【计算机网络】HTTP协议核心知识梳理
  • 基于 MediaMTX 的微信小程序 Web 实时音视频实操方案
  • 《UDP网络编程完全指南:从套接字到高并发聊天室实战》
  • 关于 云服务器WindowsServer2016双击无法运行可执行程序 的解决方法
  • LeetCode每日一题——在区间范围内统计奇数数目
  • Linux内核架构浅谈43-Linux slab分配器:小内存块分配与内核对象缓存机制
  • 最好的免费发布网站wordpress 文章二维码
  • Spring Boot 3零基础教程,Spring Boot 日志格式,笔记18
  • mybatis-plus分页插件使用
  • 福建住房和城乡建设网站网站做提示框
  • 李宏毅机器学习笔记24
  • Leetcode每日一练--28
  • Vue Router 路由元信息(meta)详解
  • 列表标签之无序标签(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • sk13.【scikit-learn基础】-- 自定义模型与功能
  • (Spring)Spring Boot 中 @Valid 与全局异常处理器的联系详解
  • 数据库数据类型,数据值类型,字符串类型,日期类型详解
  • 怎么写网站规划方案买链接做网站 利润高吗
  • SAP MM物料主数据锁定及解锁接口分享
  • [FSCalendar] 可定制的iOS日历组件 | docs | Interface Builder
  • 中兴B860AV5.1-M2/B860AV5.2M_安卓9_S905L3SB_支持外置WIFI_线刷固件包
  • AI 模型部署体系全景:从 PyTorch 到 RKNN 的嵌入式类比解析
  • 全球汽车紧固件产业进入关键转型期,中国供应链加速融入世界市场
  • 17网站一起做网店下载自动发卡网站建设
  • PHP 类型比较
  • oracle:To_char
  • MySQL 数据库核心操作全解析:从创建到备份与连接管理
  • 环境函数 SYS_CONTEXT 在 DM8 与 Oracle 中的差异
  • 长春怎么做网站重庆网站建设aiyom
  • Linux中的管道与重定向:深入理解两者的本质区别