文章目录

  • 博客简介 . FFMPEG 音视频流 获取流程
  • I . FFMPEG 获取音视频流信息 ( AVFormatContext 结构体 )
  • II . FFMPEG 获取 音视频流 数量
  • III . FFMPEG 获取音视频流

博客简介 . FFMPEG 音视频流 获取流程


FFMPEG 音视频流 AVStream ( 结构体 ) 获取流程 :

① 获取音视频流信息 : avformat_find_stream_info ( ) , 在 【Android FFMPEG 开发】FFMPEG 初始化 ( 网络初始化 | 打开音视频 | 查找音视频流 ) 博客中 , FFMPEG 初始化完毕后 , 获取了音视频流 , 本博客中讲解获取该音视频流对应的编解码器 , 从获取该音视频流开始 ;

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

② 音视频流数量 : 获取的音视频流信息存储在 AVFormatContext *formatContext 结构体中 , nb_streams 元素的值就是音视频流的个数 ;

//音视频流的个数
formatContext->nb_streams

③ 音视频流 : AVFormatContext *formatContext 结构体中的 音视频流数组元素 AVStream **streams 元素 , 通过数组下标可以获取指定位置索引的音视频流 ;

//取出一个媒体流 ( 视频流 / 音频流 )
AVStream *stream = formatContext->streams[i];

I . FFMPEG 获取音视频流信息 ( AVFormatContext 结构体 )


1 . 获取音视频流信息 : avformat_find_stream_info ( ) , 在 【Android FFMPEG 开发】FFMPEG 初始化 ( 网络初始化 | 打开音视频 | 查找音视频流 ) 博客中 , FFMPEG 初始化完毕后 , 获取了音视频流 , 本博客中讲解获取该音视频流对应的编解码器 , 从获取该音视频流开始 ;

2 . 信息存放载体 : 调用 avformat_find_stream_info ( ) 方法 , 获取音视频流信息存储在 AVFormatContext *formatContext 结构体中 ; 可以通过 formatContext->结构体元素 获取相应的 FFMPEG 数据 ;

II . FFMPEG 获取 音视频流 数量


1 . 结构体元素 : 音视频流数量信息存储在 AVFormatContext *formatContext 结构体中 的 unsigned int nb_streams 元素中 ;

/*** Number of elements in AVFormatContext.streams.** Set by avformat_new_stream(), must not be modified by any other code.*/
unsigned int nb_streams;

2 . 获取示例 : 调用 AVFormatContext *formatContext 结构体指针的 “->” 运算符获取其结构体中的元素值 ;

//stream_count 是音视频流数量
int stream_count = formatContext->nb_streams;

III . FFMPEG 获取音视频流


1 . 音视频流结构体 AVStream : 音视频流在 FFMPEG 中被定义成了结构体 , typedef struct AVStream , 该结构体定义在了 avformat.h 中 ;

/*** Stream structure.* New fields can be added to the end with minor version bumps.* Removal, reordering and changes to existing fields require a major* version bump.* sizeof(AVStream) must not be used outside libav*.*/
typedef struct AVStream {...
} AVStream

2 . 结构体元素 : 音视频流结构体 AVStream 存储在 AVFormatContext *formatContext 结构体中 的 AVStream **streams 元素中 , 这是一个 AVStream 结构体指针数组 ;

/*** A list of all streams in the file. New streams are created with* avformat_new_stream().** - demuxing: streams are created by libavformat in avformat_open_input().*             If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also*             appear in av_read_frame().* - muxing: streams are created by the user before avformat_write_header().** Freed by libavformat in avformat_free_context().*/
AVStream **streams;

2 . 使用 AVStream ** 数组下标获取音视频流 :

① 获取 AVStream **streams 数组 : 调用 AVFormatContext *formatContext 结构体指针的 “->” 运算符获取其结构体中的 AVStream **streams 元素值 ;

② 获取 AVStream *stream 音视频流 : 再使用数组下标获取指定索引的 AVStream * 音视频流 ;

③ 常用使用场景 : 一般是在 for 循环中遍历解析音视频流 ;

