Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >www3992019com请拨18687679495银河国际零基础快速搭建K歌应用【含源码】

www3992019com请拨18687679495银河国际零基础快速搭建K歌应用【含源码】

原创
作者头像
用户7106032
修改于 2020-03-30 02:36:41
修改于 2020-03-30 02:36:41
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

玩法开天辟地,体验不留缝隙。K歌不遗余力,应用解决效益。总是羡慕别人家的“歌房”苦叹自家“茅草房”消除不了回音和混音?这次就将带你实战K歌功能,细分应用场景,提升产品表现,为你在“造房“路上“添砖加瓦“,给你最实用的”武器“,让你的”K歌房“摆脱尴尬的余音绕梁,从此高品质翱翔。看淡K歌之王,用技术推你做”K歌王中王“!

本期腾讯云大学大咖分享课程邀请到腾讯云高级工程师,主要从三个方面说明如何搭建K歌应用

  1. K歌功能应用场景和产品表现
  2. K歌功能技术实现方案
  3. K歌功能的开发实战

K歌的种类分为本地录制和在线歌房。

本地录制主要分两大模块:跟随伴奏唱歌录制和调音台。调音台用来通过调整人声位置来调整抢慢拍缺陷,调节人声及伴奏音量,混响及变声等音效。均衡器是对声音的不同频段进行增强或降低。例如,唱吧和全民K歌应用的都是本地录制模式。

在线歌房是房主的声音和伴奏通过网络编码发送给房间听众。例如,直播

本地录制流程

伴奏文件经解码转入播放设备,人声跟随伴奏录制后用采集设备进行人声伴奏的同步采集。通过回声消除将伴奏声音消除,留下人声,并存为人声临时文件。另一分支的耳返的作用是将人声送达至用户的耳朵。整个录制流程是人声经变声等设置后与伴奏形成耳返混音一并转入播放设备。录制后进行后期处理与伴奏最终生成音频文件。

技术应用

常见伴奏文件形式有mp3,ogg,acc,wav。大部分手机尽管支持MP3解码,但安卓机型容错能力较差,对异常MP3文件(MP3文件不完整或格式错误)通常无法播放。部分安卓系统支持ogg播放,但IOS系统全部不支持,这些情况都需要打包解码库。解码库的多样化可能造成的问题:对于app而言,音乐文件格式仅一种,并不需要占安装包的大小进行无用打包

解决方式:动态加载。即每个解码库单独操作为动态库(SO,DLL等)播放音乐时先加载动态库,可加载到就正常播放,加载不到就返回即库不存在。用户可灵活选择打包数量。可支持动态下载的动态库,例如安卓和Windows,在APP运行期间,根据文件格式选择库。

边下边播指的是边下载伴奏文件边播放,此时会出现卡顿问题。即便是本地文件,播放过程中也可能存在卡顿。

卡顿出现的原因:

  1. 解码线程和其他任务线程共用时,因其他任务过重导致编码不及时产生卡顿。因此编码需要使用单独线程。
  2. 设置缓存 单独线程的卡顿,在如今的并发系统中线程的调度是通过时间片轮巡的,不使用Buffer时,当设备需要数据,线程未被调度就会引起卡顿。

录制

录制部分需要回声消除即播放的部分无需采集。通常为系统自带功能,例如在通话时开通扬声器,对方的声音不会被采集后转发回去。系统回声消除存在一定局限性,例如只支持在通话情况下开启回声消除,媒体音量开启并无效果,有些设备显示返回失败。通话条件下开启回声消除时采样率降低。因在高采样率下,采集到的声音频段丰富,回声消除操作对算法和设备性能要求高。K歌场景下,如果用16k,很难满足用户需求,所以采用采样率为44.1k的自研回声消除。

