- 博客(188)
- 资源 (17)
- 问答 (1)
- 收藏
- 关注
原创 基于 FFmpeg 的跨平台视频播放器简明教程(八):音画同步
本文介绍了如何实现播放器的音画同步,首先介绍了 I/P/B 帧的区别,引出了 PTS 和 DTS 的概念;接着,介绍了在 FFmpeg 中的 timebase 的概念,让读者了解 FFmpeg 是如何描述时间的;然后,我们详细的描述了音画同步实施的具体要点,包括如何精确的纪录不同流的当前时间,在什么时间节点来更新时钟,以及音画同步的具体算法。
2023-08-09 21:23:08
2337
1
原创 基于 FFmpeg 的跨平台视频播放器简明教程(七):使用多线程解码视频和音频
在上篇文章中基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频,我们能够同时播放画面和音频。其中 SDL 启动了一个音频线程,每次需要音频数据时都会回调到我们定义的函数。现在,我们需要对视频显示做同样的事情。这么做能让我们的代码更加模块化,更容易使用。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在。
2023-07-28 21:29:51
1817
原创 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频
在上篇文章基于 FFmpeg 的跨平台视频播放器简明教程(五):使用 SDL 播放视频中,我们使用 FFmpeg + SDL 来播放视频画面,但仅仅只是画面。今天,我们将讨论如何使用 FFmpeg + SDL 同时播放画面和声音。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在。
2023-07-10 21:21:00
2209
1
原创 基于 FFmpeg 的跨平台视频播放器简明教程(五):使用 SDL 播放视频
经过前面四章的学习,现在我们已经掌握了如何使用 FFmpeg 进行视频解码,中间穿插了很多音视频相关的知识点,例如容器、编解码器、解封装、像素格式、格式转换等等。现在回看,音视频的入门门槛还是比较高的,一个最简单的任务就已经涉及到大量的知识点。但问题不大,本人希望通过一系列的文章来带你入门,通过完成一个播放器项目来不断地学习音视频内容。,用于解封装相关的任务,用于解码相关的任务,用于 AVFrame 格式转换这些类的使用方式,你可以在单元测试中找到示例,此处不再赘述。资源管理。
2023-07-04 21:36:31
2174
1
原创 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换
经过前面三章的学习,我们快要完成我们的目标任务了:使用 ffmpeg 解码视频,并将解码后的视频帧保存在本地(就像对视频截图一样)。现在就差临门一脚,如何将解码后的视频帧保存到本地呢?这是今天要讨论的内容。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。本文的代码在。本文讲述了如何将一帧视频保存到本地 PPM 文件,以便浏览。
2023-06-29 18:03:55
2036
1
原创 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码
在前面章节基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)中我们引入了视频编解码的基础知识以及解封装的概念。请记住我们的任务:使用 ffmpeg 解码视频,并将解码后的视频帧保存在本地(就像对视频截图一样)。今天,围绕这个任务让我们继续下一个知识点:视频解码。本文参考文章来自。这个系列对新手较为友好,但 2015 后就不再更新了,以至于文章中的 ffmpeg api 已经被弃用了。幸运的是,有人对该教程的代码进行重写,使用了较新的 api,你可以在找到这些代码。
2023-06-10 15:35:27
2602
原创 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)
前面一章中我们介绍了如何使用 conan 和 cmake 搭建 ffmpeg 运行环境,你做的还顺利吗?如果遇到任何问题,请在进行评论,我看到都会回复的。从本章开始,将正式开始我们的 ffmpeg 播放器学习之旅。接下去的任务是:使用 ffmpeg 解码视频,并将解码后的视频帧保存在本地(就像对视频截图一样)。其中涉及到两个重要的知识点:解封装和视频解码。今天我们先聊解封装。此外,还会扩展 ffmpeg api 以及编解码相关的知识。本文参考文章来自。
2023-06-06 20:58:35
2320
1
原创 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFmpeg + Conan 环境集成
FFmpeg是一个极为著名的开源框架,几乎是所有从事音视频领域的人必备的工具,可以说没有比它更重要的了。然而,在网络上关于FFmpeg的教程中,我发现对于新手来说,这些教程或多或少都不太友好,存在以下问题:过于偏向API讲解:这些教程主要关注FFmpeg的API使用,而对于新手来说,这部分知识可能过于超前,难以理解。API接口过时:当前FFmpeg已经发布了6.0版本,但很多教程仍然在使用3.x版本的API,其中许多接口已经被弃用。然而,教程中的示例代码并未进行更新,给新手带来了困惑。
2023-05-30 21:21:58
3021
5
原创 MLT 视频编辑框架简介(三):使用与示例
在MLT 视频编辑框架简介(二):框架设计简述我们总结了 mlt 中各模块的使用方式,我们先回顾下上期的内容:Producer:Producer 是数据的来源,它负责从各种来源(如文件、网络流、生成器等)读取音视频数据。Producer 是一个基本的组件,它生成帧并将它们传递给其他组件进行处理。Filter:Filter 是对输入帧执行某种操作的组件。这些操作可以包括更改颜色、添加特效、调整音量等。
2023-04-25 10:18:31
2940
3
原创 MLT 视频编辑框架简介(二):框架设计简述
作者在中阐述了 MTL 框架的设计思想。本文对这篇文档进行总结和梳理,选择重点内容进行详细说明。MTL 是一个用 C 写的库(它其实也提供了 C++ 接口),它采用 Producer/Consumer 设计模式进行开发。在 MTL 中最常见的「图结构」是 Producer 连接另一个 Consumer。Consumer 从 Producer 中请求一个 MLT frame,然后消费这个 MLT frame,最后释放 MLT frame。
2023-04-19 17:05:42
1908
原创 MLT 视频编辑框架简介(一)编译与 demo 运行
MLT(MLT Multimedia Framework)是一个开源的多媒体编辑框架。它是这么介绍自己的:非线性视频编辑器的引擎,可用于各种应用程序,而不仅仅是桌面视频编辑器。MLT是一个开源的多媒体框架,为电视广播设计和开发。它为广播公司、视频编辑、媒体播放器、转码器、网络流媒体和许多其他类型的应用程序提供了一个工具包。该系统的功能是通过各种即用工具、XML创作组件和可扩展的基于插件的API提供的。MLT 是一个纯 C 写的库,但它有一颗面向对象的心,使用基于 C 的面向对象开发范式。
2023-03-14 18:19:40
2712
1
原创 SDL2 简明教程(五):OpenGL 绘制
接下来进行代码示例说明,下面的示例中使用 OpenGL 绘制了一个 三角形。关于 OpenGL 如何使用请参考。
2023-02-23 14:21:45
3771
原创 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
1999
原创 OpenGL - 如何理解 VAO 与 VBO 之间的关系
在上一章LearnOpenGL 笔记 - 入门 04 你好,三角形中引入了很多很多概念,VBO、VAO、EBO、Shader 等等。密集的知识点向你轰炸而来,让这一章的难度陡然上升。说实话,这一章相当的劝退我。我心中有太多的困惑没有得到解答,文章虽然对 VBO、VAO 等做了解释,但其解释没有能让我这个入门者理解。以至于让阅读者相当的挫败。今天我尝试将本章概念「幼儿园」化,站在入门菜鸟的角度,以伪代码的形式来理解 VAO、VBO 等概念。
2023-02-17 21:33:18
1805
原创 LearnOpenGL 笔记 - 入门 04 你好,三角形
你好,三角形本文难度较大,学习曲线突然陡峭了起来。但没有关系,我将以一个初学者的视角来讲述自己的理解,帮助你学习 VAO、VBO、EBO、Shader 等概念。首先,仍然先以知识点列表的形式总结全文。
2023-02-10 09:14:35
722
原创 LearnOpenGL 笔记 - 入门 03 你好,窗口
初始化 glfw创建窗口和 OpenGL Context,并设置当前线程的 Context初始化 GLAD在渲染循环(Render Loop)进行图形渲染结束时,释放所有资源。
2023-02-09 17:42:27
499
原创 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
620
原创 LearnOpenGL 笔记 - 入门 01 OpenGL
最近需要学习一些 OpenGL 的知识,以便更好的开展工作。此系列文章将纪录学习 OpenGL 过程中产生的笔记。经过一番搜索,网上有非常多 OpenGL 的教程,最终决定按照它有配套的代码,并且代码更新活跃。它有中文翻译。这一点可以提高学习的效率。它几乎涵盖了 OpenGL 所有的知识点,是一个完整的教程。废话不多说,开始第一部分的内容,关于 OpenGL 的介绍。
2023-02-07 21:35:06
1599
原创 YUV 文件读取、显示、缩放、裁剪等操作教程
本文代码你可以在项目中找到,simple_yuv_viewer 是一个基于 Dear ImGUI 和 SDL 的 YUV 文件显示工具,向你展示了如何去读取 YUV 文件,如何使用 SDL 显示它,以及如何使用 libyuv 来对 YUV 进行缩放、裁剪等操作。本文首先介绍了 Chroma subsampling 的概念,接着针对不同的 YUV 格式给出了导入 YUV 文件的正确姿势。
2023-01-12 19:09:05
4283
1
原创 NEON Intrinsics 练习题
关于 SIMD,或者说 NEON,我已经发布了几篇文章来介绍它了,如果你看过了这些内容,相信你对于 NEON 有了一定的了解。在此之前,我们更多停留在理论阶段:介绍了 NEON 的 API,举了几个简单的例子。今天,我们将通过一些练习,这些任务在实际开发中你也可能会遇到,它们足够简单,作为 NEON 入门教学示例非常合适。我们将向你演示,如何使用 NEON 来优化现有代码,以及通过 Benchmark 来测试优化前与优化后的性能差异。
2022-12-14 10:49:25
633
原创 用 NEON 实现高效的 FIR 滤波器
本文多数内容翻译自 Efficient FIR Filter Implementation with SIMD。原文在 SIMD 代码实现中使用到了 AVX,本文将使用 NEON 实现,关于 NEON 如何使用,请参考 Neon intrinsics 简明教程。如何让你的 FIR 滤波器在时域中更快的运行?FIR 滤波器是数字信号处理中的基石。它在将混响应用于音频信号时尤其重要,例如在虚拟现实音频或数字音频工作站的VST插件中。它还被广泛用于移动电话(甚至是前智能手机!)和嵌入式设备的声音应用。如何让 FI
2022-12-04 21:23:58
1090
原创 【音频处理】Loudness Normalization 响度均衡算法简介
关于响度的概念,以及响度标准化 EBU R.128 的讨论,网上已经有很多优秀的博客了,我就不再赘述了。音频 响度标准化 EBU R.128关于响度的拾遗看完这些介绍,你对响度或多或少已经有了些概念,它是对声音强度的一种描述,它是一种「主观」的心理量,影响因素包括很多,例如信号持续时长、频率特征、声场特性等等。为了测量出音频的响度,有很多组织提出了不同的标准,今天我们要介绍的是由 EBU(European Broadcasting Union,欧洲广播联盟)提出的 EBU-R128 标准。
2022-12-02 22:36:47
8277
原创 Neon intrinsics 简明教程
本文旨在向 NEON 新手提供入门指导,以便能够快速入门 NEON。NEON 作为一种底层的技术,学习曲线相当陡峭,本教程将扫平你在入门期间的各类疑问,并结合大量习题让你能够真正的入门 NEON。本文介绍 NEON intrinsics 的基本使用概念和基本使用方式,并且列举了海量的 NEON 函数的使用示例,旨在帮助入门 NEON 不再困难。后面还将列举一些 NEON 指令的实际使用例子,帮助大家理解 NEON 在实际应用场景中是如何被使用的。
2022-11-24 21:54:58
4227
1
原创 数字信号处理中的 SIMD
图像或声音的数字信号处理需要对大量的数据进行复杂的操作。例如,为了缩放(改变音量)一秒钟的音频数据,我们可能要进行44100次乘法运算。如果我们实时地进行操作,且整个渲染过程在 10ms 内完成操作,事情就变得更加困难了。值得庆幸的是,有一些编程工具可以让我们更高效地处理这些情况,其中之一就是本文的主题 — SIMD在这篇文章中,我们讨论了 SIMD 指令在数字信号处理中的用处。SIMD指令让我们使用专用的处理器寄存器同时对一个以上的变量进行操作。不同的处理器架构和型号有不同的SIMD指令可用。
2022-11-07 19:26:35
1888
原创 【音频处理】Channel Vocoder 算法简介
本文介绍了 Channel vocoder,它是一种非常神奇的音效,可以用来实现经典的机器人音效。Channel vocoder 可以使用时域和频域两种实现方法。时域方法中,它被看出是一种 filter-band 模型,通过 band-pass filter 过滤出特定频段的信号,然后将 modulator 中的包络信息附加到 carrier 中来实现;
2022-10-28 11:11:17
1617
原创 【音频处理】Fast Convolution 快速卷积算法简介
这篇文章中我们介绍了卷积在信号系统中的重要意义,卷积算法复杂度为 O(N^2),为了加速卷积计算,人们提出了快速卷积算法,本文介绍了 FFT 卷积,Overlap-Add 和 Overlap-Save 块卷积,以及均匀分割卷积算法。算法的相关实现都在,包括 python 版本和 C++ 版本。......
2022-08-18 07:37:17
7328
原创 使用 gcov/lcov/gcovr 在 Android APK 下获取代码覆盖率
本文介绍了 gcov 生成代码覆盖率的基本流程和原理,重点说明了 gcno、gcda 和源码文件之间的关系;通过 `strings` 命令可以查询 gcno 中指定的源码位置,以及 gcda 的生成位置;通过对 `GCOV_PREFIX` 和 `GCOV_PREFIX_STRIP`的设置,可以指定 gcda 生成的位置。最后,通过 [AndroidNativeCodeCoverageExample](https://github.com/jiemojiemo/AndroidNativeCodeCovera
2022-07-27 21:59:15
3072
1
原创 SDL2 简明教程(四):用 SDL_IMAGE 库导入图片
非常棒!sdl_image可以支持多种格式图片,需要用IMG_Load代替即可。你需要初始化和清理sdl_image,这些都非常简单。本文所有代码可以在找到。
2022-07-21 19:44:26
5038
原创 SDL2 简明教程(三):显示图片
在这篇文章中,我们研究了如何创建渲染器、表面和纹理。我们用这些来加载位图并在屏幕上显示它们。我们还看到了将图像复制到窗口的某个区域,和使其填满整个窗口之间的区别。本文源码你可以在找到。httpshttpshttpshttps。...
2022-07-20 21:08:00
2738
3
原创 SDL2 简明教程(二):创建一个空的窗口
本文介绍了如何使用SDL2创建一个空的窗口,你可以指定窗口的位置,大小等信息。为了让窗口保持存在,我们引入一个无限循环直到满足退出条件,关闭窗口触发SDL_QUIT事件,通过等待该事件,随后关闭窗口。本文源码你可以在找到。https。......
2022-07-19 20:29:46
3366
原创 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境
决定以这个教程为基础,翻译其内容,作为自己的学习纪录,同时方便其他新手更快的掌握SDL2的知识。中使用VisualStudio2015进行工程管理。本人更熟悉CMake,它在夸平台上更有优势。因此在此开篇中,我将向你展示如何使用CMake和Conan来引入SDL2库,进行丝滑编程。本文说明了如何使用Conan和CMake构建SDL2编程环境,相关代码实现可以在找到。......
2022-07-18 22:25:39
4140
原创 C/C++ 内存治理神器 - Google Sanitizers
Google sanitizers 简介;Mac 使用内存泄漏检查;CLion 中使用 asan
2022-07-12 18:21:23
7554
原创 【音效处理】Compressor 压缩器算法简介
系列文章目录Delay Line 简介及其 C/C++ 实现LFO 低频振荡器简介及其 C/C++ 实现【音效处理】Delay/Echo 算法简介【音效处理】Vibrato 算法简介文章目录系列文章目录一、Compressor1.1 动态范围二、算法实现2.1 算法建模2.2 Level detection2.3 Gain Computer2.4 DCA参考一、Compressor1.1 动态范围Compressor 中文译为 “压缩器” 或者 “动态压缩器”,它是一种音频动态范围处
2022-05-22 11:58:58
8226
10
原创 【音效处理】Reverb 混响算法简介
系列文章目录Delay Line 简介及其 C/C++ 实现LFO 低频振荡器简介及其 C/C++ 实现【音效处理】Delay/Echo 简介【音效处理】Vibrato 简介文章目录系列文章目录一、混响二、人工混响三、数字混响算法3.1 混响的脉冲响应信号一、混响混响是一种自然发生的声学现象。在房间中放置一个扬声器用于发声,放置一个麦克风用于收集声音。当声音与墙壁或者其他材料相遇时,声音发生反射,因此麦克风收集到的信号,除了扬声器到麦克风的径直路径外,还有很多其他方式到达的声音,如下图
2022-05-15 18:20:56
10947
10
原创 使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率
文章目录前言一、Github Actions二、使用 Lcov 获取代码覆盖率三、Github Actions 配置 Codecov总结参考前言我总是有强烈的欲望去追求更高代码质量,而代码覆盖率是衡量代码质量的指标之一,它意味着你编写的单元测试、回归测试是否有完整执行到所有代码行。对于 C/C++ 这种需要 “小心翼翼” 的编程语言,内存泄漏、越界、野指针等问题防不胜防,这些问题也是破坏代码质量的重要元凶,提早发现并修正此类问题可以帮助我们提升代码质量。我喜欢使用 AddressSanitizer
2022-04-22 19:18:41
3153
原创 【音效处理】Vibrato 简介
系列文章目录Delay Line 简介及其 C/C++ 实现LFO 低频振荡器简介及其 C/C++ 实现【音效处理】Delay/Echo 简介文章目录系列文章目录一、Vibrato 是什么二、Vibrato 原理2.1 Time-varying delay line2.2 多普勒效应三、Vibrato C/C++ 实现3.1 从 LFO 中得到延迟3.2 算法参数3.3 C/C++ 实现四、总结五、参考一、Vibrato 是什么“vibrato” 一词指的是,在一个音的音高上小的、准周期
2022-04-10 09:46:56
2763
1
原创 【音效处理】Delay/Echo 简介
系列文章目录Delay Line 简介及其 C/C++ 实现LFO 低频振荡器简介及其 C/C++ 实现文章目录系列文章目录一、Delay 是什么二、Delay 原理2.1 Basic Delay三、总结参考一、Delay 是什么Delay(延迟)是一种信号处理技术,它将输入信号纪录气力啊,然后过一段时间再播放。当延迟信号与当前信号混合时,会产生类似回声(Echo)的效果。大多数人都有过在大山中大喊的经历,声音在山谷之间传递,回声余音袅袅。没错,所谓的 Echo 就是这种感觉。看下面两个对
2022-04-02 20:53:20
6936
原创 Delay Line 简介及其 C/C++ 实现
文章目录Delay Line 简介Delay Line 使用Delay Line C/C++ 实现符合直觉的实现优化后的实现总结参考Delay Line 简介在音频处理中,Delay Line 是基础功能组件,用于模拟声学音频传播延迟。它是延迟音效(包括 Delay、Vibrator、Phaser等)和音频 Synthesizer 中基本组成部分。Delay Line 的功能是在输入信号和输出信号之间引入一个时间延迟。此外,有时候我们要对齐两路信号,其中一路有延迟,这时候也可以使用 Delay L
2022-03-30 11:11:34
2104
1
原创 LFO 低频振荡器简介及其 C/C++ 实现
文章目录前言LFO 算法LFO 基本实现向其他波形变换总结参考前言LFO 即 “Low Frequency Oscillator” 低频振荡器,它可以按照各类波形(例如锯齿波、三角波、Sine 波等)进行震动。名副其实,LFO 的振荡频率通常都低于 20HZ,低于人类听觉范围。那么,为什么我们想要一个听不到的振荡器?在音效处理中,我们使用 LFO 来控制音效算法中的某些参数,为听到的声音赋予生命和动感,例如 Vibrator、Flanger 和 Chorus 等。LFO 算法LFO 基本实现L
2022-03-30 11:11:15
2794
原创 CLion 中使用 clang-format
Clion 中开启 clang-formatPreferences -> Editor -> Code Style -> “Enable ClangFormat”在保存时自动代码格式化Preferences -> Tools -> Actions on Save -> Reformat code
2022-03-22 17:54:23
8481
1
对录音进行变速和变调处理
2015-08-21
CVC-ClinicSpec
2020-12-07
Zint 开发手册 Zint 开发手册
2018-08-14
rtaudio学习Demo
2015-09-08
Introduction of RBF
2018-11-06
CVPR12_SAS_code
2017-04-08
AGCWD Code
2017-11-29
用mfc做桌面图标小广告
2016-03-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人