- 博客(4987)
- 资源 (98)
- 收藏
- 关注
原创 Android15 手机+车载 音频性能实战课(无声/杂音/断音/爆音解决方案):正式上线了(二百七十)
Android15车载手机音频性能实战课<无声/杂音/断音/爆音>等22种高频音频性能问题解决方案。更多原创,欢迎关注:Android系统攻城狮。
2026-02-02 06:30:00
1914
原创 【Android15 手机+车载 音频策略实战课】:正式上线了(二百六十四)
本篇目的:本课程基于Android15最新版本,深度讲解音频策略系统的设计架构与实战应用。从音频策略树的基础结构入手,逐步深入核心骨架、音量曲线等关键模块。再通过7个真实项目案例(Speaker改向、USB无损播放、蓝牙空间音效、定制音量曲线、Gain转换、数字耳机适配等)完整演示策略开发全流程。最后涵盖系统APP与MediaProjection的音频截取对比,帮助开发者掌握系统级音频策略定制能力。
2025-11-26 16:17:36
923
原创 【Android15快速自定义与集成音效实战课】:正式上线了(二百六十二)
本篇目的:给大家介绍一下:我的【Android15快速自定义与集成音效实战课】:正式上线了,希望可以帮助大家!这是一个在企业开发中,Android音效自定义、集成、调试快速上手的实战课。【Android15快速自定义与集成音实战课】,就是为了解决Android APP、Framework、音频开发者遇到音效问题的一个上手实战课,帮助开发者快速上手领导给的音效集成、调试、问题定位。软件 + 硬件开发环境源码环境:android - 15.0 . 0 _r32硬件环境:Pixel6。
2025-10-17 15:49:16
1037
1
原创 Linux FFmpeg深度解析之avdevice_configuration调用流程与实战(五十)
本篇目的:理解如何返回FFmpeg构建时记录的配置字符串,并通过程序查看该字符串,分清构建配置和运行时设备状态。排查设备支持问题时,开发者常需要确认当前使用的FFmpeg构建包含哪些配置选项。返回构建阶段写入的配置字符串,供程序查看编译配置。它不会探测本机设备,也不会注册或打开输入输出设备。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;
2026-11-15 05:15:00
306
原创 Linux FFmpeg深度解析之av_probe_input_buffer调用流程与实战(四十九)
本篇目的:理解如何通过输入格式回调或恢复媒体读取,并用RTSP场景观察暂停与恢复的调用关系。位于libavformat输入读取控制层。它根据当前使用的输入格式选择恢复路径:优先调用 demuxer 的read_play回调;没有该回调时,再尝试恢复底层。它不负责解码数据,也不维护播放器界面上的暂停状态。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em。
2026-11-15 05:00:00
180
原创 Linux FFmpeg深度解析之av_probe_input_format调用流程与实战(四十八)
本篇目的:理解如何根据选择输入格式,并通过构造WAV探测数据观察demuxer评分与格式返回结果。FFmpeg需要先确定输入数据属于哪种封装格式,才能选择对应的demuxer读取文件头和媒体包。接收调用者准备好的探测数据,遍历可用输入格式并返回匹配的。它只负责根据现有探测数据猜测格式,不负责从文件或网络读取数据,也不负责打开输入和解析媒体流。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-14 05:15:00
350
原创 Linux FFmpeg深度解析之av_read_play调用流程与实战(四十七)
本篇目的:理解如何通过输入格式回调或恢复媒体读取,并用RTSP场景观察暂停与恢复的调用关系。位于libavformat输入读取控制层。它根据当前使用的输入格式选择恢复路径:优先调用 demuxer 的read_play回调;没有该回调时,再尝试恢复底层。它不负责解码数据,也不维护播放器界面上的暂停状态。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em。
2026-11-14 05:00:00
168
原创 Linux FFmpeg深度解析之swr_convert调用流程与实战(四十六)
本篇目的:理解如何使用已初始化的SwrContext读取输入音频样本、生成输出样本并保留重采样延迟。音频转换不一定能在一次调用中输出与输入采样数按采样率比例换算出的全部样本。重采样器可能需要等待滤波数据,也可能因输出Buffer容量不足而暂存输入。会在内部维护转换状态,调用者需要按返回值处理实际输出,并在输入结束后刷新延迟数据。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;
2026-11-13 05:15:00
244
原创 Linux FFmpeg深度解析之swr_alloc_set_opts2调用流程与实战(四十五)
本篇目的:理解如何创建或复用SwrContext并设置输入输出参数,明确它与swr_init()和的职责边界。音频重采样需要确定输入、输出的声道布局、采样格式和采样率。把这些参数写入SwrContext,但不会初始化转换器,也不会处理音频样本。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;输入输出音频参数SwrContext保存转换配置。
2026-11-13 05:00:00
249
原创 Linux FFmpeg深度解析之sws_scale_frame调用流程与实战(四十三)
本篇目的:理解如何使用AVFrame完成图像缩放和像素格式转换,梳理它进入切片处理接口的过程,并通过一个完整帧转换示例观察输入帧与输出帧的关系。FFmpeg的libswscale负责视频图像缩放和像素格式转换。接收源AVFrame和目标AVFrame,调用者不需要逐个传递平面指针和行跨度。它负责执行图像转换,不负责解码视频,也不负责创建缩放上下文。调用者需要先准备SwsContext和有效的源帧。fill:#333;important;important;fill:none;color:#333;
2026-11-12 05:15:00
366
原创 Linux FFmpeg深度解析之sws_scale调用流程与实战(四十四)
本篇目的:理解如何接收源图像平面、行跨度和切片范围,分析它如何把缩放结果写入目标图像缓冲区,并通过整帧示例观察返回行数。是libswscale的切片式图像转换接口。调用者把源图像的各平面指针、每行跨度、当前切片位置和目标平面指针传入函数。它负责按既定的SwsContext执行缩放和像素格式转换,不负责创建图像缓冲区,也不负责管理源、目标图像内存。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-12 05:15:00
185
原创 Linux FFmpeg深度解析之av_packet_pack_dictionary调用流程与实战(四十二)
本篇目的:理解如何将编码为字节序列,分析序列内存的所有权,并通过Packet侧数据完成打包与解包。FFmpeg需要把字典形式的元数据附加到AVPacket时,不能直接把结构体作为Packet字节数据传递。按键和值的顺序生成一段由NUL字符分隔的字节序列,供调用者添加为Packet侧数据。它只负责生成序列,不会创建AVPacket、修改原字典或自动把序列附加到Packet。fill:#333;important;important;fill:none;color:#333;color:#333;
2026-11-11 05:15:00
351
原创 Linux FFmpeg深度解析之av_new_packet调用流程与实战(四十一)
本篇目的:理解如何为AVPacket分配带引用计数的数据缓冲区,分析它初始化哪些字段,以及如何在实战中填充和释放Packet数据。解复用器、码流过滤器和应用层代码都可能需要创建一个新的AVPacket来承载压缩数据。按指定字节数分配Packet负载,并建立管理的数据所有权。它只负责分配和初始化Packet,不负责读取文件、编码数据或设置时间戳。负载内容仍由调用者写入。fill:#333;important;important;fill:none;color:#333;color:#333;
2026-11-11 05:00:00
393
原创 Linux FFmpeg深度解析之avio_enum_protocols调用流程与实战(四十)
本篇目的:理解如何遍历FFmpeg当前构建中可用的URL协议,并用输入、输出方向分别枚举协议名称。FFmpeg通过URL协议处理数据读写,例如filehttp和udp。排查程序为什么支持某类媒体地址时,需要先确认当前构建实际包含哪些协议,以及协议能否用于读取或写入。返回协议名称供调用者检查。它不解析媒体格式,不打开URL,也不保证远端服务或本地设备可用。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-10 05:15:00
247
原创 Linux FFmpeg深度解析之avformat_network_init调用流程与实战(三十九)
本篇目的:理解初始化了什么、它与网络协议打开流程的关系,以及应用如何正确处理初始化和反初始化。。但它不是创建网络连接的函数,也不会打开URL或读取媒体数据。它负责显式初始化libavformat使用的网络与TLS组件。在较新的构建中,网络协议打开时会自动初始化网络组件,因此这个接口通常是可选的。它主要用于兼容旧版GnuTLS或OpenSSL的线程安全问题。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-10 05:00:00
305
原创 Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
本篇目的:理解如何根据URL和访问标志创建,梳理它进入FFmpeg协议层的过程,并用独立文件读写验证打开、缓冲和关闭的关系。FFmpeg读写媒体数据时,格式层需要通过统一的IO接口访问文件或其他URL资源。提供带缓冲的字节读写能力,负责根据URL创建并初始化这个对象。只建立IO通道,不解析容器、不创建音视频流,也不编码数据。输出封装通常由及其muxer完成。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-09 05:15:00
314
原创 Android17车载音频进阶之H2XML定制Module(一百七十七)
目的:理解H2XML如何把Module接口和Key定义转换为ARC可用的元数据,并通过Graph、GKV、CKV和TKV驱动AudioReach用例配置。H2XML根据带注解的C头文件生成XML元数据。ARC使用这些元数据配置Module、Graph和参数,ACDB保存对应的Graph定义与Calibration数据,运行时由GSL和AML按Key Vector查询数据。H2XML负责生成配置所需的元数据,不负责执行CAPI Module中的算法。fill:#333;important;
2026-11-09 05:15:00
1802
原创 Linux FFmpeg深度解析之av_guess_codec调用流程与实战(三十七)
本篇目的:理解如何根据输出封装格式和媒体类型选择默认编码器ID,并通过最小程序检查选择结果与编码器查找之间的关系。FFmpeg写文件时,输出封装格式和编码器是两个不同对象。描述容器格式及其默认音视频编码器,AVCodecID标识具体编码格式。根据已选定的输出格式和媒体类型返回默认编码器ID。它不创建编码器,也不检查对应编码器是否已编译进当前FFmpeg;后续还要调用查找编码器实现。fill:#333;important;important;fill:none;color:#333;color:#333。
2026-11-09 05:00:00
249
原创 Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
本篇目的:理解如何根据格式名、文件名扩展名和MIME类型查找输出封装格式,并通过独立案例观察查找结果如何用于创建输出上下文。创建FFmpeg输出上下文前,需要确定使用哪种复用器。调用者可以直接指定格式名,也可以让FFmpeg根据文件名或MIME类型进行匹配。负责在已注册的输出格式中查找最合适的。它只返回格式描述对象,不创建,也不会打开文件。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;
2026-11-08 05:15:00
196
原创 Linux FFmpeg深度解析之av_write_trailer调用流程与实战(三十五)
本篇目的:理解如何完成复用收尾,分析它如何刷新待写数据、调用封装格式的收尾逻辑,并通过写入WAV文件的案例观察调用顺序。FFmpeg写输出文件时,写入容器头部,后续的提交编码后的数据包。所有数据包提交后,还需要调用完成容器收尾。这个函数负责刷新复用链路中的待处理数据并调用封装格式的收尾回调。它不会关闭底层,也不会释放整个。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;
2026-11-08 05:00:00
412
原创 Linux FFmpeg深度解析之av_interleaved_write_frame调用流程与实战(三十四)
本篇目的:理解如何接收多个流的AVPacket并由libavformat安排交织,分析包缓存与所有权变化,并通过多流Remux案例观察完整写包路径。多路音视频封装时,音频包和视频包各自有独立的时间基,不能只按读取先后直接写入。允许libavformat根据包时间戳组织交织顺序,并在需要时暂存包。调用者仍需提供正确的流索引和时间戳。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;
2026-11-07 05:15:00
417
原创 Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
本篇目的:理解如何把AVPacket送入封装器,分析它对包顺序和所有权的要求,并通过单流Remux案例观察写包流程。编码器或解复用器提供的AVPacket还需要经过封装,才能成为容器文件中的数据。把包直接交给封装器,不负责缓存或重排包。调用者必须安排封装所需的包顺序,并在调用后自行管理包的引用。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;
2026-11-07 05:00:00
390
原创 Linux FFmpeg深度解析之avformat_init_output调用流程与实战(三十二)
本篇目的:理解如何初始化输出格式上下文和流参数,分析它与的分工,并通过MPEG-TS封装示例观察两阶段初始化结果。封装输出时,应用先创建和AVStream,再配置编码参数与时间基。用于提前初始化封装器及流相关状态,便于在写入文件头之前确认初始化阶段是否已经完成。它不会打开输出IO,也不会调用封装器的写文件头。输出IO由调用者准备;写文件头仍由负责。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-06 05:15:00
186
原创 Linux FFmpeg深度解析之avformat_write_header调用流程与实战(三十一)
本篇目的:理解如何根据输出上下文初始化Muxer并写入容器头,并通过WAV输出案例观察它与Stream参数、IO和写尾接口的关系。封装输出时,应用先创建和输出Stream,并填好每条Stream的codecpar等参数。Muxer需要这些信息初始化内部状态,随后才能接收Packet。负责初始化输出并让Muxer写入文件头。它不负责编码音视频,也不负责写入后续媒体Packet。fill:#333;important;important;fill:none;color:#333;color:#333;
2026-11-06 05:00:00
344
原创 Linux FFmpeg深度解析之avformat_new_stream调用流程与实战(三十)
本篇目的:理解如何在中创建并登记一个AVStream,并通过创建音视频输出流的示例检查流索引和参数对象。复用或封装媒体时,输出容器需要知道文件中包含哪些音视频轨道。负责管理整个媒体文件的格式和多个Stream;每条AVStream保存轨道级信息,codecpar保存该轨道的编解码参数。负责创建并登记AVStream,不会自动完成编码器配置,也不会写入容器文件。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-05 05:15:00
315
原创 Linux FFmpeg深度解析之avcodec_align_dimensions调用流程与实战(二十九)
本篇目的:理解如何根据解码器和像素格式调整图像缓冲区宽高,并通过最小程序观察对齐前后的尺寸变化。解码器输出图像的显示宽高,不一定适合直接作为底层图像缓冲区的分配尺寸。像素格式的色度采样方式、编解码器的边界访问要求和行跨度对齐,都可能要求缓冲区比图像可见区域更大。根据已打开的Codec上下文调整传入的宽高。它只计算对齐尺寸,不分配图像内存,也不修改图像的显示尺寸。fill:#333;important;important;fill:none;color:#333;color:#333;important。
2026-11-05 05:00:00
168
原创 Linux FFmpeg深度解析之avcodec_default_get_encode_buffer调用流程与实战(二十八)
本篇目的:理解如何为编码器输出包分配带引用计数的缓冲区,分析它与自定义回调和AVPacket生命周期的关系,并通过回调包装示例观察默认分配器的调用位置。编码器生成压缩数据时,需要一块可写的输出内存。FFmpeg通过回调提供这块内存,默认实现就是。默认实现会根据分配,再让指向缓冲区数据。它只负责建立输出包缓冲区,不调用编码器,也不负责写文件或封装容器。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-11-04 05:15:00
175
原创 Linux FFmpeg深度解析之avcodec_receive_packet调用流程与实战(二十七)
本篇目的:理解如何从编码器读取压缩数据,分析内部包缓存、编码器输出和调用者持有的AVPacket之间的关系,并通过收包循环验证编码输出的读取方式。编码器接收原始AVFrame后,不一定马上输出压缩包。编码器可能积累输入,执行帧重排序,或等待更多数据。负责读取当前已经可用的编码结果。成功返回时,输出包是引用计数的AVPacket。下一次调用该接口前,FFmpeg会先对传入的包执行,因此调用者应在再次收包前处理或转移上一次包的数据。fill:#333;important;important;
2026-11-04 05:00:00
344
原创 Linux FFmpeg深度解析之avcodec_send_frame调用流程与实战(二十六)
本篇目的:理解如何把原始音视频帧提交给FFmpeg编码器,分析它与内部输入缓存、编码输出之间的关系,并通过发送帧和排空编码器的代码观察调用语义。编码器输入是未压缩的AVFrame,输出是压缩后的AVPacket。负责提交输入帧,并不保证一次调用就产生一个输出包。编码器可能需要积累多帧,或因重排序和内部延迟暂存数据。调用成功后,AVFrame所有权仍属于调用者。编码器可能引用帧数据,因此调用者应使用带引用计数的帧缓冲区;需要复用帧时,先调用确认数据可写。fill:#333;important;
2026-11-04 04:45:00
333
原创 Linux FFmpeg深度解析之avcodec_parameters_copy调用流程与实战(二十五)
本篇目的:理解如何把一个对象的参数复制到另一个对象,并通过实战检查动态数据是否独立。封装格式中的AVStream通过codecpar保存流的编码参数。转封装或创建过滤器链时,常常需要把一条流的参数复制到另一对象。会先重置目标对象,再复制参数,并为外部数据分配独立存储。它不复制音视频帧,也不负责把参数写入容器。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;
2026-11-03 05:15:00
330
原创 Linux FFmpeg深度解析之avcodec_find_encoder_by_name调用流程与实战(二十四)
本篇目的:理解如何按编码器名称精确查找AVCodec描述符,并通过创建编码上下文验证查找结果。按AVCodecID查找时,FFmpeg会从匹配格式的实现中选择一个编码器。如果应用已经确定要使用哪个具体实现,例如构建中注册的mpeg4编码器,就可以按名称查找。只查找名称完全匹配的编码器描述符,不会创建上下文,也不会打开或运行编码器。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;
2026-11-03 05:00:00
331
原创 Linux FFmpeg深度解析之avcodec_find_encoder调用流程与实战(二十三)
本篇目的:理解如何根据AVCodecID查找FFmpeg编码器,并通过创建编码上下文验证查找结果的用途。一个编码任务通常先确定目标格式,例如MPEG-4视频,再选择能够处理该编码格式的编码器。按编码ID查找已注册的编码器描述符,返回AVCodec指针或NULL。它只负责查找编码器,不会创建、配置编码参数或启动编码。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;
2026-11-03 04:45:00
327
原创 Android17车载音频进阶之CAPI Module开发流程(一百七十六)
目的:掌握从CAPI封装到ARE实例运行的开发流程,理解Module接口、AMDB、ARC与Container之间的关系。CAPI(Common Audio Processor Interface)是ARE与音频算法之间的接口。算法库通过CAPI Module向ARE提供输入输出端口、参数和事件接口,ARE通过AMDB查找Module实现,再由Container创建并运行Module实例。Android17是系统版本,具体CAPI接口和构建方式以项目集成的AudioReach版本为准。
2026-11-02 05:00:00
1642
原创 Linux FFmpeg深度解析之av_parser_init调用流程与实战(二十一)
本篇目的:理解如何根据AVCodecID查找并创建解析器上下文,分析解析器注册表、私有状态和之间的关系。压缩码流可能以任意字节块到达,输入块边界不一定与视频帧或音频帧边界重合。按编码格式创建对应的,供后续解析调用使用。它只创建解析器状态,不读取输入数据,也不拆分数据包。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;编码格式AVCodecID。
2026-11-02 05:00:00
330
原创 Linux FFmpeg深度解析之av_parser_parse2调用流程与实战(二十二)
本篇目的:理解如何把任意输入字节块交给对应解析器,分析输入消耗量、输出帧数据和时间戳状态之间的关系。裸码流的读取块不一定与压缩帧边界一致。接收一段输入数据,调用解析器识别已完成的帧,并报告本次消耗的输入字节数。它负责解析码流边界,不负责解码压缩帧。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;输入压缩字节块编码格式解析器输出帧指针和大小。
2026-11-02 05:00:00
172
原创 Linux FFmpeg深度解析之avcodec_default_get_buffer2调用流程与实战(二十)
本篇目的:理解如何为AVFrame分配带引用计数的音视频缓冲区,并梳理解码器回调、内部缓冲池与帧数据之间的关系。解码器处理压缩数据时,需要为解码后的帧准备数据平面。是FFmpeg提供的默认缓冲分配实现,通常由调用。它负责申请和填充AVFrame的数据缓冲,不负责解析码流或执行解码。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;
2026-11-02 04:45:00
360
原创 Linux FFmpeg深度解析之avcodec_flush_buffers调用流程与实战(十九)
本篇目的:理解如何重置解码器内部状态,说明它在seek和切换码流时的位置,并通过跳转后清理旧状态的流程验证使用边界。解码器会保存压缩包、参考帧、时间戳修正和线程状态等内部信息。播放位置跳转或切换到另一条码流后,继续使用旧状态可能让新位置的数据受到旧帧影响。用于清理解码器内部状态;它不负责在媒体文件中定位,也不替代demuxer的seek操作。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none。
2026-11-01 05:30:00
343
原创 Linux FFmpeg深度解析之avcodec_receive_frame调用流程与实战(十八)
本篇目的:理解如何从解码器取出一帧音视频数据,分析返回值对应的解码状态,并通过接收循环验证帧读取边界。调用提交压缩包后,解码器可能立即产出帧,也可能需要更多输入,或暂存重排序所需的数据。负责从解码器当前状态中取出可用的AVFrame。它不负责读取媒体文件,也不负责把压缩包送入解码器。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;有数据。
2026-11-01 05:15:00
216
原创 Linux FFmpeg深度解析之avcodec_send_packet调用流程与实战(十七)
本篇目的:理解如何把压缩数据包提交给解码器,分析输入何时被接受、何时需要重试,并通过发送循环验证EAGAIN的处理方式。Demuxer从媒体文件中取出压缩数据后,应用需要把AVPacket交给解码器。负责提交输入,并不保证一次调用就能立即产出AVFrame。如果解码器内部暂时无法接收新包,调用者需要先取出已有输出,再重试同一个包。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;
2026-11-01 05:00:00
194
Universal Serial Bus Device Class Definition for Audio Devices.zip
2019-11-16
GStreamer中文开发手册.zip
2020-07-22
H.264标准协议(官方中文版)
2020-10-28
手写Fuchsia第一个app
2020-03-16
JM-H264参考手册
2020-10-28
第五代加固技术ARM VMP原理实现与应用.zip
2020-03-01
AUDIO CODEC DAPM详解.zip
2019-12-30
debug_hybris_demo.zip
2020-06-03
vcxsrv-64.1.20.8.1.zip
2020-06-20
Gstreamer-Openmax-gst-openmax.zip
2020-08-17
MultimediaFrameworkOverview.zip
2020-09-01
HxD_Hex编辑器中文版.zip
2020-09-12
win10removeAll.zip
2020-06-25
蓝牙Audio调试.zip
2019-12-27
Android64位gdbserver与Win10-32位gdb.exe与Ubuntu64位gdb可执行bin
2024-10-15
彻底禁掉Win10 Defender自启动
2022-12-24
Elecard HEVC Analyzer_For_Windows.zip
2021-01-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