Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Qt音视频开发17-海康sdk解码

Qt音视频开发17-海康sdk解码

原创
作者头像
feiyangqingyun
修改于 2020-08-25 01:49:17
修改于 2020-08-25 01:49:17
1.8K0
举报
文章被收录于专栏:Qt项目实战Qt项目实战

一、前言

视频监控行业领域,海康当之无愧是老大,稳坐第一的宝座很多年了,近期需要将视频监控系统改成采用海康sdk的内核,于是特意去查阅了sdk的使用手册,sdk相关的文档和文件可以直接官网下载到,而且是经常更新的,目前提供了windows和linux上的,win上的sdk还是更新比较快而且完整的,但是在linux上的就不得不吐槽下了,很旧很旧的版本,不要看打包文件很新,其实里面的内容是很老的,不知道为啥官方不也同步更新linux上的sdk,也许现在linux上的需求还不是很多吧,但是随着国产化的大力推进,估计不久的将来linux上的也会慢慢的完善起来的,说不定官方早就有了此计划,还有一种个人的猜测是linux上的开发包估计官方自己内部用的新的,可能打算自己做linux上的各种客户端吧。

官方的sdk手册做的还是非常详细的,而且还给到了VC/JAVA/C#等语言的demo代码,这点肯定值的表扬的,一个产品持续卖得很好,肯定有他深层次的原因,除了产品本身质量过硬以外,周边的服务也是必须要跟上的。由于本人习惯用Qt来做开发,所以直接编译了VC的demo,一步到位跑起来了,界面相对来说简单丑陋了点,但是要的大部分的功能还是有的,可能很多按钮也没摆摆整齐呢,管他呢,我们要的就是功能,演示如何使用对应的方法函数等,至于界面美化这块,尽量交给专业的UI妹子吧,没有UI妹子那就自己搞点qss样式表弄上去凑合着用吧,界面的美化核心主要就两点:布局+配色。

官方把他们常用的大类设备的sdk都封装到一起了,一个头文件老大了,光HCNetSDK.h这个头文件都47451行,我的乖乖,估计是为了方便用户使用,都放到一个头文件里面了,其实这些sdk不光只是支持摄像机,NVR/CVR等设备也都是支持的,兼容性比价好,用同一个sdk都可以,官方只是对一个大类的都统一起来了,不同大类的硬件产品之间的sdk还是有点区别出入,比如现在流行的人脸识别、红外测温等,那都是新增加的硬件和功能,但是总体接口和使用流程上都大体一致。

解码处理流程:

  1. 调用NET_DVR_Init初始化sdk,一个项目中只需要初始化一次。
  2. 调用NET_DVR_SetConnectTime、NET_DVR_SetReconnect设置连接时间与重连时间。
  3. 填充NET_DVR_PREVIEWINFO结构体数据用来登录。
  4. 调用NET_DVR_Login_V30登录设备。
  5. 调用NET_DVR_RealPlay_V40播放视频。
  6. 调用NET_DVR_StopRealPlay停止播放。
  7. 调用NET_DVR_Logout登出设备。

二、功能特点

  1. 支持播放视频流和本地MP4文件。
  2. 支持句柄和回调两种模式。
  3. 多线程显示图像,不卡主界面。
  4. 自动重连网络摄像头。
  5. 可设置边框大小即偏移量和边框颜色。
  6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。
  7. 可设置两种OSD位置和风格。
  8. 可设置是否保存到文件以及文件名。
  9. 可直接拖曳文件到haikangwidget控件播放。
  10. 支持h264/h265视频流。
  11. 可暂停播放和继续播放。
  12. 支持存储单个视频文件和定时存储视频文件。
  13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
  14. 可设置画面拉伸填充或者等比例填充。
  15. 可设置解码是速度优先、质量优先、均衡处理。
  16. 可对视频进行截图(原始图片)和截屏(视频窗体)。
  17. 录像文件存储为MP4文件。
  18. 支持焦距控制、云台控制。
  19. 可定制功能。

三、效果图

QQ截图20200812152626.jpg
QQ截图20200812152626.jpg

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