在t0时刻,伴奏经解码后播放,从播放到用户接受到伴奏存在的时间间隔称为播放延迟。IOS系统,播放延时小。安卓系统相对较大,一般播放延时为几百毫秒。从用户开始唱歌到t1时刻人声伴奏采集到内存称为采集延迟。采集延迟和播放延迟时间相似,安卓设备的两个延迟一般是100~200ms。在t1时刻下采集到t0时刻的伴奏,为实现人声伴奏对齐需要计算出t0和t1的时间间隔。通过计算播放延迟和采集延迟或一并计算总延迟。例如,计算总延迟,先播放一段测试声音,采集后对比两个信号的偏移情况得出结果。计算总延迟的方法相对精确,实验室常用此方法,但此方法并不适合线上环境,很难实现在唱歌前播放一段测试音乐,这种情况下采用分段计算即可。播放延迟分为两部分,获取数据时的buffer最小值为mini buffer,可根据码率声噪等计算出时长。获取mini buffer后,对100款主流机型进行测试得出播放延迟大约为mini buffer的二倍。同理可得采集延迟。人声伴奏对齐主要关注开始播放时,按播放采集延时计算,暂停后重新对齐。

混响

混响是声源发出声音后被反射物反射,反射后的声音与声源声音相结合出的声音。

混响的影响因素:反射物的远近,多少和材质。反射物的远近决定反射声音的到达时间,例如房间里回声快速到达,山谷回音经久不息。反射物的多少决定反射信号的多少,例如山谷里的回声清晰可辨,房间里回声难以分辨。反射物的材质决定混响时间,反射物多,信号被吸收的多,声音持续时间短。

以下为原声和空灵两模式的对比图。空灵模式下,直达声和反射声距离长,所谓山谷回音。

原声是在房间里的说话状态,左边的长线段为直达声,反射声随之到达,很难进行区分。房间内物体多,吸收声音效果强,混响时间短。第一个反射声到达时间,反射声多少,混响持续时间决定混响程度。通过8种混响模式对以上三种因素进行调节,下文demo操作时会具体呈现。

均衡器

均衡器是对不同频率的声音进行缩放。下图是一段录音经傅里叶变换后发现一个声音由很多频率的声音构成。此录音在1000Hz之前相对较大,随之缩小,16000Hz之后能量几乎为零。根据频率图,我们可以对不同频段的声音进行放大或缩小。低频声音若饱满,则说明低频信号较合适,若低频信号小,声音较为单薄。低频信号高,信号较厚重。高频信号较为明快。一般来说均衡器支持以下10级。下方的数字说明的是一个区间值,例如31,是均衡31~61这段区间的区间值。

变声

变声支持12类型:萝莉,大叔,熊孩子,感冒,困兽,空灵肥仔,重金属,外国人,重机械,强电流,土话。根据以上声音特点使用的技术方法并非单一,例如萝莉和大叔两种,通过升降频率实现,空灵通过混响来实现。

以下是原声和萝莉的语谱图,横坐标为时间,纵坐标为频率。颜色代表特定时间点下,某频率的声音强度。原声的声音频率较窄,为16000Hz以下。萝莉音频率被拉长,一些低频音被放大为高频,频率为14000Hz左右。可以用QQ语音消息进行体验,和GME的K歌功能一样,都是音视频实验室研发的。

在线K歌

在线K歌发送端和稳定录制相似,增加了编码这一项。根据流程图所示,编码后发包,收包等,最后解码播放。

K歌房考虑因素:伴奏,人声,歌词同步。和上述伴奏人声同步不同的是,虽然本地伴奏与人声同步,但发送期间由于网络延迟不固定,接收端收到后,伴奏和人声还是会有偏移。因此伴奏和人声需要混音发送。歌词同步就是时间戳的同步,根据当前收到的声音所在时间

来展示歌词。展示歌词分逐字展示和逐句展示,逐字对时延要求较高。

同步时间戳的两种方式:

1开始时发送信令,然后暂停或结束再次发送信令,对方根据接收时间,通过计时器的累加决定伴奏的时间。这种方式的好处不需要改变音频帧的格式,如果音频帧的扩展性不好,可采用此方式。

2 如果音频帧的扩展性较好,对时间戳精度要求高,则需要把当前伴奏的时间戳放在音频帧的头或尾,与音频帧一同传送。此种方式实施效果好,目前我们采用此方式。

延迟控制

