热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

文章目录I.一维指针类型参数II.二维指针类型参数I.一维指针类型参数1.音视频流数据包获取:读取数据包AVPacket*avPacketav_packet_alloc();av_


文章目录

        • I . 一维指针类型参数
        • II . 二维指针类型参数






I . 一维指针类型参数





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

//读取数据包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 函数原型 :

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 . 打开音视频地址 :

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


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

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



2 . avformat_open_input ( ) 函数原型 :

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


推荐阅读
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
author-avatar
淘宝店名维衣潮都_233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有