- 博客(162)
- 资源 (17)
- 问答 (1)
- 收藏
- 关注
原创 测试驱动开发(TDD)实践与技巧
引言测试驱动开发,英文全称 Test-Driven Development,简称 TDD,是一种不同于传统软件开发流程的开发方法。在《程序员的职业素养》第五章,我第一次看到有关 TDD 内容,当时Bob大叔向我展示了一种不可思议的编程开发方法,这种方法颠覆了我的认知。Bob 大叔列举了 TDD 很多好处,例如确定性、降低代码缺陷、方便代码重构、测试单元文档化,更优秀的代码设计等等。并强力安利读者们尝试 TDD,因为 TDD 是专业人士的选择。在 Bob 大叔的洗脑下,我决定去尝试学习如何使用 TDD。
2021-06-11 09:34:47 10501 3
原创 Android MediaCodec 简明教程(六):使用 EGL 和 OpenGL 绘制图像到 Surface 上,并通过 MediaCodec 编码 Surface 数据,并保存到 MP4 文件
本博客介绍了使用Surface进行高效的MediaCodec视频编码技术。与ByteBuffer编码相比,Surface编码能更好地利用硬件加速,提升性能。文章首先概述了Surface编码流程,即通过MediaCodec提供的Surface绘制图像,然后编码器提取像素信息进行编码。接着,文章详细说明了使用Canvas在Surface上绘制图像的基本方法,包括创建编码器、获取Surface,并在一个循环中提交图像数据给MediaCodec。此外,还探讨了结合EGL和OpenGL进行高效图像渲染的高级方法,这种
2024-03-18 10:39:24 1059
原创 Android MediaCodec 简明教程(五):使用 MediaCodec 编码 ByteBuffer 数据,并保存为 MP4 文件
前面我们了解了 MediaCodec 解码的具体使用流程,包括异步和同步模式、解码到 ByteBuffers 或者 Surface。本章开始,我们将开始学习如何使用 MediaCodec 进行编码。与解码类似,MediaCodec 编码的输入支持 ByteBuffer 或者 Surface。遵循循序渐进的原则,我们从最简单的一种情况开始讲起:MediaCodec 编码过程中,输入的图像数据存放在 ByteBuffer 中。
2024-03-04 16:37:10 1276
原创 盲水印、暗水印(Blind Watermark)算法简明教程:算法原理、流程以及基于C/C++ 的代码实现
盲水印(blind watermark)算法是一种将数字水印嵌入到数字媒体中的技术,而不需要原始媒体文件。与传统的数字水印技术不同,盲水印算法不需要原始媒体文件来提取数字水印,因此更加安全和隐私保护。盲水印算法的基本原理是将数字水印嵌入到数字媒体的频域或空域中,使得数字水印能够在不影响原始媒体质量的情况下被提取出来。盲水印算法通常包括两个主要步骤:嵌入和提取。在嵌入阶段,数字水印被嵌入到数字媒体中。这通常涉及到将数字水印转换为频域或空域信号,并将其嵌入到数字媒体中。
2024-02-21 18:16:26 1757
原创 Android MediaCodec 简明教程(四):使用 MediaCodec 将视频解码到 Surface,并使用 SurfaceView 播放视频
在上一个教程Android MediaCodec 简明教程(三)中,我们学会了使用 MediaCodec 解码到 ByteBuffers 上,包括同步模式和异步模式。本章将讨论 MediaCodec 解码到 Surface 的相关知识点。Google 推荐使用 Surface 进行编解码操作,这样效率更高。
2024-01-29 16:48:37 1528
原创 C/C++ 静态代码检测工具 Clang-tidy 简易教程:安装、使用、配合 cmake 使用、加入 CI/CD 流程等
最近尝试将 Clang-tidy 加入到项目中,以便加强代码规范。本文纪录在这一过程中积累的关于 Clang-tidy 的知识,涵盖安装、使用、cmake 和 CI/CD 实践等内容。
2024-01-24 14:58:52 2366
原创 Android MediaCodec教程(三):详解如何在同步与异步模式下,使用MediaCodec将视频解码到ByteBuffers,并在ImageView上展示
在前两章中,我们已经对如何查询 Codec 和 Codec 的支持特性有了深入的理解,这是通过学习 MediaCodecList 和 MediaCodecInfo.CodecCapabilities 实现的。在确认设备的 Codec 支持特定视频后,我们可以创建相应的 MediaCodec 进行视频解码。本章,我们将探讨如何使用 MediaCodec 进行视频解码。MediaCodec 支持同步和异步两种模式,同时也支持使用 Surface 或 ByteBuffers 进行数据处理。
2024-01-19 10:32:22 1279
原创 Android MediaCodec 简明教程(二):使用 MediaCodecInfo.CodecCapabilities 查询 Codec 支持的宽高,颜色空间等能力
在上一章Android MediaCodec 简明教程(一)我们学习了如何使用 MediaCodecList 查询本机支持的 Codec 信息。= NULL) {本章将介绍类,它是 Android 音视频任务中非常有用的工具类。通过该类,我们可以查询 codec 的能力,包括支持的宽高、颜色空间、Profile 等信息。这些信息对于选择合适的 Codec 来解码或编码视频文件非常重要,也可以帮助我们发现某些特殊格式 Android 机器无法支持的情况,从而采用其他方案,如 FFmpeg 等。
2024-01-12 14:17:43 1116
原创 Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器
最近在学习 Android MediaCodec 相关的知识,准备开个新坑把学习过程记录下来,总结成 MediaCodec 教程。在介绍 MediaCodec 编解码之前,让我们学习一些其他与之配套的组件,今天要讲的是。提示:以下是本篇文章正文内容,下面案例可供参考本文介绍了 MediaCodecList 的基本使用方法,并展示了如何使用 MediaCodecList 来创建 MediaCodec 编解码器。
2024-01-08 10:10:48 1576
原创 在 Android 上使用 MediaExtractor 和 MediaMuxer 提取视频\提取音频\转封装\添加音频等操作
之前我们介绍了 FFmpeg 并利用它解封装、编解码的能力完成了一款简易的视频播放器。额外的 so 文件。你需要将多个 so 文件集成至你的 app 中,使得 app 整体体积增加。额外的复杂性。这里的复杂性包括多个方面:集成的复杂性。为了引入 ffmpeg,你在编译脚本需要额外对这些库进行维护;此外,通常你不需要 FFmpeg 的全部能力,因此在编译 FFmpeg 库时你需要对其进行裁剪,这部分也需要额外的付出。编程的复杂性。
2024-01-02 17:34:48 1616 1
原创 基于 FFmpeg 的跨平台视频播放器简明教程(十二):Android SurfaceView 显示图片和播放视频
上一章中我们介绍了一个简易的播放器架构,对之前零碎的代码片段进行了组织和重构,形成了较为灵活的一种架构设计,它非常简单,但足够满足我们的需求。现在,接着我们在 Android 上的旅程。今天我们来讨论如何在 Android 上显示画面。Android 原生的 Java/Kotlin 接口播放视频还是很容易的,有 MediaController、MediaPlayer 等类可以直接使用,相关教程参考Android实现视频播放的3种实现方式。
2023-12-22 15:46:47 536
原创 基于 FFmpeg 的跨平台视频播放器简明教程(十一):一种简易播放器的架构介绍
视频解码音频解码视频画面输出音频播放图像格式转换音频重采样音画同步经过前九章的学习,我们已经对以上模块有了深入的理解和实践。然而,目前的代码实现较为零散,缺乏统一的组织和抽象。接下来,我们将进入移动端播放器的设计与开发阶段。为了能够最大限度地复用现有的模块和代码,我们需要对现有的代码进行整理和优化,形成一种有效的架构。本文将介绍一种简单但实用的架构,它能够满足我们的需求。这种架构虽然简单,但是能够满足我们的需求。Decoder,负责解码音视频数据。
2023-11-20 09:57:16 351
原创 基于 FFmpeg 的跨平台视频播放器简明教程(十):在 Android 运行 FFmpeg
在前九章的学习中,我们已经成功地实现了一个基础的播放器,它拥有视频播放、音画同步、快进/快退等基本功能。当然,这个简易的示例还有许多可以优化的地方,比如添加更美观的用户界面,或者增加字幕功能等。然而,这并不是本教程的主要关注点。本系列文章更关注于跨平台播放器框架的构建,特别是在移动端。因此,从本章开始,我们将把重点转向 Android 端播放器的开发。前置知识包括一些 Android 的基本开发,以及 JNI 开发等。这些前置知识默认你有所了解,本文不会涉及。关于 JNI 可以参考笔者之前写的。
2023-10-26 21:56:45 680
原创 基于 FFmpeg 的跨平台视频播放器简明教程(九):Seek 策略
经过前面八章的学习与代码实现,我们的播放器已经能够正常播放视频了,接下来我们将加入最常用的 seek 能力,让你能够快进/快退。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在和。本文介绍了播放器中如何实现快进、快退功能,并给出了具体的实现代码,还讨论了如何实现精准 seek 逻辑,并在最后给出了一些优化的思路。本文的代码在和。
2023-10-20 10:27:53 698
原创 基于 FFmpeg 的跨平台视频播放器简明教程(八):音画同步
本文介绍了如何实现播放器的音画同步,首先介绍了 I/P/B 帧的区别,引出了 PTS 和 DTS 的概念;接着,介绍了在 FFmpeg 中的 timebase 的概念,让读者了解 FFmpeg 是如何描述时间的;然后,我们详细的描述了音画同步实施的具体要点,包括如何精确的纪录不同流的当前时间,在什么时间节点来更新时钟,以及音画同步的具体算法。
2023-08-09 21:23:08 1216
原创 基于 FFmpeg 的跨平台视频播放器简明教程(七):使用多线程解码视频和音频
在上篇文章中基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频,我们能够同时播放画面和音频。其中 SDL 启动了一个音频线程,每次需要音频数据时都会回调到我们定义的函数。现在,我们需要对视频显示做同样的事情。这么做能让我们的代码更加模块化,更容易使用。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在。
2023-07-28 21:29:51 1032
原创 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频
在上篇文章基于 FFmpeg 的跨平台视频播放器简明教程(五):使用 SDL 播放视频中,我们使用 FFmpeg + SDL 来播放视频画面,但仅仅只是画面。今天,我们将讨论如何使用 FFmpeg + SDL 同时播放画面和声音。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在。
2023-07-10 21:21:00 844
原创 基于 FFmpeg 的跨平台视频播放器简明教程(五):使用 SDL 播放视频
经过前面四章的学习,现在我们已经掌握了如何使用 FFmpeg 进行视频解码,中间穿插了很多音视频相关的知识点,例如容器、编解码器、解封装、像素格式、格式转换等等。现在回看,音视频的入门门槛还是比较高的,一个最简单的任务就已经涉及到大量的知识点。但问题不大,本人希望通过一系列的文章来带你入门,通过完成一个播放器项目来不断地学习音视频内容。,用于解封装相关的任务,用于解码相关的任务,用于 AVFrame 格式转换这些类的使用方式,你可以在单元测试中找到示例,此处不再赘述。资源管理。
2023-07-04 21:36:31 1038
原创 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换
经过前面三章的学习,我们快要完成我们的目标任务了:使用 ffmpeg 解码视频,并将解码后的视频帧保存在本地(就像对视频截图一样)。现在就差临门一脚,如何将解码后的视频帧保存到本地呢?这是今天要讨论的内容。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在。本文讲述了如何将一帧视频保存到本地 PPM 文件,以便浏览。
2023-06-29 18:03:55 1167
原创 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码
在前面章节基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)中我们引入了视频编解码的基础知识以及解封装的概念。请记住我们的任务:使用 ffmpeg 解码视频,并将解码后的视频帧保存在本地(就像对视频截图一样)。今天,围绕这个任务让我们继续下一个知识点:视频解码。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。
2023-06-10 15:35:27 1817
原创 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)
前面一章中我们介绍了如何使用 conan 和 cmake 搭建 ffmpeg 运行环境,你做的还顺利吗?如果遇到任何问题,请在进行评论,我看到都会回复的。从本章开始,将正式开始我们的 ffmpeg 播放器学习之旅。接下去的任务是:使用 ffmpeg 解码视频,并将解码后的视频帧保存在本地(就像对视频截图一样)。其中涉及到两个重要的知识点:解封装和视频解码。今天我们先聊解封装。此外,还会扩展 ffmpeg api 以及编解码相关的知识。本文参考文章来自。
2023-06-06 20:58:35 1118
原创 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFmpeg + Conan 环境集成
FFmpeg是一个极为著名的开源框架,几乎是所有从事音视频领域的人必备的工具,可以说没有比它更重要的了。然而,在网络上关于FFmpeg的教程中,我发现对于新手来说,这些教程或多或少都不太友好,存在以下问题:过于偏向API讲解:这些教程主要关注FFmpeg的API使用,而对于新手来说,这部分知识可能过于超前,难以理解。API接口过时:当前FFmpeg已经发布了6.0版本,但很多教程仍然在使用3.x版本的API,其中许多接口已经被弃用。然而,教程中的示例代码并未进行更新,给新手带来了困惑。
2023-05-30 21:21:58 1503
原创 MLT 视频编辑框架简介(三):使用与示例
在MLT 视频编辑框架简介(二):框架设计简述我们总结了 mlt 中各模块的使用方式,我们先回顾下上期的内容:Producer:Producer 是数据的来源,它负责从各种来源(如文件、网络流、生成器等)读取音视频数据。Producer 是一个基本的组件,它生成帧并将它们传递给其他组件进行处理。Filter:Filter 是对输入帧执行某种操作的组件。这些操作可以包括更改颜色、添加特效、调整音量等。
2023-04-25 10:18:31 1319 1
原创 MLT 视频编辑框架简介(二):框架设计简述
作者在中阐述了 MTL 框架的设计思想。本文对这篇文档进行总结和梳理,选择重点内容进行详细说明。MTL 是一个用 C 写的库(它其实也提供了 C++ 接口),它采用 Producer/Consumer 设计模式进行开发。在 MTL 中最常见的「图结构」是 Producer 连接另一个 Consumer。Consumer 从 Producer 中请求一个 MLT frame,然后消费这个 MLT frame,最后释放 MLT frame。
2023-04-19 17:05:42 916
原创 MLT 视频编辑框架简介(一)编译与 demo 运行
MLT(MLT Multimedia Framework)是一个开源的多媒体编辑框架。它是这么介绍自己的:非线性视频编辑器的引擎,可用于各种应用程序,而不仅仅是桌面视频编辑器。MLT是一个开源的多媒体框架,为电视广播设计和开发。它为广播公司、视频编辑、媒体播放器、转码器、网络流媒体和许多其他类型的应用程序提供了一个工具包。该系统的功能是通过各种即用工具、XML创作组件和可扩展的基于插件的API提供的。MLT 是一个纯 C 写的库,但它有一颗面向对象的心,使用基于 C 的面向对象开发范式。
2023-03-14 18:19:40 1416
原创 SDL2 简明教程(五):OpenGL 绘制
接下来进行代码示例说明,下面的示例中使用 OpenGL 绘制了一个 三角形。关于 OpenGL 如何使用请参考。
2023-02-23 14:21:45 1934
原创 LearnOpenGL - Android OpenGL ES 3.0 绘制三角形
经过一段时间 OpenGL 的学习,我们已经掌握了如何使用 glwf 在桌面端绘制简单图形。现在让我们把目光投向移动端,看看如何在 Android 上使用 OpenGL 绘制图形。本文假设你对 Android 基础有所了解,并使用 Kotlin 编写示例 demo,项目的代码你可以在中找到。本文参考了以下资料Android OpenGL开发——图像绘制详解android平台下OpenGL ES 3.0实例详解顶点缓冲区对象(VBO)和顶点数组对象(VAO)
2023-02-21 10:49:19 1251
原创 OpenGL - 如何理解 VAO 与 VBO 之间的关系
在上一章LearnOpenGL 笔记 - 入门 04 你好,三角形中引入了很多很多概念,VBO、VAO、EBO、Shader 等等。密集的知识点向你轰炸而来,让这一章的难度陡然上升。说实话,这一章相当的劝退我。我心中有太多的困惑没有得到解答,文章虽然对 VBO、VAO 等做了解释,但其解释没有能让我这个入门者理解。以至于让阅读者相当的挫败。今天我尝试将本章概念「幼儿园」化,站在入门菜鸟的角度,以伪代码的形式来理解 VAO、VBO 等概念。
2023-02-17 21:33:18 1277
原创 LearnOpenGL 笔记 - 入门 04 你好,三角形
你好,三角形本文难度较大,学习曲线突然陡峭了起来。但没有关系,我将以一个初学者的视角来讲述自己的理解,帮助你学习 VAO、VBO、EBO、Shader 等概念。首先,仍然先以知识点列表的形式总结全文。
2023-02-10 09:14:35 456
原创 LearnOpenGL 笔记 - 入门 03 你好,窗口
初始化 glfw创建窗口和 OpenGL Context,并设置当前线程的 Context初始化 GLAD在渲染循环(Render Loop)进行图形渲染结束时,释放所有资源。
2023-02-09 17:42:27 303
原创 LearnOpenGL 笔记 - 入门 02 创建窗口
在这里,我要介绍一种更加便捷的方式:使用 conan 和 cmake 搭建 glfw 环境。是 C/C++ 包管理工具,它可以加快 C/C++ 工程的开发以及持续集成,配合 cmake 简直神器。5. 接着看 CMakeLists.txt,将 conanbuildinfo.cmake 文件引入 CMakeLists.txt 中,并调用。引入 conan 依赖库,conan 将所有依赖库变量都放在了。依赖库,conan 去下载相关平台的库或者代码;仓库中找到,如果有步骤不清楚,请直接看源码。
2023-02-09 17:07:04 372
原创 LearnOpenGL 笔记 - 入门 01 OpenGL
最近需要学习一些 OpenGL 的知识,以便更好的开展工作。此系列文章将纪录学习 OpenGL 过程中产生的笔记。经过一番搜索,网上有非常多 OpenGL 的教程,最终决定按照它有配套的代码,并且代码更新活跃。它有中文翻译。这一点可以提高学习的效率。它几乎涵盖了 OpenGL 所有的知识点,是一个完整的教程。废话不多说,开始第一部分的内容,关于 OpenGL 的介绍。
2023-02-07 21:35:06 1012
原创 YUV 文件读取、显示、缩放、裁剪等操作教程
本文代码你可以在项目中找到,simple_yuv_viewer 是一个基于 Dear ImGUI 和 SDL 的 YUV 文件显示工具,向你展示了如何去读取 YUV 文件,如何使用 SDL 显示它,以及如何使用 libyuv 来对 YUV 进行缩放、裁剪等操作。本文首先介绍了 Chroma subsampling 的概念,接着针对不同的 YUV 格式给出了导入 YUV 文件的正确姿势。
2023-01-12 19:09:05 1585 1
原创 NEON Intrinsics 练习题
关于 SIMD,或者说 NEON,我已经发布了几篇文章来介绍它了,如果你看过了这些内容,相信你对于 NEON 有了一定的了解。在此之前,我们更多停留在理论阶段:介绍了 NEON 的 API,举了几个简单的例子。今天,我们将通过一些练习,这些任务在实际开发中你也可能会遇到,它们足够简单,作为 NEON 入门教学示例非常合适。我们将向你演示,如何使用 NEON 来优化现有代码,以及通过 Benchmark 来测试优化前与优化后的性能差异。
2022-12-14 10:49:25 473
原创 用 NEON 实现高效的 FIR 滤波器
本文多数内容翻译自 Efficient FIR Filter Implementation with SIMD。原文在 SIMD 代码实现中使用到了 AVX,本文将使用 NEON 实现,关于 NEON 如何使用,请参考 Neon intrinsics 简明教程。如何让你的 FIR 滤波器在时域中更快的运行?FIR 滤波器是数字信号处理中的基石。它在将混响应用于音频信号时尤其重要,例如在虚拟现实音频或数字音频工作站的VST插件中。它还被广泛用于移动电话(甚至是前智能手机!)和嵌入式设备的声音应用。如何让 FI
2022-12-04 21:23:58 596
原创 【音频处理】Loudness Normalization 响度均衡算法简介
关于响度的概念,以及响度标准化 EBU R.128 的讨论,网上已经有很多优秀的博客了,我就不再赘述了。音频 响度标准化 EBU R.128关于响度的拾遗看完这些介绍,你对响度或多或少已经有了些概念,它是对声音强度的一种描述,它是一种「主观」的心理量,影响因素包括很多,例如信号持续时长、频率特征、声场特性等等。为了测量出音频的响度,有很多组织提出了不同的标准,今天我们要介绍的是由 EBU(European Broadcasting Union,欧洲广播联盟)提出的 EBU-R128 标准。
2022-12-02 22:36:47 4549
原创 Neon intrinsics 简明教程
本文旨在向 NEON 新手提供入门指导,以便能够快速入门 NEON。NEON 作为一种底层的技术,学习曲线相当陡峭,本教程将扫平你在入门期间的各类疑问,并结合大量习题让你能够真正的入门 NEON。本文介绍 NEON intrinsics 的基本使用概念和基本使用方式,并且列举了海量的 NEON 函数的使用示例,旨在帮助入门 NEON 不再困难。后面还将列举一些 NEON 指令的实际使用例子,帮助大家理解 NEON 在实际应用场景中是如何被使用的。
2022-11-24 21:54:58 2127 1
原创 数字信号处理中的 SIMD
图像或声音的数字信号处理需要对大量的数据进行复杂的操作。例如,为了缩放(改变音量)一秒钟的音频数据,我们可能要进行44100次乘法运算。如果我们实时地进行操作,且整个渲染过程在 10ms 内完成操作,事情就变得更加困难了。值得庆幸的是,有一些编程工具可以让我们更高效地处理这些情况,其中之一就是本文的主题 — SIMD在这篇文章中,我们讨论了 SIMD 指令在数字信号处理中的用处。SIMD指令让我们使用专用的处理器寄存器同时对一个以上的变量进行操作。不同的处理器架构和型号有不同的SIMD指令可用。
2022-11-07 19:26:35 1043
原创 【音频处理】Channel Vocoder 算法简介
本文介绍了 Channel vocoder,它是一种非常神奇的音效,可以用来实现经典的机器人音效。Channel vocoder 可以使用时域和频域两种实现方法。时域方法中,它被看出是一种 filter-band 模型,通过 band-pass filter 过滤出特定频段的信号,然后将 modulator 中的包络信息附加到 carrier 中来实现;
2022-10-28 11:11:17 1231
原创 【音频处理】Fast Convolution 快速卷积算法简介
这篇文章中我们介绍了卷积在信号系统中的重要意义,卷积算法复杂度为 O(N^2),为了加速卷积计算,人们提出了快速卷积算法,本文介绍了 FFT 卷积,Overlap-Add 和 Overlap-Save 块卷积,以及均匀分割卷积算法。算法的相关实现都在,包括 python 版本和 C++ 版本。......
2022-08-18 07:37:17 5123
CVC-ClinicSpec
2020-12-07
Introduction of RBF
2018-11-06
Zint 开发手册 Zint 开发手册
2018-08-14
AGCWD Code
2017-11-29
CVPR12_SAS_code
2017-04-08
rtaudio学习Demo
2015-09-08
对录音进行变速和变调处理
2015-08-21
用mfc做桌面图标小广告
2016-03-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人