//formatContext->nb_streams 是 音频流 / 视频流 个数 ;
//  循环解析 视频流 / 音频流 , 一般是两个 , 一个视频流 , 一个音频流
for(int i = 0; i < formatContext->nb_streams; i ++){//取出一个媒体流 ( 视频流 / 音频流 )AVStream *stream = formatContext->streams[i];}

【Android FFMPEG 开发】FFMPEG 获取 AVStream 音视频流 ( AVFormatContext 结构体 | 获取音视频流信息 | 获取音视频流个数 | 获取音视频流 )相关推荐

  1. C代码开发遇到的问题 变量初始化和结构体指针移动

    1. 变量初始化 函数内部的变量如果不初始化的话默认不是0而是一个随机值. 下面的程序用来打印一个未初始化的无符号的整型值,执行几遍,每次的结果都会不一样 #include <stdio.h&g ...

  2. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

  3. 【Android FFMPEG 开发】FFMPEG 读取音视频流中的数据到 AVPacket ( 初始化 AVPacket 数据 | 读取 AVPacket )

    文章目录 I . FFMPEG 获取 AVPacket 数据前置操作 II . FFMPEG 获取 AVPacket 数据流程 III . FFMPEG AVPacket 结构体 IV . AVPac ...

  4. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( 设置 ANativeWindow 缓冲区属性 | 获取绘制缓冲区 | 填充数据到缓冲区 | 启动绘制 )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 前置操作 II . FFMPEG 原生绘制流程 III . 设置 ANativeWindow 绘制窗口属性 ANativeWind ...

  5. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 II . FFMPEG 原生绘制流程 III . Java 层获取 Surface 画布 IV . 传递 Surface 画布到 ...

  6. 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )

    文章目录 I . FFMPEG AVFrame 图像数据帧处理 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III. FFMPEG 解码前后的图像格式 IV ...

  7. 【Android FFMPEG 开发】FFMPEG 获取编解码器 ( 获取编解码参数 | 查找编解码器 | 获取编解码器上下文 | 设置上下文参数 | 打开编解码器 )

    文章目录 博客简介 . FFMPEG 编解码器获取流程 I . FFMPEG 获取音视频流的编解码参数 AVCodecParameters *codecpar II . FFMPEG 查找解码器 av ...

  8. 【Android FFMPEG 开发】FFMPEG 解码 AVPacket 数据到 AVFrame ( AVPacket-解码器 | 初始化 AVFrame | 解码为 AVFrame 数据 )

    文章目录 I . FFMPEG 解码 AVPacket 数据到 AVFrame 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III . FFMPEG 发送 ...

  9. 【Android FFMPEG 开发】FFMPEG 音频重采样 ( 初始化音频重采样上下文 SwrContext | 计算音频延迟 | 计算输出样本个数 | 音频重采样 swr_convert )

    文章目录 I . FFMPEG 播放视频流程 II . FFMPEG 音频重采样流程 III . FFMPEG 音频重采样 IV . FFMPEG 初始化音频重采样上下文 SwrContext V . ...

最新文章

  1. 并查集(压缩路径+按秩排序)
  2. 基于Codis的Redis集群部署
  3. 大学生有必要学python吗_大学生学python到底有没有用?
  4. 电商网站全链路压测实战
  5. 关于WCF中间层服务器端DTO属性更新如何同步回仓储实体的处理方式
  6. 全套支付宝系统架构(内部架构图)【收藏】
  7. SSP状态寄存器SSPSTAT
  8. 计算坐标点的距离计算机公式,计算两个GPS坐标点的距离
  9. 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!
  10. 人工智能 VS 机器学习 VS 深度学习
  11. 一起等补丁:操作系统漏洞StrandHogg 2.0几乎影响所有安卓设备
  12. linux登录vnc的命令行,用VNC远程登陆linux (ZT)
  13. 视频教程-网络安全技术(CCNA-HCNA)-网络技术
  14. vim配置IDE,下载压缩包即拥有轻巧且强大的文本编辑器
  15. matlab逻辑回归两次成绩录取查询,【多元逻辑回归分类】基于matlab的MNIST实践
  16. 好看的小武与hs文件的偶遇
  17. C个java都是多线程语言对吗_Java里的多线程
  18. 华为软件测试工程师无线产品线实习生第一次视频面试
  19. 学生如何提高专业英文阅读能力 精选
  20. JAVA应用中集成SF的chatter功能及开发步骤

热门文章

  1. Silverlight 2.0学习笔记——XAML
  2. 基本数据类型使用注意事项
  3. 对象存储/编码/解码
  4. [译]课程 9: 作业存储
  5. opencv imshow
  6. offsetLeft 、offsetWidth、scrollHeight等的区别
  7. Linux下rz/sz安装及使用方法
  8. 十一. 图形、图像与多媒体1.绘图基础
  9. And it's over,And it's a new start
  10. Python基础(3) - 数据类型:2字符串类型