延迟控制主要控制直播场景中,说话者的声音经网络发送到听者的时间。这个时间可细分为播放和采集延时,设备相关问题可控范围小。另一个原因是网络传输,可通过增加后台服务器,使每个用户就近连接,通过最近通路传输。

延迟的另一个类型是由网络收发包buffer引起的延迟。音频数据通过UDT形式传输,而UDT不能保证持续性。例如有三个音频包,可能接受顺序是混乱的,部分音频包会被丢弃,导致声音断断续续并不完整。因此,延迟也并非越小越好。我们需要对不同场景进行优化,比如直播模式无交互,听众不会和直播者互动,只需保证直播人的声音和画面是同步的,即使晚几秒传输,听众是无法明显察觉的。在这种情况下先保证避免卡顿,延时可略微增加。

连麦模式是在直播的过程中实现听众与直播者的互动,这种情况下对实时性要求较高。因此连麦模式需要低延时,卡顿可略微存在。不同模式的侧重点不同,需根据具体场景调整参数。

录制过程中,只有一位录制者时,录制并上传即可。如果多人参与录制,则采取后台录制,即后台统一解码多人声音,生成文件,录制结束时,返回服务器地址,即可进行观看。

以下是实现一个简单的本地录制功能的实战演练环节。

加文章结尾“学习君”微信可获取课程资料。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、初始化 
   ITMGContext.GetInstance(this).Init(String.valueOf(mAppId), mUserId);//初始化sdk,用来登录
   ITMGContext.GetInstance(this).SetTMGDelegate(new MyDelegate());//设置代理类,用来接受各种回调和事件
   EnginePollHelper.createEnginePollHelper();//定时去调用Poll函数,可以用这个辅助类,也可以在某个周期函数中调用
2、进房
        byte[] authbuff = AuthBuffer.getInstance().genAuthBuffer(mAppId, mRoomId, mUserId,mAppKey);//获得鉴权信息,最好放在server
    ITMGContext.GetInstance(this).EnterRoom(mRoomId, 2, authbuff);//进入房间
3K歌相关接口

        /*功能:开始录制
        **参数:
        **type:K歌场景传ITMG_AUDIO_RECORDING_KTV
        **dstFile:目标文件路径,用于保存录制完成的音乐
        **accMixFile:一般是没有原声的伴奏,用来和人声合成音乐文件
        **accPlayFile:用于播放的音乐文件,正常情况下和accMixFile是同一个文件。但在用户不熟悉歌曲的时候,可以是带原唱的音乐文件
        */
    int StartRecord(int type, String dstFile, String accMixFile, String accPlayFile);
        
        /*功能:停止录制*/
    int StopRecord();
        
        /*功能:暂停录制*/
    int PauseRecord();
        
        /*功能:继续录制*/
    int ResumeRecord();
        
        /*功能:设置播放用的音乐文件,一般用于在原唱和纯音伴奏之间切换
        **参数:accPlayFile,用于播放的音乐文件
        */
    int SetAccompanyFile(String accPlayFile);
        
        /*功能:获取伴奏文件的长度*/
    int GetAccompanyTotalTimeByMs();
        
        /*功能:获取当前录制了多长时间*/
    int GetRecordTimeByMs();
        
        /*功能:将录制时间跳转到指定时刻。如果参数比当前时间靠前,则重复的地方重新录制;比当前时间靠后,则用静音数据填充没有录制的部分
        **参数:timeMs,跳转的时刻,单位ms
        */
    int SetRecordTimeByMs(int timeMs);
        
        /*功能:设置音效
        **参数:type音效类型,参见ITMG_KaraokeType
        */
    int SetRecordKaraokeType(int type);
        
        /*功能:获得录制文件的长度*/
    int GetRecordFileDurationByMs();

        /*功能:开始预览录制文件*/
    int StartPreview();
        
        /*功能:停止预览录制文件*/
    int StopPreview();
        
        /*功能:暂停预览录制文件*/
    int PausePreview();
        
        /*功能:继续预览录制文件*/
    int ResumePreview();
        
        /*功能:设置当前预览的时间点
        **参数:time,预览文件的时间点单位ms
        */
    int SetPreviewTimeByMs(int time);
        
        /*功能:获取当前预览的时间点*/
    int GetPreviewTimeByMs();

        /*功能:设置人声和伴奏的缩放比例
        **参数:
        **mic:人声的缩放比例,1.0为原来音量,小于1.0为缩小,大于1.0为放大
        **acc:伴奏的缩放比例,1.0为原来音量,小于1.0为缩小,大于1.0为放大
        */
    int SetMixWieghts(float mic, float acc);
        
        /*功能:设置人声相对于伴奏的偏移,一般用于调整声音跟不上节拍的问题
        **参数:time,人声相对于伴奏的偏移时间,单位ms。大于0为向后移动,小于0为向前移动
        */
    int AdjustAudioTimeByMs(int time);
        
        /*功能:将录制好的人声和伴奏合并成一个文件*/
    int MixRecordFile();
        
        /*功能:取消合并操作*/
    int CancelMixRecordFile();
        
        
        需要监听的事件:
        /*功能:录制完成的回调。伴奏播放结束或者调用StopRecord触发
        **参数:
        **result:录制结果错误码,0为成功
        **filepath:目标文件的路径,StartRecord传入的
        **duration:录制文件的长度,单位ms
        */
        ITMG_MAIN_EVENT_TYPE_RECORD_COMPLETED        

        /*功能:预览完成的回调。预览文件播放结束或者调用StopPreview触发
        **参数:result,播放结果错误码
        */
    ITMG_MAIN_EVENT_TYPE_RECORD_PREVIEW_COMPLETED
        
        /*功能:合成文件完成的回调。合成文件完成触发,完成之前调用CancelMixRecordFile则没有回调
        **参数:
        **result:合成结果错误码,0为成功
        **filepath:目标文件的路径,StartRecord传入的
        **duration:录制文件的长度,单位ms
        */        
    ITMG_MAIN_EVENT_TYPE_RECORD_MIX_COMPLETED(32)
    
