自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(121)
  • 资源 (4)
  • 收藏
  • 关注

原创 音视频:20.FFmpeg-直播推流到服务器、加滤镜效果

FFmpeg-直播推流到服务器、加滤镜效果ffmpeg测试流媒体服务器播放地址1.录制声音获取 PCM 数据2.推送视频画面到媒体房间3.推送声音到媒体房间4.滤镜效果处理具体代码请看:NDKPractice项目的ffmpeg88livepushffmpeg测试流媒体服务器播放地址windows ffmpeg下载地址mac 和 linux 类似,进入官网下载 。下面以windows为例测试步骤:进入下载好的ffmpeg解压目录的/bin目录文件夹下使用命令拉流:ffplay.exe rtmp

2020-11-15 15:55:45 490 1

原创 音视频:19.FFmpeg-视频加背景音乐、H.264协议

FFmpeg-视频加背景音乐、H.264协议1.实现视频加背景音乐2.详解H.264协议4.获取 MediaCodec 的 sps 和 pps具体代码请看:NDKPractice项目的ffmpeg88livepush1.实现视频加背景音乐 private MediaInfoListener mMediaInfoListener = new MediaInfoListener() { private long mAudioPts = 0; private int

2020-11-15 15:55:00 379

原创 音视频:18.FFmpeg-OpenGL朋友圈录制视频

FFmpeg-OpenGL朋友圈录制视频1.OpenGL渲染流程介绍2.OpenGL渲染摄像头数据3.视频编码录制具体代码请看:NDKPractice项目的ffmpeg88livepush1.OpenGL渲染流程介绍怎么渲染一张图片:继承GLSurfaceView继承GLSurfaceView.Renderer写顶点和纹理渲染的代码编译链接生成程序生成加载 bitmap 的纹理绘制到屏幕 /** * 顶点坐标 */ private float[]

2020-11-15 15:53:38 321

原创 音视频:17.FFmpeg-直播推、拉流

以下使用    Ubuntu    环境搭建的具体代码请看:NDKPractice项目的ffmpeg88livepush1.搭建流媒体服务器1.1 安装在ubuntu系统中首先切换到root用户,然后cd到lib目录下,mkdir新建nginx文件夹。使用 wget ftp://ftp.pcre.org/pub/pcre/pcre-8.38.zip 下载 pcre-8.38.zip版本,也可以直接下载最新的版.

2020-11-15 15:51:59 356

原创 音视频:16.FFmpeg-视频播放器2

FFmpeg-视频播放器21.调整音乐播放器项目架构2. 视音频的同步具体代码请看:NDKPractice项目的ffmpeg871.调整音乐播放器项目架构解码的流程 Video 和 Audio 很多相同的,所以抽离出来了公共类: Media.cpp音频和视频单独处理成:Audio.cpp 和 Video.cpp,都继承自Media,cpp遇到的问题:下面这个方法的env 不能使用 pJniCall->jniEnvvoid Video::setSurface(JNIEnv *env, job

2020-11-15 15:49:56 1651

原创 音视频:15:FFmpeg-视频播放器1

FFmpeg-视频播放器11.使用FFmpeg解码视频2.渲染视频2.1 OpenGLES解释(渲染视频高效,硬件支持)2.1.1 OpenGL概念2.1.2 OpenGL 用来干什么2.1.3 OpenGL 与 OpenGLES 有什么关系?2.1.4 OpenGL后续学习2.2 SurfaceView 渲染视频(这节先用SurfaceView)2.2.1 Button 和 TextView 的 Canvas 是不是同一个?2.2.2 Canvas 是从哪里来的?2.2.3 Canvas 绘制的东西到哪里

2020-11-15 15:38:16 259

原创 音视频:14.FFmpeg-音乐播放器3

FFmpeg-音乐播放器31.添加准备完毕回调2.用队列边解码边播放具体代码请看:NDKPractice项目的ffmpeg831.添加准备完毕回调JNICall::JNICall(JavaVM *javaVM, JNIEnv *jniEnv, jobject jPlayerObj) { this->javaVM = javaVM; this->jniEnv = jniEnv; this->jPlayerObj = jniEnv->NewGlobalRef

2020-11-12 15:18:21 114

原创 音视频:13.FFmpeg-音乐播放器2

FFmpeg-音乐播放器21.解决内存上涨的问题2.解决杂音问题3. 添加错误回调到 Java4.多线程解码播放5.ffmpeg的一些常用指令具体代码请看:NDKPractice项目的ffmpeg831.解决内存上涨的问题将循环中新建数组操作提到循环外面去 jbyteArray jPcmByteArray = env->NewByteArray(dataSize); // native 创建 c 数组 jbyte *jPcmData = env->Ge

2020-11-12 15:13:32 1096 2

原创 音视频:12.FFmpeg-音乐播放器1

FFmpeg-音乐播放器1.获取音频 Meta 信息2.解码音频数据3.播放音频具体代码请看:NDKPractice项目的ffmpeg83先来看下流程图:1.获取音频 Meta 信息extern "C" JNIEXPORT void JNICALLJava_com_east_ffmpeg83_media_JaminPlayer_nPlay(JNIEnv *env, jobject instance,

2020-11-12 15:12:50 213

原创 音视频:11.Shell脚本-动手编译FFmpeg

Shell脚本-动手编译FFmpeg1.Cmake交叉编译Android动态库2.配置NDK环境2.1 NDK中交叉编译工具的变化2.1.1. 交叉编译工具位置的变化:3.手写FFmpeg编译脚本4.编译遇到的问题5.如何适配so框架6.编译参数传递7.运行调试音频解码避坑指南1.Cmake交叉编译Android动态库交叉编译:Linux上编译Android的sondk 16的以上版本自带交叉编译工具链cmake -DANDROID_NDK=${NDK_PATH} \ # ndk的安装目录(空格

2020-11-12 15:11:47 321

原创 音视频:10.Shell脚本-详解Shell脚本基础语法

Shell脚本-详解Shell脚本基础语法1.shell 脚本创建与执行(01.sh)2.自定义变量与环境变量(02.sh)3.位置参数变量与预定义变量3.1.获取位置参数(03.sh)3.2.预定义变量3.3.获取输入的变量(04.sh)4.条件判断(测试指令)(05.sh)5.流程语句 if (06.sh)6.自定义函数(06.sh)7.流程语句 for、while、case (06.sh)8.输出重定向(07.sh)1.shell 脚本创建与执行(01.sh)一般都是**.sh文件#!:需要用

2020-11-12 15:11:06 124

原创 音视频:09.Cmake语法-详解CmakeLists.txt

Cmake语法-详解CmakeLists.txt1.初试 CMake 的 HelloWorld2.构建生成 .so 动态库3.链接外部动态库与头文件4. 根据不同的源文件夹生成不同的 .so 文件5.修改以前 ffmpeg 开发项目中的 CMakeLists.txt1.初试 CMake 的 HelloWorld注意:PROJECT、这些不区分大小写,但是${HELLO_BINARY_DIR}这些,必须大写PROJECT(HELLO):给工程取一个名字SET(SRC_LIST hello.cpp):

2020-11-12 15:10:26 202

原创 音视频:08.Cmake语法-makefile、cmake、shell 自动编译和链接

Cmake语法-makefile、cmake、shell 自动编译和链接1.makefile、cmake 与 shell 之间的联系2.makefile 自动编译和链接2.1 gcc 如何编译相互依赖,却没直接引入的文件2.2 如何编写Makefile文件2.2.1. 一个规则(观看makefile、cmake、shell目录下的m1)2.2.2. 两个函数(观看makefile、cmake、shell目录下的m2)2.2.3. 三个自动变量(观看makefile、cmake、shell目录下的m3)3.[

2020-11-12 15:09:39 270

原创 音视频:07.linux系统-线程和多线程同步

linux系统-线程和多线程同步1.线程的本质2.创建线程3.退出线程4.回收线程5.杀死(取消)线程6.分离线程7.线程同步1.线程的本质线程与进程的区别:线程大家可以简单理解为一个轻量级的进程,线程共享了栈和堆(变量),没有复制 0-3 G 的进程空间,但线程会有自己的工作空间,会有自己的 pcb 块。跟 Java 是类似的。linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时

2020-11-12 15:06:48 101

原创 音视频:06.linux系统-IPC进程间通信

linux系统-IPC进程间通信1.进程间通信的方式2.管道(pipe)3.共享映射区4.信号1.进程间通信的方式文件,管道,信号、信号量,共享映射区(共享内存),消息队列,管道,套接字(socket)着重讲下:管道(使用简单)信号(开销比较小)共享映射区套接字(低速稳定)一般都是通过内核共享空间进行通信2.管道(pipe)无名管道,半双工的通信方式(数据流向固定:只能 a 的数据写给 b ,或者 b 的数据写给 a )管道大家可以简单的理解为一种特殊的文件形式,我们可以用

2020-11-12 15:04:36 192

原创 音视频:05.linux系统-进程创建和进程管理

linux系统-进程创建和进程管理1.pcb(process control block)进程控制块**2.内存映射(重点)****3.fork 创建子进程(重点)****4.父子进程共享(重点)**4.1 父子进程相同:4.2 父子进程不同的:4.3 父子进程共享:5. 进程回收6.监听 APP 应用被卸载1.pcb(process control block)进程控制块结构体的路径:~/usr/src/linux-headers-3.5.0-23/include/linux/sched.h结构体:

2020-11-11 14:16:54 199

原创 音视频:04.linux系统-内核编程,文件IO与文件描述符

linux系统-内核编程,文件IO与文件描述符1. 系统内核调用2.普通函数与内核函数3.普通函数和系统函数拷贝文件的区别4.文件描述符(文件句柄)5.lseek 与 fseek6.stat 和 lstat7.目录操作1. 系统内核调用3-4G 是系统的空间(内核空间),这部分是由操作系统来管理,那么如果我们要操作这部分数据,只能借助系统提供的一些函数(系统函数),用户调用这些函数就称之为系统调用。2.普通函数与内核函数系统函数:open , close , write , readman 2

2020-11-11 14:13:39 117

原创 音视频:03.linux系统-文档编辑、应用编译运行

linux系统-文档编辑、应用编译运行1. vim 工作模式2 vim 命令模式进入输入模式的快捷键2.1.跳转和删除2.2. 复制、粘贴2.3 查找替换2.4.其它命令3. gcc 编译的四个步骤3.1 预处理阶段3.2 预编译阶段3.3 汇编阶段3.4 链接阶段4.动态库和静态库4.1 静态库的生成:4.1.1 将 c 生成 .o4.1.2. 使用 ar 工具制作静态库4.1.3. 编译静态库到可执行文件4.2 动态库生成4.2.1 将 c 生成 .o (要生成与位置无关的代码)4.2.2 使用 gcc

2020-11-11 14:10:36 106

原创 音视频:02.linux系统-常用命令

linux系统-常用命令1. 常用快捷键2. 文件操作2.1 文件基本操作指令2.2 文件类型2.3 文件删除、拷贝、读取等3. 用户与用户组3.1 修改用户文件权限3.1.1. 文字设定法3.1.2. 数字设定法3.2 用户和用户组的创建、修改、删除4.搜索查找4.1 find 查找文件4.2 grep 查找内容5.软件安装5.1 命令行安装5.2 压缩包安装5.3 源码安装6.压缩和解压缩6.1 tar6.2 rar和zip1. 常用快捷键table 补齐ctrl + a : 光标移动到最前c

2020-11-11 14:08:09 128

原创 音视频:01.音视频技术-启动篇

音视频技术学习-启动篇1. 音视频学习2. 音视频编解码3. FFmpeg1. 音视频学习视音频播放器(华为视频,腾讯视频,喜马拉雅,QQ音乐)短视频(抖音,小火山,微视)视音频的直播(有信,QQ音乐的电台,视频直播)+ OpengGl雷霄骅Android + NDK  FFmpeg + SurfaceView + AudioTrack2. 音视频编解码先来看下视频的播放流程:RGB:8字节,24字节,32字节(RGBA)YUV:Y黑白电视,亮度;U 色度,V 饱和度 , YU

2020-11-11 14:01:54 380 1

原创 OpenCV:23.实时人脸检测和识别

实时人脸检测和识别1. 训练人脸样本2. 识别人脸具体代码请看:NDKPractice项目的opencv711. 训练人脸样本三种训练方法:eigenFace 算法 : EigenFaceRecognizerFisherFace 算法:FisherFaceRecognizerLBPH 算法:LBPHFaceRecognizer网站1网站2Java_com_east_opencv71_FaceDetection_trainingPattern(JNIEnv *env, jobject i

2020-11-11 13:55:16 181

原创 OpenCV:22.实时人脸检测

实时人脸检测1. 相机实时人脸检测2. 人脸识别相关: 均值,方差与协方差、特征值与特征向量3.人脸识别相关:PCA 原理与应用 (降维)1. 相机实时人脸检测具体代码请看:NDKPractice项目的opencv70 // @param 1.1 会采用上采样、下采样、缩放比例 // @param 3 会检测多少次才能判断是个人脸 // @param Size(width/4,height/4) 最小的人脸大小 // @param Size(width,height) 最

2020-11-11 13:53:37 176

原创 OpenCV:21.人脸识别 - HOG 和 LBP 特征检测

人脸识别 - HOG 和 LBP 特征检测1. HOG(Histogram of Oriented Gradient) 特征检测的实现原理1.1 检测窗口:2. 实现行人检测3.LBP (Local Binary Patterns)特征介绍4.手写 LBP 特征算法实现5.haar 特征介绍具体代码请看:NDKPractice项目的opencv69人脸检测分为以下几步特征提取:边缘,角点,点,线,平坦区训练样本:正向样,负向样本 (xml文件)特征匹配:DDM , detection (发现)

2020-11-11 13:51:45 588

原创 OpenCV:20.二维码检测

二维码检测1.二维码检测1.二维码检测思路:代码:// 如果是倾斜的 变换菱形 放正Mat wrapTransfrom(const Mat &gray,const RotatedRect &rect){ int width = rect.size.width; int height = rect.size.height; Mat result(Size(width,height),gray.type()); // 矩阵怎么获取 vector<Point>

2020-11-11 13:48:07 186

原创 OpenCV:19.人脸美容效果2-边缘处理

人脸美容效果2-边缘处理1.快速边缘保留算法1.快速边缘保留算法先看两张图:具体代码// 1. 快速边缘保留#include<opencv2/opencv.hpp>#include<iostream>using namespace cv;using namespace std;// 1. 快速边缘保留int getBlockSum(Mat &sum_mat,int x0,int y0,int x1,int y1,int ch){ //

2020-11-11 13:45:56 241

原创 OpenCV:18.人脸美容效果-积分图

人脸美容效果-积分图1. 双边滤波美容2.卷积模糊算法,时间复杂度分析3. 积分图算法介绍4. 使用积分图算法对卷积模糊进行优化5.快速边缘保留算法1. 双边滤波美容int main(){ Mat src = imread("E:/meirong.jpg"); if (!src.data){ cout << "read error" << endl; return -1; } imshow("src",src); Mat dst; bilateralFi

2020-11-05 13:20:46 295

原创 OpenCV:17.手写直方图和直方均衡

手写直方图和直方均衡1.亮度增强(线性方式)2.直方均衡,提升对比度3. 手写直方图计算源码4. 手写直方图均衡1.亮度增强(线性方式)int main(){ Mat src = imread("E:/2_05.jpg"); if (!src.data){ cout << "read error" << endl; return -1; } imshow("src",src); cout << src.channels() << en

2020-11-05 13:18:41 293

原创 OpenCV:16.封装 java 层 sdk 模型

封装 java 层 sdk 模型1. 苏宁体育面试题讲解(一面)2. NDK 学到什么程度3.如何封装 java 层 sdk 模型4.动手封装OpenCV的Mat.java 对象5.NDK异常处理需要注意的地方6.java和C++的回收机制具体代码请看:NDKPractice项目的opencv64小的需求:优化下Bitmap加载图片的源码(严格控制下内存)1. 苏宁体育面试题讲解(一面)HashMap 的实现,如何判断超出了原存储空间,超出了如何扩容,如果存入 key 相同,值如何存入。(之前手写

2020-11-05 13:17:07 301

原创 OpenCV:15.图片的几何变换

图片的几何变换1. 图片旋转2. 矩阵仿射变换3. reSize() 图片缩放4.remap 重映射 (自己实现)具体代码请看:NDKPractice项目的opencv631. 图片旋转Java_com_east_opencv63_OpenCvUtils_rotation(JNIEnv *env, jclass clazz, jobject bitmap) { Mat src; cv_helper::bitmap2mat(env, bitmap, src); int res

2020-11-05 13:16:21 105

原创 OpenCV:14.说说图片效果

说说图片效果1. opencv 的用处2. Bitmap 的解封装与编解码3. 逆世界效果4.浮雕效果5.马赛克6.毛玻璃效果7. 油画特效效果8. 处理速度性能优化具体代码请看:NDKPractice项目的opencv621. opencv 的用处提高图片的视觉,图片变换效果提取图像的特征,用来分析图像识别,直播,人脸,指纹,二维码,汽车牌照识别2. Bitmap 的解封装与编解码你给一个错误地址,或者给一个文本地址,Glide 是如何判断图片格式,是否错误之类的呢?根据流读出来的头

2020-11-05 13:15:38 726

原创 OpenCV:13.轮廓查找、图像矩、多边形测试、图像分水岭

轮廓查找、图像矩、多边形测试、图像分水岭1. 银行卡轮廓查找与绘制2. [图像矩,多边形测试](http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.html#point-polygon-test)3. 图像分水岭1. 银行卡轮廓查找与绘制使用到的api/*参数说明:https://blog.csdn.net/

2020-11-05 13:13:41 210

原创 OpenCV:12.直方图比较和匹配

直方图比较和匹配1. 直方图比较 (compareHist 2组数据去对比)1.1 相关性比较 HISTCMP_CORREL (多少的时候是最好的 1) N bins 直方图的等级1.2 卡方比较 HISTCMP_CHISQR (多少的时候是最好的 0)1.3 十字交叉性 HISTCMP_INTERSECT1.4 巴氏距离 CV_COMP_BHATTACHARYYA (多少的时候是最好的 0)2. 直方图反向投射 (反射投影的次数 (不是像素值))3.[直方图模板匹配](http://ww

2020-11-05 13:12:48 529

原创 OpenCV:11.色彩空间与直方图均衡化

色彩空间与直方图均衡化1. RGB与HSV2.归一化 normalize3.直方图均衡化 equalizeHistogram4.直方图的计算和绘制1. RGB与HSVrgb请看下图:HSV 分析:H : Hue 色相 色调,色度 0~360度 360种S :Saturation 饱和度V :Value 亮度作用:证件照背景替换,扣头发等等2.归一化 normalize归一化:就是把需要处理的数据经过处理后,限制在你需要的一定范围内。例如假设我们把训练数据的第一个属性从[-10,+

2020-11-05 13:10:05 1087

原创 OpenCV:10.霍夫检测(直线、圆检测)与重映射(镜像翻转)

霍夫检测【直线、圆检测】与重映射【镜像翻转】1. 霍夫直线检测2. 霍夫圆检测3.重映射1. 霍夫直线检测作用:检测图片当中点集合中的直线。(比如提取图片中的直线:车道线)先来看下原理图:再来看下opencv中的代码int main(){ Mat src = imread("E:/houghLine.jpg"); if (!src.data){ cout << "read error" << endl; return -1; } imshow("src

2020-11-05 13:08:17 150

原创 OpenCV:09.图片边缘检测

图片边缘检测1. Sobel 算子 检测图片边缘2. Scharr 增强求边缘3. Laplance 图片边缘检测4.Canny 图片边缘检测1. Sobel 算子 检测图片边缘先来看下微积分求导:上代码:int main(){ Mat src = imread("E:/card1.png"); if (!src.data){ cout << "read error" << endl; return -1; } imshow("src", src);

2020-11-05 13:05:53 145

原创 OpenCV:08.边缘类型、自定义线性滤波、阈值

边缘类型、自定义线性滤波、阈值1. 了解下卷积操作2. 处理边缘类型3. 自定义线性滤波与图片模糊(算子也叫作 核)4.阈值(图像二值化)1. 了解下卷积操作概念:把kernel(卷积核)放到我们图像的矩阵之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来计算锚点的像素值覆盖图片下面的像素值,称之为卷积操作。2. 处理边缘类型copyMakeBorder(src,dst,src.rows/8,src.rows/8,src.cols/8,src.cols/8,BORDER_DEFAULT);B

2020-11-04 15:52:01 325

原创 OpenCV:07.形态学,验证码,提取水平线,上、降采样

形态学,验证码,提取水平线,上、降采样1. 形态学操作2. 验证码识别3. 提取水平线4. 上采样与降采样1. 形态学操作morphologyEx腐蚀:erode 取最小值膨胀:dilate 取最大值MORPH_OPEN 开:先腐蚀后膨胀MORPH_CLOSE 闭:先膨胀后腐蚀MORPH_GRADIENT 梯度:膨胀 - 腐蚀MORPH_TOPHAT 顶帽:原图像 - 开图像MORPH_BLACKHAT 黑帽:闭图像 - 原图像int main(){ Mat src = imrea

2020-11-04 15:50:33 209

原创 OpenCV:06.中值滤波、腐蚀、膨胀、实现图片的美容效果-双边滤波

中值滤波、腐蚀、膨胀、实现图片的美容效果-双边滤波1. 中值滤波与双边滤波2. 腐蚀与膨胀1. 中值滤波与双边滤波medianBlur 中值 对所有考虑点进行排序,取中间的那个值(替换到矩阵的中心点) 1,2,“3”,4,5 去掉噪音(很多 黑白点的情况)bilateralFilter 双边 可以用作美容 ,基于高斯,高斯保留的轮廓并不强,双边保留的轮廓信息会增强,基于高斯再增加像素差使用到的 api// @params d : 滤波过程中使用的每个像素邻域的直径。如果它是非正的,它是

2020-11-04 15:48:56 432

原创 Bitmap全面解析

Bitmap全面解析1. dp dip dpi px2. Bitmap 大小计算 看源码3. Bitmap 的内存开辟4. Bitmap 内存的回收4.1 recycle 方法4.2 不手动调用 recycle 方法时Native 层的 Bitmap 是怎么回收5.Bitmap 的内存复用6. xh,xxh,xxxh 放哪个文件夹更高效7.Bitmap 的内存优化与适配8.线上 OOM 的 dump 收集1. dp dip dpi pxdp = dip:Android 为了适配不同的设备弄出来

2020-11-04 15:47:33 1037

原创 OpenCV:05.Bitmap性能优化(LruCache)和高斯模糊

@TOC1. Bitmap 占用内存分析及常见优化分析工具:AS3.0以上使用 Android Profile,以下可以使用 Android Device Monitor优化:耗时操作可以通过 Rxjava 去切换到子线程处理如果涉及到高斯模糊,从网络上下载的大图,根据ui需求,通过 Glide 重新调整其大小(这样减少高斯模糊的计算时间)使用LruCache 缓存,根据不同机型分配 不同的缓存 大小1.1 Lrucache 两个点记录记得重写 Lrucache 的 sizeOf(K

2020-11-04 15:44:54 228

Pap.er-2.3.1.dmg

mac上最好用的壁纸推荐程序,让你每天都能显示不一样的壁纸体验,而且都是超高清,4k的壁纸完全满足mac的2k的屏幕

2020-02-06

StarUML-3.2.2.dmg

Mac上最好用的UML建模工具,用于敏捷和简洁建模的复杂软件建模器,快速建模 支持快速编辑中的许多速记,以立即创建元素和关系,例如子类,支持界面等。

2020-02-06

Genymotion_ARM_Translation.zip

自己搜集的各版本Genymotion_ARM_Translation(4.4、 5.1 、6.0),帮助移动开发人员使用最好的模拟器

2018-09-14

SQLyog企业版,附带注册码

SQLyog企业版,带注册码,让你别用付费,使用免费数据库

2018-01-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除