当前位置: 首页 > news >正文

淘宝客网站怎么批量采集淘宝商品方维采集淘宝数据思路莱芜在线和莱芜都市网

淘宝客网站怎么批量采集淘宝商品方维采集淘宝数据思路,莱芜在线和莱芜都市网,简单的手机网站模板下载,制作网站的成本文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数… 文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数弃用3、av_init_packet 函数导致内存泄漏的反面示例4、av_packet_move_ref 函数 后可以使用 av_init_packet 函数5、av_packet_clone 函数 后不可以使用 av_init_packet 函数6、av_packet_ref 函数 与 av_packet_unref 函数 成对使用 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff/FFmpeg/tree/release/4.0FFmpeg/libavcodec/avpacket.c 源码 : https://gitcode.com/gh_mirrors/ff/FFmpeg/blob/release/4.0/libavcodec/avpacket.c 一、搭建开发环境 开发前 , 先回顾下 开发环境 和 项目 搭建流程 ; 1、开发环境搭建参考 开发环境搭建参考如下博客 : 【FFmpeg】Windows 10 平台 FFmpeg 开发环境搭建 ① ( 安装 Visual Studio 2015 | JavaScript_ProjectSystem 安装包丢失或损坏 )【FFmpeg】Windows 10 平台 FFmpeg 开发环境搭建 ② ( Qt 配置 MSVC2015 编译器 | 安装 VS2015 并配置 Qt 环境的 C/C 编译器 )【FFmpeg】Windows 10 平台 FFmpeg 开发环境搭建 ③ ( CDB 调试器下载安装 | Qt 中配置 CDB 调试器 | Qt 中配置 32 位 / 64 位的构建套件 )【FFmpeg】Windows 10 平台 FFmpeg 开发环境搭建 ④ ( FFmpeg 开发库 | 创建项目导入并配置 FFmpeg 开发库 | 拷贝 DLL 动态库到 SysWOW64 目录) 2、项目搭建 参考 【FFmpeg】Windows 10 平台 FFmpeg 开发环境搭建 ④ ( FFmpeg 开发库 | 创建项目导入并配置 FFmpeg 开发库 | 拷贝 DLL 动态库到 SysWOW64 目录) 博客后半部分内容 : 创建 Qt 项目 : 选择 Non-Qt Project 下的 Plain C Application 类型的项目 , 构建系统使用默认的 qmake , 构建套件选择 MSVC2015 套件 ; 拷贝头文件和库函数 : 将 ffmpeg-4.2.1-win32-dev 开发库目录 , 拷贝到 Qt 工程目录下 , 其中是 FFmpeg 的头文件和库函数 ; 配置 头文件和库函数 : 在 .pro 配置文件 , 配置 上面拷贝的 头文件 和 函数库 , 完整配置内容如下 : TEMPLATE app CONFIG console CONFIG - app_bundle CONFIG - qtSOURCES main.cwin32 { INCLUDEPATH $$PWD/ffmpeg-4.2.1-win32-dev/include LIBS $$PWD/ffmpeg-4.2.1-win32-dev/lib/avformat.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avcodec.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avdevice.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avfilter.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avutil.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/postproc.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/swresample.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/swscale.lib }代码引入头文件 : 引入 FFmpeg 库 , 并调用 av_version_info 函数 , 获取 FFmpeg 版本号 ; #include stdio.h // 引入标准输入输出头文件 #include libavutil/avutil.h // 引入FFmpeg库中的avutil头文件avutil包含一些工具函数int main() {// 输出 Hello World 到控制台printf(Hello World\n);// 输出 FFmpeg 的版本信息av_version_info() 函数返回当前FFmpeg库的版本信息printf(FFmpeg version is %s\n, av_version_info());// 返回0表示程序正常结束return 0; }代码运行库配置 : 将下面的文件拷贝到 C:\Windows\SysWOW64 目录 或者 项目的构建目录根目录 中 ; 二、AVPacket 创建与释放代码分析 1、AVPacket 创建与释放代码 下面的代码是 AVPacket 从声明 , 分配结构体内存 , 分配缓冲区数据内存 , 解除缓冲区数据引用 , 释放缓冲区内存 的完整过程 , 之后会单步调试 , 查看具体的数据信息 ; void av_packet_1() {AVPacket *pkt NULL; // 定义一个指向 AVPacket 结构体的指针用于存储数据包int ret 0; // 定义一个整型变量 ret用于存储函数的返回值// 分配一个新的 AVPacket返回一个指向该数据包的指针pkt av_packet_alloc();// 为数据包分配内存并初始化引用计数为1ret av_new_packet(pkt, MEM_ITEM_SIZE);// 使用 memccpy 函数将 av_packet_1 的数据拷贝到 pkt-data 中// 从 pkt-data 地址开始复制 MEM_ITEM_SIZE 字节的数据// 复制的数据来源是当前函数 av_packet_1 的地址memccpy(pkt-data, (void *)av_packet_1, 1, MEM_ITEM_SIZE);// 解除数据包的引用减少引用计数av_packet_unref(pkt);// 释放数据包所占的内存并将 pkt 指针设置为 NULLav_packet_free(pkt); }2、Qt 单步调试方法 单步调试上述代码 : 在函数第一行代码位置打上断点 : 点击左下角的 Start debugging of startup project 按钮 , 程序开始运行后 , 停留在 断点 位置 ; 切换到指令集操作模式 : 之前在代码模式中 , 无法进行 单步调试 , 参考 【错误记录】Qt 单步调试 F10 快捷键失灵 ( Start and Break on Main 和 单步调试 默认都是 F10 快捷键 | 单步调试技巧 - 转换汇编指令模式 ) 博客 ; 在 指令集操作模式 中 , 按 F10 单步运行 , 然后再切换回代码模式 , 即可进行单步调试 ; 3、单步调试 - 分析 AVPacket 创建与销毁代码 再次回到代码模式 , 即可进行单步调试 , 目前代码停留在函数的第三行代码处 ; 此时可以看到 , 声明的 AVPacket 结构体指针值为 0 , 暂时没有赋值 ; 继续下一步单步调试 , 执行 av_packet_alloc 函数 , 结果如下 , 该函数为 AVPacket 指针分配了内存 , AVPacket 结构体的成员都设置了默认值 , 其中 buf 缓冲区 被设置为了 0 , 也就是 NULL , 暂时没有进行初始化 ; av_packet_alloc 函数 的 作用 是 : 在 堆内存中 , 为其分配内存空间 , 并为其成员设置默认值 ; 继续执行下一步 , 调用 av_new_packet 函数时 , 开始为 AVPacket 的数据分配内存 , 并将引用计数设置为 1 ; 此时 AVBuffer 结构体的 AVBufferRef *buf 成员 有了指向 , 不再是 NULL ; 真实的数据是 AVBufferRef 结构体的 AVBuffer *buffer 成员 中 , 其真实数据 和 引用计数 都在该结构体中 , 目前可以看到该结构体在堆内存中的地址是 0xec5240 ; 执行 memccpy 函数 , 设置数据缓冲区中的数据 , 执行后 , 发现数据发生了改变 ; 继续向后执行 , 执行 av_packet_unref 函数 , 解除 AVPacket 数据包引用 , 减少引用计数 ; 参考 【FFmpeg】FFmpeg 内存结构 ④ ( AVPacket 函数简介 | av_packet_unref 函数 | av_packet_move_ref 函数 ) 博客 中的 av_packet_unref 函数 分析章节 ; 最后 执行 av_packet_free 函数 , 释放 AVPacket 结构体 及其 内部的成员 所占用的内存空间 ; 执行完毕后 , 发现 AVPacket 结构体指针的值被置空 ; 三、AVPacket 内存使用注意事项 1、谨慎使用 av_init_packet 函数 av_init_packet 函数 内容如下 , 分析下面的代码 , 可知 该函数会将所有的字段都设置为 默认值 , 尤其是 pkt-buf 字段 , 这是数据缓冲区的引用 , 使用该函数不当 , 可以会导致数据缓冲区内存泄漏 ; // 初始化 AVPacket 结构体 void av_init_packet(AVPacket *pkt) {// 设置显示时间戳 (PTS) 为未定义值pkt-pts AV_NOPTS_VALUE;// 设置解码时间戳 (DTS) 为未定义值pkt-dts AV_NOPTS_VALUE;// 设置文件中的位置为 -1 (表示未知)pkt-pos -1;// 设置帧的时长为 0pkt-duration 0;#if FF_API_CONVERGENCE_DURATION// 以下代码处理弃用字段 convergence_duration 的初始化FF_DISABLE_DEPRECATION_WARNINGSpkt-convergence_duration 0; // 设置帧的收敛时间为 0 (已废弃字段)FF_ENABLE_DEPRECATION_WARNINGS #endif// 设置标志位为 0 (表示无标志)pkt-flags 0;// 设置流索引为 0 (初始化为默认值)pkt-stream_index 0;// 将引用的缓冲区指针设为 NULLpkt-buf NULL;// 将侧数据的指针设为 NULLpkt-side_data NULL;// 设置侧数据元素个数为 0pkt-side_data_elems 0; }2、av_init_packet 函数弃用 av_init_packet 函数 已经弃用 , FFmpeg 官方不再建议调用该函数 , 可参考 【FFmpeg】FFmpeg 内存结构 ② ( AVPacket 函数简介 | av_packet_alloc 函数 | av_packet_free 函数 | av_new_packet 函数 ) 博客 , av_packet_alloc 函数 是 FFmpeg 官方推荐使用的 初始化 AVPacket 结构体的函数 , 并且建议与 av_packet_free 函数 配对使用 ; av_packet_alloc 函数 中 调用了 av_init_packet 函数 , 已经包含了 av_init_packet 函数的功能 ; 3、av_init_packet 函数导致内存泄漏的反面示例 在下面的代码中 , 在数据释放之前的某个时间点 调用了 av_init_packet 函数 , 导致 AVPacket 的 buf 缓冲区提前置空 , 但是 buf 指向的数据缓冲区还没有释放 , 这段内存就出现了泄漏 , 再也无法进行释放 ; void av_packet_1() {AVPacket *pkt NULL; // 定义一个指向 AVPacket 结构体的指针用于存储数据包int ret 0; // 定义一个整型变量 ret用于存储函数的返回值// 分配一个新的 AVPacket返回一个指向该数据包的指针pkt av_packet_alloc();// 为数据包分配内存并初始化引用计数为1ret av_new_packet(pkt, MEM_ITEM_SIZE);// 使用 memccpy 函数将 av_packet_1 的数据拷贝到 pkt-data 中// 从 pkt-data 地址开始复制 MEM_ITEM_SIZE 字节的数据// 复制的数据来源是当前函数 av_packet_1 的地址memccpy(pkt-data, (void *)av_packet_1, 1, MEM_ITEM_SIZE);// 如果在数据释放之前的某个时间点 调用了 av_init_packet 函数// 就会导致 AVPacket 的 buf 缓冲区置空// 但是 buf 指向的数据缓冲区还没有释放 这段内存就出现了泄漏 再也无法进行释放// 此处调用 av_init_packet 函数 就会导致内存泄漏 ☆☆☆av_init_packet(pkt);// 解除数据包的引用减少引用计数av_packet_unref(pkt);// 释放数据包所占的内存并将 pkt 指针设置为 NULLav_packet_free(pkt); }4、av_packet_move_ref 函数 后可以使用 av_init_packet 函数 av_packet_move_ref 函数 的 源码如下 : void av_packet_move_ref(AVPacket *dst, AVPacket *src) {*dst *src;av_init_packet(src);src-data NULL;src-size 0; }参考 https://raw.gitcode.com/gh_mirrors/ff/FFmpeg/raw/release%2F4.0/libavcodec/avpacket.c 源码 ; 在 av_packet_move_ref 函数中 , 调用了 av_init_packet 函数 , 如果在之后继续调用一次 av_init_packet 函数 , 是不会对内存结构产生影响的 , 相当于调用了两次 av_init_packet 函数 ; 5、av_packet_clone 函数 后不可以使用 av_init_packet 函数 av_packet_clone 函数 源码如下 : // 克隆一个 AVPacket AVPacket *av_packet_clone(const AVPacket *src) {// 分配一个新的 AVPacket 对象AVPacket *ret av_packet_alloc();// 如果分配失败直接返回 NULLif (!ret)return ret;// 复制源数据包 (src) 的内容到新分配的数据包 (ret)// 如果复制失败释放新分配的数据包内存if (av_packet_ref(ret, src))av_packet_free(ret);// 返回克隆的数据包指针 (如果成功则指向新数据包失败则返回 NULL)return ret; }av_packet_clone 函数 相当于 av_packet_alloc 函数 av_packet_ref 函数 的 组合函数 ; 调用完 av_packet_clone 函数 后 , 引用计数会增加 1 , 如果原来引用计数是 1 , 则新的引用计数是 2 ; 如果在 av_packet_clone 函数 后 调用 av_init_packet 函数 , 会导致新的 AVPacket 的 buf 成员被置空 , 之后 调用 av_packet_free 函数 无法访问到 AVPacket 的 buf 成员 , 自然无法将引用计数自减 1 , 这样就导致了 内存泄漏 ; 6、av_packet_ref 函数 与 av_packet_unref 函数 成对使用 av_packet_ref 函数 和 av_packet_unref 函数 需要成对使用 , 它们的主要目的是对 AVPacket 对象的引用计数进行管理 , 从而避免内存泄漏或重复释放 ; 在使用 av_packet_ref 引用数据包时 , 引用计数会增加 ; 如果在某些地方不再需要这个引用 , 必须使用 av_packet_unref 释放它 ; 否则 , 会导致内存泄漏 ;
http://www.ho-use.cn/article/10820415.html

