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

举报
韩曙亮 发表于 2022/01/11 01:07:39 2022/01/11
【摘要】 文章目录 I . 一维指针类型参数II . 二维指针类型参数 I . 一维指针类型参数 1 . 音视频流数据包获取 : //读取数据包 ...



I . 一维指针类型参数



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

        //读取数据包
        AVPacket *avPacket = av_packet_alloc();
        av_read_frame(formatContext, avPacket);

  
 
  • 1
  • 2
  • 3

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

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


2 . av_read_frame 函数原型 :

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

  
 
  • 1

① 一维指针参数 : 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 . 打开音视频地址 :

AVFormatContext *formatContext = 0;
int open_result = avformat_open_input(&formatContext, dataSource, 0, 0);

  
 
  • 1
  • 2

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

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


2 . avformat_open_input ( ) 函数原型 :

int avformat_open_input(AVFormatContext **ps, 
			const char *url, AVInputFormat *fmt, AVDictionary **options);

  
 
  • 1
  • 2

这里我们只关心 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 . 结论 : 传入二维指针参数 , 二维指针本身修改无意义 , 修改二维指针指向的一维指针 , 可以影响外部的一维指针 ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/104673599

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。