代码语言:txt
AI代码解释
复制
bool HaiKangThread::playRtsp()
{
    bool ok = false;
    QString ip, userName, userPwd;
    int port, streamType;
    getInfo(ip, port, streamType, userName, userPwd);

    //登录设备
    NET_DVR_DEVICEINFO_V30 deviceInfo;
    long userid = NET_DVR_Login_V30(ip.toUtf8().data(), port, userName.toUtf8().data(), userPwd.toUtf8().data(), &deviceInfo);
    if (userid >= 0) {
        qDebug() << TIMEMS << "登录海康设备成功" << userid << deviceInfo.sSerialNumber;
        //这里还需要拿到视频流的宽高
        //qDebug() << TIMEMS << url << "videoWidth:" << videoWidth << "videoHeight:" << videoHeight;

        //以下参数具体见对应头文件说明
        NET_DVR_PREVIEWINFO previewInfo;
        previewInfo.lChannel = 1;
        previewInfo.dwStreamType = streamType;
        previewInfo.dwLinkMode = (transport == "tcp" ? 0 : 1);
        previewInfo.bBlocked = 0;
        previewInfo.byProtoType = 1;
        previewInfo.byPreviewMode = 0;
        previewInfo.dwDisplayBufNum = 15;

        //回调则可以拿到音视频数据,否则就直接句柄播放
        if (callback) {
            hand = NET_DVR_RealPlay_V40(userid, &previewInfo, RealDataCallBack, this);
        } else {
            previewInfo.hPlayWnd = (HWND)playWidget->winId();
            hand = NET_DVR_RealPlay_V40(userid, &previewInfo, NULL, NULL);
        }

        if (hand >= 0) {
            ok = true;
            qDebug() << TIMEMS << "打开视频数据成功" << url << "码流" << streamType;
        } else {
            qDebug() << TIMEMS << "打开视频数据失败" << url << NET_DVR_GetLastError();
        }
    } else {
        qDebug() << TIMEMS << "登录海康设备失败" << NET_DVR_GetLastError();
    }

    return ok;
}

bool HaiKangThread::playLocal()
{
    //转码以便支持中文路径
    QTextCodec *codec = QTextCodec::codecForName("gb2312");
    QByteArray data = codec->fromUnicode(url);

    PlayM4_GetPort(&port);
    bool ok = PlayM4_OpenFile(port, data.data());
    if (ok) {
        //设置文件播放完毕回调函数
        PlayM4_SetFileEndCallback(port, FileEndCallback, this);

        //回调则可以拿到音视频数据,否则就直接句柄播放
        if (callback) {
            PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this);
            PlayM4_Play(port, NULL);
        } else {
            PlayM4_Play(port, (HWND)playWidget->winId());
        }

        //同时播放声音
        PlayM4_PlaySound(port);

        //倒放
        //PlayM4_ReversePlay(port);

        //快进播放,多次调用速度更快
        //PlayM4_Fast(port);
        //PlayM4_Fast(port);

        ok = true;
        qDebug() << TIMEMS << "打开视频文件成功" << url;
    } else {
        qDebug() << TIMEMS << "打开视频文件失败" << url << PlayM4_GetLastError(port);
    }

    return ok;
}

bool HaiKangThread::init()
{
    //判断该摄像机是否能联通
    if (checkConn && isRtsp) {
        if (!checkUrl(url, checkTime)) {
            return false;
        }
    }

    if (playWidget == NULL) {
        return false;
    }

    //视频流和本地文件分别处理
    bool ok = false;
    if (isRtsp) {
        ok = playRtsp();
    } else {
        ok = playLocal();
    }

    if (!ok) {
        return false;
    }

    //设置保存文件
    this->initSave();
    return true;
}

