前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android FFMPEG 开发】FFMPEG 获取 AVStream 音视频流 ( AVFormatContext 结构体 | 获取音视频流信息 | 获取音视频流个数 | 获取音视频流 )

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

作者头像
韩曙亮
发布2023-03-27 18:04:21
7180
发布2023-03-27 18:04:21
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

代码语言:txt
复制
        - [博客简介 . FFMPEG 音视频流 获取流程](https://cloud.tencent.com/developer)
        - [I . FFMPEG 获取音视频流信息 ( AVFormatContext 结构体 )](https://cloud.tencent.com/developer)
        - [II . FFMPEG 获取 音视频流 数量](https://cloud.tencent.com/developer)
        - [III . FFMPEG 获取音视频流](https://cloud.tencent.com/developer)
博客简介 . FFMPEG 音视频流 获取流程

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

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

代码语言:javascript
复制
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

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

代码语言:javascript
复制
//音视频流的个数
formatContext->nb_streams

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

代码语言:javascript
复制
//取出一个媒体流 ( 视频流 / 音频流 )
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 元素中 ;

代码语言:javascript
复制
/**
 * 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 结构体指针的 “->” 运算符获取其结构体中的元素值 ;

代码语言:javascript
复制
//stream_count 是音视频流数量
int stream_count = formatContext->nb_streams;
III . FFMPEG 获取音视频流

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

代码语言:javascript
复制
/**
 * 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 结构体指针数组 ;

代码语言:javascript
复制
/**
 * 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 循环中遍历解析音视频流 ;

代码语言:javascript
复制
//formatContext->nb_streams 是 音频流 / 视频流 个数 ;
//  循环解析 视频流 / 音频流 , 一般是两个 , 一个视频流 , 一个音频流
for(int i = 0; i < formatContext->nb_streams; i ++){

    //取出一个媒体流 ( 视频流 / 音频流 )
    AVStream *stream = formatContext->streams[i];
    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
    • 博客简介 . FFMPEG 音视频流 获取流程
      • I . FFMPEG 获取音视频流信息 ( AVFormatContext 结构体 )
        • II . FFMPEG 获取 音视频流 数量
          • III . FFMPEG 获取音视频流
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档