接口详细说明参见:https://cloud.tencent.com/document/product/607

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
创新架构扫清难题,TRTC实时合唱解决方案让你在家Get千人大合唱的快乐!
同时,全民K歌还持续打造明星大合唱玩法,与吴克群、张远、陈卓璇等超多实力歌手合作,邀请他们空降歌房和K歌粉丝实时互动。有实力的粉丝可以参与选拔,赢取与明星1v1对唱的机会。普通歌迷朋友也可以加入”明星空降大合唱“,歌手作为领唱,歌迷点击”加入合唱“,便可与明星同框合唱,无需抢票去现场,在家就能分分钟Get演唱会全场合唱的快乐,获得堪比演唱会现场的沉浸式体验。
腾讯云音视频
2024/04/30
3180
创新架构扫清难题,TRTC实时合唱解决方案让你在家Get千人大合唱的快乐!
欧阳金凯:以歌会友-全民K歌,致力打造最好的音乐娱乐社交系统
LiveVideoStack:欧阳金凯你好,能否向LiveVideoStack的读者介绍下自己的工作经历,以及目前负责工作内容和专注的领域。
LiveVideoStack
2019/07/01
1.4K0
欧阳金凯:以歌会友-全民K歌,致力打造最好的音乐娱乐社交系统
手机K歌的人声伴奏对齐优化实践
大家好,我是王国腾,在唱吧主要负责音视频技术的研发和音频新技术的科研工作。本次将主要为大家介绍手机K歌在混音时间对齐方面存在的问题,常规的工程解决方案以及值得探索的方向。
LiveVideoStack
2021/09/01
1.6K0
腾讯云游戏多媒体解决方案
说到音频,就不得不说腾讯音视频实验室了,腾讯音视频实验室,成立于2010年,八年间专注于音视频通信技术的前瞻性研究,包括全球实时音视频网络优化、音视频编解码前沿算法研究、计算机视觉图像处理、基于AI的音频语音增强、声音美化及音视频质量评测等。在服务于腾讯社交体系下的海量用户同时,在实时音视频通信、图像处理和音视频处理等技术领域积累了十几年的研究经验,拥有行业领先的技术水平。目前已为行业数百个产品提供了音视频技术支持与服务,如QQ电话、腾讯云、企业微信、QQ空间、全民K歌、快手、斗鱼、虎牙、蘑菇街等。
Techeek
2018/07/10
3.1K0
《音视频开发进阶指南》—— 读书笔记
前言 之前偶然看到一个PPT,是一些视频特效的讲解。首页如下: PPT解析了模糊镜像、电击效果、灵魂出窍、动态晕影等视频处理效果,最后推荐作者自己写的书: 在“音视频进阶”、“唱吧核心架构开发”
落影
2018/04/27
2.6K0
《音视频开发进阶指南》—— 读书笔记
技术实战 —— 快速实现语聊房搭建
语音相比文字图片更丰富,比视频又更简便,是天然的社交工具。以95后为代表的Z世代用户,在微信、QQ、微博等主流社交工具以外,更愿意尝试基于不同兴趣相对小众的社交工具。ZEGO 即构科技推出语聊房解决方案,帮助客户快速搭建语聊房。本次分享,我们邀请到了 即构科技交付解决方案专家 JIN 。他向我们分享了线上社交以及语聊房的发展、玩法,并详细解析如何快速搭建语聊房,提供稳定、低延时,高品质的线上互动体验。
LiveVideoStack
2021/12/21
1.6K0
技术实战 —— 快速实现语聊房搭建
解析腾讯云游戏多媒体引擎GME技术方案
在网络游戏中,无论是大逃杀、棋牌类、电子竞技类还是娱乐休闲类小游戏,玩家和玩家之间的互动和语音聊天都是一个必不可少的环节。作为一个通用的技术需求,如果由游戏厂商自己从零开始研发相应的音频技术,既不经济也不具备技术优势,因此市面上有一些厂商提供第三方的游戏音频SDK,让游戏开发商免于重复造轮子的同时,能把更多时间花在提升核心竞争力上。
可可爱爱没有脑袋
2019/12/03
3.4K0
解析腾讯云游戏多媒体引擎GME技术方案
QQ音乐银河音效技术实践——音乐重放效果的补偿与修饰
音效渲染是音频或音乐播放器最为重要的后处理模块之一。LiveVideoStackCon 2022 北京站邀请到腾讯音乐银河音效开发负责人——闫震海,为大家介绍银河音效在QQ音乐播放器中的创新应用,包括空间环绕效果和音效制作工具等内容。 文/闫震海 编辑/LiveVideoStack 大家好!很高兴和大家一起分享交流关于QQ音乐银河音效的一些技术实践。 相信大家对音效处理都不陌生。它已经被广泛应用在各种音频信号、音乐信号的渲染场景中。本次分享重点是音乐重放场景,如何利用音效对最终听到的感觉进行补偿和修饰。
LiveVideoStack
2023/05/05
1.8K0
QQ音乐银河音效技术实践——音乐重放效果的补偿与修饰
展晓凯:短视频APP架构设计与实现
本文来自全民快乐研发高级总监展晓凯在LiveVideoStackCon 2018讲师热身分享,并由LiveVideoStack整理而成。分享中展晓凯详细介绍了短视频APP场景中视频录制、编辑、保存
LiveVideoStack
2021/09/01
2.2K0
影视后期丨Adobe Audition安装教程-AU软件全版本下载地址 +干货分享
Adobe Audition 的是一款专业音频编辑和混合环境,其前身为 Cool Edit Pro(1997年由Syntrillium开发),2003 年被 Adobe 收购,并将其音频技术融入到了旗下 Premiere、After Effects 等影视相关的软件中。
木子学Lee
2023/02/26
3.3K0
影视后期丨Adobe Audition安装教程-AU软件全版本下载地址 +干货分享
关于实现唱吧清唱功能的理解
在 iOS 上多媒体的处理主要依赖的是 AVFoundation 框架,而 AVFoundation 是基于 CoreAudio、CoreVideo、CoreMedia、CoreAnimation 之上高层框架,在 AVFoundation 框架之上苹果还提供给我们更高层一些处理媒体数据的框架。
molier
2022/11/03
1.3K0
关于实现唱吧清唱功能的理解
​K歌中的歌唱评价与嗓音分析
我是高月洁,来自网易云音乐,是K歌综合评分系统的项目负责人,同时也负责包括音乐业务、直播业务与嗓音分析相关的内容。
LiveVideoStack
2022/02/11
3.7K1
​K歌中的歌唱评价与嗓音分析
码农录歌心得
最近喜欢上录歌,不是自己写歌编曲演奏演唱那么高段,也不是自弹自唱(这个后面可以有),也不是去录音棚交钱只管唱那么悠然。就是在自己的电脑上,翻唱一些自己喜欢的歌,自娱自乐一下。所以要做的事无非是:找伴奏+录唱+后期混缩=>输出。陆续录了一些,算是有了一些心得,分享一下。纯业余+新手向,恳请指教。
AhDung
2018/09/13
1.2K0
码农录歌心得
可落地的实时合唱解决方案需要解决哪些技术难点?
实时合唱是国内K歌行业一直在探索的新场景,但由于技术难点多、对网络条件要求高等原因,迟迟未能正式上线。而就在昨日,声网宣布对实时合唱技术方案全面升级,帮助国内知名迷你KTV品牌“咪哒”实现国内首个支持多终端、多人合唱、高音质的完整实时合唱解决方案的落地。
音视频开发进阶
2021/05/10
8410
可落地的实时合唱解决方案需要解决哪些技术难点?
语音消息技术实现技术实践
消费升级的时代,搭配才能创造奇迹。文字是苍白的,语音是生动的,语音转文字是具备科技色彩的。文字一旦有了科技感,生活才能有质感。本课程以GME做“活化酶”,将详细介绍以微信语音转文字技术为基础的GME功能,带你告别文字的苍白,激发AR活性,让你的生活瞬间充满“胶原蛋白”。随着AR技术的不断发展,语音转文字在音频场景的应用不断成熟。
可可爱爱没有脑袋
2020/01/10
3.8K0
语音消息技术实现技术实践
实时音视频开发学习2 - TRTC底层实现机制
以上是对腾讯云TRTC产品的一个基本概述,既然知道了这个东西功能这么丰富,拿它涉及了一些什么基础技术,又是怎么实现这个音视频的原理呢?以下便是对其的一个详解。
金林学音视频
2020/08/20
3.1K1
实时音视频开发学习2 - TRTC底层实现机制
腾讯音视频实验室:基于音视频细分场景的技术创新探索
感谢主办方LiveVideoStack给予这次分享机会来介绍我们整体的技术方案,以及互相探讨学习。首先,做下自我介绍,我是来自腾讯音视频实验室的郭亮,主要负责腾讯视频云的整体解决方案,以及互动直播、点播的解决方案。
LiveVideoStack
2021/09/02
6930
腾讯音视频实验室:基于音视频细分场景的技术创新探索
FL Studio21.0.0中文最新版更新内容介绍
FL Studio 21.0.0官方中文版重磅发布纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心换!Mac版新增对苹果M2/1家族芯片原生支持。编曲、剪辑、录音、混音,20余年的技术积淀和实力研发,FL Studio 已经从电音领域破圈,成功蜕变为瞩目的全能DAW,把电脑变成全功能音乐工作室,接下来我们会为您一一展示!
用户7442547
2023/03/04
1K0
声学工程师应知道的150个声学基础知识(全篇)
注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面。但是关于声音的一些基础内容还是相同的,可以多多了解!!!
音视频开发进阶
2022/10/31
3.2K0
腾讯会议突围背后:端到端实时语音技术是如何保障交流通畅的?
说到腾讯会议背后的实时语音端到端解决方案,大家可能第一时间就想到了PSTN电话,从贝尔实验室创造模拟电话开始,经过一百多年的发展,整个语音通信、语音电话系统经历了很大一部分变化。尤其是最近三十年来,语音通话由模拟信号变为数字信号,从固定电话变为移动电话,从电路交换到现在的分组交换。
腾讯云开发者
2020/03/25
6.4K0
推荐阅读
相关推荐
创新架构扫清难题,TRTC实时合唱解决方案让你在家Get千人大合唱的快乐!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验