void HaiKangThread::free()
{
    if (isRtsp) {
        //停止播放+登出设备
        NET_DVR_StopRealPlay(hand);
        NET_DVR_Logout(hand);
        hand = -1;
    } else {
        //停止播放+关闭文件+释放端口
        PlayM4_Stop(port);
        PlayM4_StopSound();
        PlayM4_CloseFile(port);
        PlayM4_FreePort(port);
        port = -1;
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Qt音视频开发18-海康sdk回调
海康sdk显示实时视频流除了支持句柄方式以外,也支持回调的方式拿到每一张图片自己绘制处理,当然回调除了拿到视频数据,其实音频数据也一块拿到了,自行调用音频设备播放就行,关于海康sdk回调这块,还着实折腾了一阵子才搞定,可能最开始没有参照提供的demo以及没有彻底的搜索吧,只是单单看sdk的文档折腾来折腾去的,搞了一星期居然没搞定,后面找到了正确的办法才发现,原来就差一点点一丢丢呢,这又让我联想到很多事情,包括生活中的事情,不都是如此么?当你铆足了劲,试验搞了各种办法,快要精疲力尽放弃的时候,其实此时离成功就差一步了,真的就差那么一丢丢,处理生活中的很多事情也是如此,所以很多时候如果方向对了,坚持过努力过,还不行的话,再努力一把估计就ok了。
feiyangqingyun
2020/08/26
2K0
Qt音视频开发18-海康sdk回调
Qt音视频开发12-mpv解码播放
之前玩了vlc解码和ffmpeg解码,前阵子有个客户需要换成mpv解码,于是研究了下mpv的使用方法,自从用了mpv以后发现爱不释手,这玩意天生适合极客和程序员啊,居然将各种处理封装成了命令和属性调用,比如播放进度,你只需要读取属性time-pos即可,如果要读取音量只需要读取属性volume即可,设置音量就直接设置属性volume对应的值即可,我的乖乖,这太棒了棒极了,这不就是咱们梦寐以求的处理方式吗?你只需要封装几个通用的处理接口(读取属性mpv_get_property、设置属性mpv_set_property、执行命令mpv_command_node、设置参数mpv_set_option),就涵盖了绝大多数的功能,你说简单易用不,要的就是这种效果呢!!!
feiyangqingyun
2020/08/18
1.2K0
Qt音视频开发12-mpv解码播放
Qt音视频开发19-海康sdk录像存储
关于调用海康sdk来进行录像存储,整体的框架架构处理流程沿袭了之前vlc内核、ffmpeg内核、mpv内核的做法,定时存储这块,开个定时器判断,到了时间则先关闭原来的录像存储,然后在开始一个新的录像存储,重新传入新的文件名,所以这块的代码直接拷贝过来就能使用,要做的就是替换两行代码即可,一行是开始录像存储的函数NET_DVR_SaveRealData,一行是停止录像存储的函数NET_DVR_StopSaveRealData,海康sdk的手册非常详细,而且命名也比较规范,基本上通过方法函数名字就可以知道大概的意思了,不用去猜测。
feiyangqingyun
2020/08/27
1.1K0
Qt音视频开发19-海康sdk录像存储
Qt音视频开发1-vlc解码播放
最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt+vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。
feiyangqingyun
2020/08/02
1.3K0
Qt音视频开发1-vlc解码播放
Qt音视频开发13-mpv录像存储
用mpv来做录像存储,保存视频文件,从来都没有如此的方便,直接设置属性stream-record对应的文件路径即可,我的乖乖,一行代码,如此精简美丽大方,搞得我都不敢相信自己的眼睛,mpv除了支持主流的win、linux、mac三大操作系统外,还支持手机安卓IOS等,尤其是居然支持各种嵌入式linux,记得vlc想要在嵌入式linux上交叉编译成功的话,难于上青天,各种插件的依赖实在是太多了,直到你放弃为止,在X86的linux系统还是比较方便一些的,而在这块,mpv简直是完爆vlc啊,直接命令行都可以在嵌入式linux上安装呢,内置的ffmpeg超强解码器,使得你可以直接命令行调用mpv来播放音视频,这在一些嵌入式linux上Qt无法播放音视频的场景,非常有用,本人在全志H3板子上使用的就是mpv来播放音视频,默认GPU解码使得CPU占用极地。
feiyangqingyun
2020/08/19
1.1K0
Qt音视频开发13-mpv录像存储
Qt音视频开发21-通用硬解码
硬件解码是图形芯片厂家提出的用GPU资源解码视频流的方案,与之相对的是软解,也就是传统的用CPU承担解码工作的方案;优点是效率高,功耗低、热功耗低,缺点是缺乏有力的支持(包括滤镜、字幕等),局限性较大(例如打开硬件解码后PC的节能方面的功能失效cnq等),设置较为复杂;需要硬件有硬件解码模块、相关的驱动配合、合适的播放软件以及对播放软件正确的设置,缺一而不能开启硬件解码功能,主流的硬件解码方案由Intel、AMD-ATI以及Nvdia推出。
feiyangqingyun
2020/08/31
1.8K0
Qt音视频开发21-通用硬解码
Qt音视频开发3-vlc录像存储
录像功能是视频监控系统的常用功能,就是将打开的视频流或者视频文件重新保存成MP4文件,当然也可以保存成其他格式,一般默认用MP4比较好,比较标准一些,MP4格式的兼容性最好,基本上没有说那台电脑不能播放MP4文件,所以就保存成这种最常用的视频文件格式就好了。
feiyangqingyun
2020/08/05
1.2K0
Qt音视频开发3-vlc录像存储
Qt音视频开发24-ffmpeg音视频同步
用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如收到的数据包是一帧视频一帧音频的,要么根本没法同步歪七八糟的,要么进度跳过去直接蹦蹦蹦崩溃的,其实最完美的音视频同步处理demo就是ffplay,我亲测过几十种各种各样的音视频本地文件,数十种视频流文件,都是非常完美,当然啦这是亲生的啦,不完美还玩个屁。
feiyangqingyun
2020/09/24
2K0
Qt音视频开发24-ffmpeg音视频同步
Qt音视频开发14-mpv读取和控制
用mpv来读取文件的信息,以及设置当前播放进度,音量、静音等,和当时vlc封装的功能一样,只不过vlc是通过调用函数接口去处理,而mpv是通过读取和设置属性来处理,vlc支持定时器或者线程中函数方法去读取状态,也支持事件回调去拿到对应的状态改变,mpv当然也支持,而且还更方便,主要的工作量或者花费的时间在如何知道有哪些属性、分别是什么功能含义,这个在官方都列出来了(http://mpv.io/manual/master/#options、http://mpv.io/manual/master/#list-of-input-commands、http://mpv.io/manual/master/#properties),不过都是英文就是,大部分程序员应该是没有什么难度的,大不了鼠标右键翻译成中文即可,哈哈,相信不少人都这么干过,很多浏览器默认就支持鼠标右键菜单翻译的,实在是很方便的,本人在查阅很多英文文档的时候,用的也是蛮多的,包括Qt官方的文档和BUG报告页面,但是建议在搜索问题的时候还是建议尽量用英文的描述去搜索,这样才能搜索的更精确。
feiyangqingyun
2020/08/20
1.3K0
Qt音视频开发14-mpv读取和控制
Qt音视频开发7-ffmpeg音频播放
之前用ffmpeg解码出来了音频,只是做了存储部分,比如存储成aac文件,播放的话早期用的是sdl来播放音频,自从Qt5以后提供了QAudioOutput来播放输入的音频数据,就更加方便了,可以直接将解码好的音频数据写入就能播放了,这些就少了个学习sdl的成本,而且和Qt就更加融合,不需要额外的第三方库,解码好的视频,其实就是一张张图片数据,可以直接用QPainter绘制或者QOpenGlWidget通过GPU显示,解码好的音频用QAudioOutput播放,这对于很多初学者来说,是个很好的消息,完美。
feiyangqingyun
2020/08/10
1.6K0
Qt音视频开发7-ffmpeg音频播放
Qt音视频开发4-vlc读取和控制
vlc本身是个全功能的很牛逼的播放器,你能够想到的播放的功能他都有,比如获取视频文件的长度、唱片的封面、当前播放进度、设置播放进度、声音控制、静音控制等,这些vlc都给你封装好了,你直接调用对应的api函数即可。
feiyangqingyun
2020/08/06
1.2K0
Qt音视频开发4-vlc读取和控制
Qt音视频开发49-通用截图截屏
采用了回调方式的视频通道,截图只需要对解析好的QImage对象直接保存即可,而对于句柄的形式,需要调用不同的处理策略,比如vlc需要用它自己提供的api接口函数libvlc_video_take_snapshot传入保存路径即可,mpv的内核执行screenshot-to-file命令传入路径参数即可,而ffmpeg就需要设置抓拍标志位,在实时采集解析那边,如果当前是截图标志位真,则需要改成QImage转换的机制发出图片,而不是yuv的数据opengl绘制,海康的sdk调用NET_DVR_CapturePicture函数即可。
feiyangqingyun
2020/11/24
1.7K0
Qt音视频开发49-通用截图截屏
海康威视rtsp取流地址(海康威视设置教程)
本文目的主要是想要实时显示海康威视的摄像头数据,笔者尝试了如下几种方式(部分未做完):
全栈程序员站长
2022/08/01
23.7K0
海康威视rtsp取流地址(海康威视设置教程)
Qt音视频开发23-通用视频控件
在之前做的视频监控系统中,根据不同的用户需要,做了好多种视频监控内核,有ffmpeg内核的,有vlc内核的,有mpv内核的,还有海康sdk内核的,为了做成通用的功能,不同内核很方便的切换,比如pro直接改一个DEFINE的变量名,所以需要将各种内核的使用方法做成一样的接口,这样看起来就很整齐,所以后面特意提炼了一个通用的视频控件,该控件没有具体的视频播放控制功能,需要根据不同的内核去调用具体的方法实现,后面还需要增加大华sdk或者其他第三方厂家的协议的时候,直接套用这个通用视频控件即可,以后增加新的监控内核,可以省下很多工作量,基本上只需要做内核解析就行,其余通用接口和绘制图像直接交给通用视频控件就行。
feiyangqingyun
2020/09/02
1.4K0
Qt音视频开发23-通用视频控件
Qt音视频开发27-Onvif设备搜索
最近业余时间主要研究音视频开发这块,前面的文章写了好多种视频监控内核,一旦将这些内核搞定以后,视频监控的相关功能水到渠成。做视频监控系统,绕不过onvif这玩意,这玩意主要就是为了统一一个大概的标准,能够对各个厂家的监控设备进行常用的一些操作,比如搜索、获取信息、云台控制、事件订阅、抓拍图片等,如果没有这个规范,那么各个厂家都各自为政,需要用私有的sdk去处理,这样就很麻烦很惨了,几十个厂家就需要几十个sdk,对于程序员来说简直是灾难,想想就很恐怖的事情,哪个程序员不想多活几年!
feiyangqingyun
2020/10/04
1.1K0
Qt音视频开发27-Onvif设备搜索
Qt音视频开发5-vlc事件订阅
事件订阅可以拿到文件长度、播放进度、播放状态改变等信息,vlc的事件订阅机制封装的比较友好,只需要先创建一个事件管理器,然后逐个订阅自己感兴趣的需要的事件,不感兴趣的可以不要订阅,只有订阅了的事件才能在事件回调中拿到,所以如果在事件回调中发现一些事件没有拿到,首先要检查下到底订阅了没有,所有事件的枚举在libvlc_events.h头文件中可以查阅到,都用的是通俗易懂的全英文单词描述,有过基本英语能力的开发人员都能看懂。
feiyangqingyun
2020/08/07
7550
Qt音视频开发5-vlc事件订阅
Qt音视频开发38-USB摄像头解码linux方案
做嵌入式linux上的开发很多年了,扳手指头算算,也起码9年了,陆陆续续做过很过诸如需要读取外接的USB摄像头或者CMOS摄像机的程序,实时采集视频,将图像传到前端,或者对图像进行人脸分析处理,最开始尝试的就是QCamera来处理,直接歇菜放弃,后面通过搜索发现都说要用v4l2视频框架来进行,于是东搞搞西搞搞尝试了很多次,终于整出来了,前后完善了好几年,无论写什么程序,发现要简简单单的实现基础的功能,都是非常快速而且容易的,但是想要做得好做得精,要花不少的精力时间去完善,适应各种不同的场景,比如就说用v4l2加载摄像头这个,需要指定设备文件来读取,而现场不可能让用户来给你指定,频繁的拔插也会导致设备文件名的改动,所以必须找到一个机制自动寻找你想要的摄像机的设备文件名称,比如开个定时器去调用linux命令来处理,甚至在不同的系统平台上要执行的命令还有些许的区别,如果本地有多个摄像头还需要区分左右之类的时候,那就只能通过断电先后上电顺序次序来区分了。
feiyangqingyun
2020/10/21
2.9K0
Qt音视频开发38-USB摄像头解码linux方案
Qt音视频开发26-ffmpeg播放器
用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件正常而有些文件不准,声音播放采用的sdl总感觉多了个依赖怪怪的,而且很多初学者也反映希望采用Qt自身的类来播放),近期正好把这两个难点一一攻破了,音视频同步采用的外部时钟同步,声音播放采用的Qt自带的QAudioOutput(并没有采用sdl,省去学习sdl开源库的成本),播放器的demo如期进行。有时候做项目,如果将各个难点击破以后,接下来都是顺理成章水到渠成的事情,速度会非常快,这也是我经常用的策略。
feiyangqingyun
2020/09/26
1.6K0
Qt音视频开发26-ffmpeg播放器
Qt音视频开发6-ffmpeg解码处理
采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在 Linux 下开发出来的,但它可以在包括 Windows 在内的大多数操作系统中编译。这个项目是由 Fabrice Bellard 发起的,现在由 Michael Niedermayer 主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。
feiyangqingyun
2020/08/08
1.6K0
Qt音视频开发6-ffmpeg解码处理
Qt音视频开发40-人脸识别离线版
上一篇文章写了在线调用人脸识别api进行处理,其实很多的客户需求是要求离线使用的,尤其是一些事业单位,严禁这些刷脸数据外泄上传到服务器,尽管各个厂家号称严格保密这些数据,但要阻止这些担心,唯一的解决办法就是设备离线使用,连个屁的网,不联网看你怎么上传,于是离线的人脸识别应用应运而生,比如我们手机上的识别就是本地库在运算,至于本地模型库估计会联网更新,以保持最新的状态。百度的离线人脸识别做的还行,看官网的sdk开发包,更新也是蛮快的,提供了windows、linux、android等版本。
feiyangqingyun
2020/10/27
1.1K0
Qt音视频开发40-人脸识别离线版
相关推荐
Qt音视频开发18-海康sdk回调
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档