相关文章:

  • 数码产品网站建设策划书做网站学什么
  • 特定网站开发用html制作网站流程
  • 网站换源码如何保留以前的文章东莞华为外包公司
  • 国家排污许可网站台账怎么做东莞百度seo哪家好
  • 开元棋牌网站怎么做如何学建设网站
  • 网站首页site不到 a5邢台交友123
  • 桂林网站艰涩wordpress导入数据库
  • 关于小说网站的一些建设流程怎么制作纯文字图片
  • 湛江网站建设皆选小罗23爱聊网站
  • 网站优化 合同视频链接制作
  • 阿里云网站建设教学视频教程合肥庐阳区建设局网站
  • 云南省建设工程招标投标行业协会网站沈阳点金网站建设
  • 深色网站wordpress完整搬家
  • 彩票网站如何建设提升网站转化率
  • 微信小程序可以做电影网站吗成全视频观看免费高清中国电视剧
  • 西安将军山网站建设网站地图提交地址
  • 个人求职网站如何做游戏网站开发文档
  • WordPress对接微信公众号人员优化方案怎么写
  • 成都微信端网站建广告设计制作税率
  • 移动端网站建设公司怎样做天猫 淘宝网站导购
  • 中国做网站最好的不用登录的传奇游戏
  • 网站论坛建设需要什么资质怎么利用爬虫技术 提高网站排名
  • ps如何做网站轮播图房产网站方案
  • 建站市场3d建模怎么做网站旋转
  • 动易网站模板制作方法网络广告营销典型案例
  • 开发一个网站做公司内部用网站备案删除
  • 各类设计型网站创建网站需要什么
  • 深圳高端网站建设美工wordpress 探针
  • 网站二次开发没人做网站布局框架
  • 网站建设公司推荐 金石下拉上海青浦网站建设公司