【Android FFMPEG 开发】FFMPEG 方法中指针类型参数说明 ( 一维指针类型参数 | 二维指针类型参数 )

2023-03-27 18:05:46 浏览数 (1)

文章目录
  • I . 一维指针类型参数
  • II . 二维指针类型参数

I . 一维指针类型参数

1 . 音视频流数据包获取 :

代码语言:javascript复制
        //读取数据包
        AVPacket *avPacket = av_packet_alloc();
        av_read_frame(formatContext, avPacket);

① 创建并初始化结构体指针 : AVPacket *avPacket = av_packet_alloc() , 该结构体是一个一维指针 ;

② 读取数据包 : av_read_frame(formatContext, avPacket) , 读取音视频流中的数据包 , 并存放到 AVPacket *avPacket 指针指向的结构体中 ;

2 . av_read_frame 函数原型 :

代码语言:javascript复制
int av_read_frame(AVFormatContext *s, AVPacket *pkt);

① 一维指针参数 : av_read_frame ( ) 方法 , 接收的 AVPacket *pkt 是一个一维指针参数 , AVPacket 是一个结构体 , AVPacket * 是结构体指针 , 该指针指向一个 AVPacket 结构体 ;

② 一维指针参数可操作内容分析 : 在 av_read_frame ( ) 方法内部是不能修改 AVPacket *pkt 参数的结构体指针的指向的 , 如果修改了 AVPacket *pkt 结构体指针的指向 , 对外部的已经初始化过的 AVPacket *avPacket = av_packet_alloc() 结构体指针是不能造成影响的 , 这种操作无意义 ;

③ 传入的一维指针要求 : 这种情况下传入的指针必须经过初始化才行 , 在方法中只修改指针指向结构体的元素的值 ;

3 . 原理分析 ( 修改一维指针值 ) :

① 传入副本 : 将 AVPacket *avPacket 作为参数传入 av_read_frame ( ) 方法 , 仅仅是将指针的一个副本传入了方法 ;

② 修改指针值无意义 : 对传入的 AVPacket *pkt 指针参数的地址进行修改没有意义 , 在方法中如果修改了传入的指针的地址 , 仅仅是将传入的副本的值改变了 , 之后的一系列修改都是针对一个副本的值进行的 ;

③ 不影响外部变量 : 函数作用于结束后 , 该副本的声明周期也就结束了 , 与外部的 AVPacket *avPacket 没有任何关系 ;

4 . 原理分析 ( 修改一维指针指向的结构体的内容 ) :

① 传入副本 : 将 AVPacket *avPacket 作为参数传入 av_read_frame ( ) 方法 , 传入该指针副本作为参数 ;

② 指向同一块内存 : 但是 AVPacket *avPacket 指针 , 与 AVPacket *pkt 副本参数指针 , 指向的内存是同一块内存 ;

③ 影响外部变量 : 如果使用 AVPacket *pkt 参数的一维指针 ( 副本值 ) 修改该内存中的值 , 那么该内存中的值会被改变 , 此时外部指针 AVPacket *avPacket 指针指向的内存的值也会被改变 ;

5 . 结论 :

① 一维指针参数 : 传入一维指针 , 只能修改指向的内存的内容 ; 修改一维指针本身指向无意义 ;

② 二维指针参数 : 传入 二维指针 , 只能修改一维指针 及 以下的内容 ; 修改二维指针本身指向无意义 ;

③ N 维指针参数 : 传入 N 维指针 , 只能修改 N - 1 维指针 及 以下的内容 , 修改 N 维指针内容 无意义 ;

II . 二维指针类型参数

1 . 打开音视频地址 :

代码语言:javascript复制
AVFormatContext *formatContext = 0;
int open_result = avformat_open_input(&formatContext, dataSource, 0, 0);

① 未初始化的空指针 : AVFormatContext *formatContext 结构体指针没有进行初始化 , 是个空指针 ;

② 二维指针参数 : avformat_open_input ( ) 方法传入的是 AVFormatContext ** 二维指针参数 , 目的是为了在方法中对 AVFormatContext * 进行初始化 , 初始化完成后 , 在传递到函数外部使用 ;

2 . avformat_open_input ( ) 函数原型 :

代码语言:javascript复制
int avformat_open_input(AVFormatContext **ps, 
			const char *url, AVInputFormat *fmt, AVDictionary **options);

这里我们只关心 AVFormatContext **ps 二维指针参数 ;

3 . 二维指针参数 : 此处传入二维指针参数 , 二维指针的指向是副本改变没有任何意义 , 该二维指针副本 AVFormatContext **ps 参数指向的是 AVFormatContext *formatContext 的一维指针变量地址 ( 二维指针 ) , 该二维指针地址不可修改 , 但是可以修改二维指针指向的一维指针的地址 , 即在方法中重新初始化一个 AVFormatContext *结构体指针变量 , 用该二维指针指向它 ,

4 . 外部的一维指针 : AVFormatContext *formatContext 是外部的 AVFormatContext 结构体指针 , 地址值为 A1 , 指向 AVFormatContext 结构体 ;

5 . 外部的一维指针所在的内存地址 : &formatContext 是二维指针地址值为 A2 , 指向 AVFormatContext *formatContext 一维指针的地址 A1 ( 存储的是指向的结构体地址 , 目前没有初始化是空指针 ) ;

6 . 方法内部修改二维指针指向的一维指针 : 在方法中需要创建并初始化 AVFormatContext 结构体 , 地址是 A11 , 将该地址赋值给 A2 指向的内存地址中 , 外部的 AVFormatContext *formatContext 一维指针地址就被修改成了 A11 ;

7 . 结论 : 传入二维指针参数 , 二维指针本身修改无意义 , 修改二维指针指向的一维指针 , 可以影响外部的一维指针 ;

0 人点赞