- 博客(39)
- 问答 (1)
- 收藏
- 关注
原创 基于FFmpeg的Android播放器
Android视频播放器,解码基于FFmpeg,支持软硬解。视频渲染基于OpenGL ES。音频输出基于oboe。
2023-09-30 20:19:03
1679
2
原创 音频均衡器原理及实现
音频均衡器原理及实现文章目录音频均衡器原理及实现1. 实现原理1. 实现原理之前在数字信号处理系列的文章中,从卷积开始讲起,直到最后的FIR滤波器和IIR滤波器。对于滤波器最直观的应用,就是音频均衡器。均衡器是我们经常可以见到的东西,它可以对音乐的某些频段进行增益或衰减,进而改变听感,使音频回放更具个性。尽管有很多的库可以实现这个功能,但是作为移动端开发者可能对其内在的实现机制并不了解,这篇文章将一步一步构造一个简单的均衡器。对于均衡器,我们可以选择使用FIR滤波器或者IIR滤波器实现,两者的实现
2021-06-04 00:00:25
11361
9
原创 数字信号处理6:IIR滤波器设计
IIR滤波器设计文章目录IIR滤波器设计1. 简介2. 设计步骤简明3. 拉普拉斯变换和Z变换3.1 拉普拉斯变换3.2 Z变换4. 双线性变换法1. 简介IIR滤波器(无限冲激响应滤波器)相比FIR(有限冲激响应滤波器),是一种在运算效率方面非常高效的滤波器,相比于FIR滤波器,在实现同等的滤波效果时,IIR滤波器所需的阶数要比FIR滤波器低很多。FIR滤波器的阶数一方面取决于通带与阻带之间的增益(低阶滤波器应用高增益,会导致吉布斯效应),一方面取决于滤波精度(FIR滤波器的精度为Fs/NF_s /
2021-05-23 20:47:29
20790
2
原创 Android native音频:录制播放的实现以及低延迟音频方案
文章目录1. 前言2. 工程准备3. 低延迟音频原理及功能实现方案4. 使用OpenSL ES4.1 播放器实现4.2 录音器实现4.3 Echo实现5. 使用AAudio5.1 播放器实现5.2 录音器实现5.3 Echo实现6. 使用Oboe7. 功能配置1. 前言Android提供了很多的多媒体接口,通常在java层,我们常用的就是AudioTrack和MediaPlayer进行音频播放。MediaPlayer不光可以播放音频,也可以播放视频,并支持少部分的解码。而由于音视频通常计算量都很大,所
2020-08-09 23:40:53
3519
原创 基于FFmpeg的简单Android视频播放器
文章目录1. 模块分割2. 解码器实现3. 播放控制4. 音视频同步5. 总结之前的博客中已经使用了FFmpeg进行音频文件的解码,并且基于OpenSLES实现了一个简单的音乐播放器。最近正在学习《音视频开发进阶指南》,看到了视频部分。不如就干脆再写一个视频播放器。代码存放在我的github:Android-VideoPlayer。1. 模块分割首先对这个视频播放器所采用的一些部件要清楚...
2020-05-06 00:09:32
2450
1
原创 数字信号处理5:FIR滤波器设计
文章目录1. 滤波器初识2. 最直观的滤波方式:频域滤波3. 傅里叶变换中的加窗之前的一系列博客中,详细分解了从卷积到FFT的相关知识,不过那些属于理论,是为了让我们清楚认识到信号处理的本质。本篇博客将会详细讲解数字信号处理最广泛的应用——滤波器。注意,本章所采用的dB标准为dB=20logVVbasedB = 20log\frac{V}{V_{base}}dB=20logVbase...
2020-05-05 03:01:17
3847
2
原创 数字信号处理4:采样定理
文章目录1. 卷积定理2. 采样定理推导3. 傅里叶变换的频域标度采样定理又称奈奎斯特定理,它规定了连续信号抽样成为离散信号时的采样率与信号最大频率之间的关系,那就是:对于连续信号x(t)x(t)x(t)进行抽样时,抽样信号的最小频率p(t)p(t)p(t)的频率要大于x(t)x(t)x(t)的最大频率的2倍,采样得出的信号x[n]x[n]x[n]才能还原出原始信号x(t)x(t)x(t)。...
2020-05-02 02:51:51
14016
1
原创 Android音乐播放器-使用FFmpeg及OpenSLES
文章目录一、准备工作二、目标三、整体架构四、OpenSLES五、解码六、状态通知在之前的文章《FFmpeg解码音频代码》中,已经实现了使用FFmpeg解码音频为PCM。这次我们利用FFmpeg以及OpenSLES来实现一个简单的音乐播放器。一、准备工作在开始之前,我们需要使用之前文章中编译的Android版本的FFmpeg库,如果不清楚如何编译,请查看我的文章《最新版FFmpeg移植An...
2020-04-27 22:24:16
741
原创 数字信号处理3: 快速傅里叶变换(FFT)(含代码)
文章目录1. FFT推导2. FFT为什么快?3. 一些加速措施3.1 查表法计算三角函数3.2 奇偶分解在之前的文章《傅里叶变换》中,我们已经推导了连续傅里叶变换和离散傅里叶变换。由于计算机的发展,离散傅里叶变换(DFT)可谓是信号处理的杀手锏。但是离散傅里叶变换计算量巨大,通常在实时信号处理时是无法使用的,直到快速傅里叶变换(FFT)算法被发现。与DFT不同,FFT是一种算法而非理论,因此...
2020-02-09 18:13:31
4206
原创 最新版FFmpeg移植Android:编译so库(基于NDK r20和FFmpeg-4.1.0)
FFmpeg是非常强大的编解码库,支持相当多的格式。如果你仔细看一下手机中各种播放器的许可条款,一定不会缺少FFmpeg的身影。但是网络上FFmpeg移植的资料都非常少,很多还是使用很老的库,比如使用2.xx版本的FFmpeg,NDK版本还使用r9(2019年最新的NDK版本已经到了r21)。但是程序员一定是要与时俱进的嘛,因此我花了挺长时间研究了一下新版本移植的问题,最终终于成功了。编译完成...
2020-02-02 22:57:46
1261
原创 FFmpeg解码音频代码
工程请访问DecodeTest。用c++写的,使用FFmpeg-4.1.0。比较完善的是OfficalDecodeAudio.cpp,它是我研究了一下ffplay.c的源码得来的。该代码按照统一的44.1kHz、双声道、16位int去解码音频文件。通常的wav、mp3、FLAC、aac、m4a、ogg等文件都可以解码。既然提到了代码,还是稍微讲解一下。对于FFmpeg,解码并不是每个AVPac...
2020-02-02 15:58:18
782
4
原创 数字信号处理2:傅里叶变换
在上一篇文章中我们推导了卷积。这一篇文章基于上一篇的卷积结果:y[n]=∑k=−∞+∞x[k]⋅h[n−k]=∑k=−∞+∞h[k]⋅x[n−k]y[n] = \sum_{k=-\infty}^{+\infty}x[k] \cdot h[n-k]\\=\sum_{k=-\infty}^{+\infty}h[k] \cdot x[n-k]y[n]=k=−∞∑+∞x[k]⋅h[n−k]=k=−∞...
2020-01-29 21:22:40
2366
5
原创 Kotlin协程的迷惑
Kotlin作为谷歌强力推广的Android编程语言,是运行在jvm上的,在很多地方可以看做java语言披了一层语法糖,很多地方其实和java是相通的,包括各种库的使用。不过倒是有一个新东西:协程,这个对于java程序员来说可能就比较陌生。我也是研究了一下协程,作为一个备忘。1. 关键概念1.1什么是协程?协程是轻量级的线程这是官方文档给的定义。虽然它和线程的关系看起来很像线程和进程的...
2019-09-16 19:39:16
775
2
原创 Android NDK开发: 通过C/C++调用第三方so库
上一篇打包so库及jar包的博客我讲了如何将自己的代码打包成so库,并且配合jar包供他人调用。但那种方式仅适合对方从java层调用,如果算法是比较核心的,而又为了效率必须从native来调用,那种方式就不合适了。本篇讲如何打包我们自己的核心代码供他人在native调用,如果对方愿意,也可以自己封装然后从java来调用,灵活性更高。并且在调试的时候更加方便。这种方式是更接近纯C/C++工程的集成...
2019-07-21 01:31:52
11756
1
原创 备忘:gcc在linux下打包so库并调用
环境:Ubuntu, GCC切换到准备编译的代码文件夹中,输入g++ *.cpp -fPIC -shared -o libname.so,name随便起,这时会生成一个libname.so文件。把so文件复制到准备用的工程中。在该工程位置打开终端,首先在ubuntu环境下要设置库的路径:export LD_LIBRARY_PATH=./,否则在运行时会出现找不到库的错误,别的环境下是否需要暂...
2019-07-17 17:20:02
3093
原创 淘宝8850h小主机黑苹果教程
1. 硬件概况CPU:i7-8850H,6核12线程GPU:UHD630声卡:ALC269视频接口:miniDP、HDMI系统版本:mojave14.42. 安装过程(1) 使用etcher向U盘写入镜像,该镜像从黑锅小兵博客中下载。(2) 使用前最好用DiskGenius将硬盘完全删除分区表,否则macOS安装器可能无法正确分区,导致安装过程中出现空间不足的错误。(3) 进入B...
2019-07-16 16:39:28
7820
7
原创 Android NDK开发:打包so库及jar包供他人使用
Android的NDK开发相信各位已经精通各种姿势了。不过基本上都是那种native代码和java代码都在同一个工程中,因为应用从头到脚都是我们自己的,也不需要分离。但有时候可能需要我们自己把某些库打包起来供别人使用,或者使用别人提供给我们的库。本篇文章及下篇文章就讲讲so库如何打包。一、目标及方式这篇文章会讲第一种方式来打包so库,这种方式是基于jni层的,需要我们同时提供接口的jar包...
2019-07-12 09:32:46
13398
8
原创 Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件
一、如何在string.xml中定义html文档首先最好自己在外部新建一个html文件,然后开始写自己的内容。并且在浏览器中预览效果。首先预先编写一个简单的html文档:<html> <head> <style type="text/css"> body { color: #1...
2019-07-11 15:39:56
1102
原创 数字信号处理1:卷积
文章目录一、前言二、线性时不变(LTI)系统三、冲激函数四、阶跃函数五、卷积数字信号处理是音视频开发所必不可少的一项技能,我会从本篇开始,开启一系列入门文章,分享关于数字信号处理方面的知识。这只是一个精简的知识提炼,供大家进行入门,也是对自己的一个备忘和学习笔记。难免会有纰漏,要深入的同学请务必去看一些经典教材。一、前言数字信号处理我们日常生活中其实会经常接触到,像音频、视频、机械控制等...
2019-04-22 00:18:01
5218
2
原创 吴恩达机器学习——线性回归
文章目录前言一、单变量线性回归单位矩阵代价函数寻找全局最小值前言自己从前段时间开始学习机器学习的相关知识,看了一些经典的书籍,但书上讲的总归有些晦涩,看到大家在推荐吴恩达的课程,于是去看了,发现确实很不错,有很多书上难懂的公式,其实视频里十几分钟就讲明白了,效率很高。这个博客会作为一个系列,用来讲解自己做的编程练习题,为同样正在入门的同学提供一些思路,也为自己做一个备忘。这个系列文章不会讲解课...
2019-03-12 10:06:04
1388
原创 Android中动态初始化布局参数以及ConstraintLayout使用中遇到的坑
Android中动态初始化布局以及ConstraintLayout遇到的一个坑ConstraintLayout是Android中的一个很强大的布局,它通过控件之间的相对定位,来完成一个layout中的所有view的布局,但布局方法相对于RelativeLayout更为灵活。能够大幅减少布局嵌套,提升性能。这次遇到的问题是在Activity中动态对Fragment进行布局和动画效果,难点在于...
2018-05-16 11:15:02
9079
原创 优雅的嵌套滑动解决方式-NestedScroll
优雅的嵌套滑动解决方式-NestedScroll嵌套滑动相信大家一定经常遇到,最烦人的就是我们有两层view,它们都能在同一个方向上滑动,这时候滑动的判断就是个头疼的问题。不过这也还好说,毕竟只要根据业务需要来决定上层layout相对于下层的layout滚动的优先级,然后决定是否拦截滑动事件即可。最最让人绝望的,就是在同一个事件流中要分别让两层view滑动!!!比如滑动时,前半段上层滑动,上层
2017-11-30 22:56:42
6403
原创 Android的滑动分析
Android的滑动分析 滑动应该可以说是Android中最常见的一种视觉效果,也是View编写中的关键,本篇文章就来分析一下Android中滑动的实现方式。滑动通常分为计算位移以及执行滑动两部分,本篇将会涉及这两个方面。对于计算部分,通常有三种方式,1:阻塞;2:通过各种Scroller;3:属性动画。其中1和2其实是差不多的,因为要省事的话,都会需要Scroller来执行计算任务
2017-11-23 16:02:06
565
原创 Android自定义view之ViewPager指示器——2
Android自定义view之ViewPager指示器——2上一篇《Android自定义view之ViewPager指示器——1》中我们一起写了测量和布局的流程。本篇我们继续讲解事件分发,以及其他的功能性方法。
2017-08-24 11:11:54
733
原创 Android自定义view之ViewPager指示器——1
Android自定义view之ViewPager指示器——1ViewPager应该是我们平日里接触很多的控件,但是官方却一直没有个方便的指示器来使用。本篇文章就带领大家一步一步自定义一个Indicator。本篇为第一部分,第二部分将会讨论事件分发以及提供代码下载。
2017-08-21 17:13:01
809
原创 Android自定义view之事件传递机制
Android自定义view之事件传递机制本文是自定义view入门的第二篇文章,主要讲解Android的事件分发流程,结合上一篇的绘制等流程,基本就可以掌握自定义view的核心内容。后续我会写一些实际的小例子,加深理解。
2017-08-08 23:27:25
1495
2
原创 Android自定义view之measure、layout、draw三大流程
自定义view之view显示流程 一个view要显示出来,需要经过测量、布局和绘制这三个过程,本章就这三个流程详细探讨一下。View的三大流程具体分析起来比较复杂,本文不会从根源详细地分析,但是可以保证能达到实用的地步。
2017-04-13 17:39:24
10319
2
原创 Android自定义view之基础知识
Android自定义view之基础知识 虽然Android已经自带了很多实用的view和layout,加以调教能实现很美观的界面,但是有一些情况下,需要实现特殊的界面效果,比如我们比较熟悉的各种播放器的滑动条环节音量的界面,不同的音量对应不同的格数,但是不必要为每个格都单独开辟一个ImageView,如果只使用一个ImageView,那么又需要准备很多的图片,这样显然是不划算的,这个时候就需要自
2017-04-13 17:27:30
869
原创 HTTP1.1认识chunked编码以及使用socket对chunked解码(Java)
为了学习网络知识,接触了socket之后遇到了chunked编码,本文主要讲解了chunk编码的一些规则以及如何进行解码。
2017-03-03 19:47:39
2184
原创 Hibernate的transaction嵌套
HIbernate中,通常都会打开一个transaction来执行一次操作,transaction被称为事务。但是有时候在写一些递归的操作的时候,会不小心犯下事务嵌套的错误,就会得到错误nested transactions not supported,意为不支持嵌套的事务。通常这会在多层N对N的操作中出现,特别是删除操作。因为save和update只要你在实体类里设置好,Hibernate就会自动
2015-12-18 20:09:52
3591
原创 SSH应用之BBS之路-2、Hibernate配置
先申明我使用的数据库是MySql,用的环境是IDEA。 Hibernate的配置说起来还是比较简单的,首先是要去下载Hibernate,然后建立Web项目,对于IDEA,详细的Web项目建立就不多说了,唯一需要说明的是我的src、classes和lib都建立在WEB-INF文件夹下,并且各个文件夹的属性都要在project structure里设置,这样IDEA才知道编译后的文件放在哪,lib去哪
2015-12-17 22:57:14
575
1
原创 SSH应用之BBS之路-1、项目构设之数据库设计
这种项目数据库是很重要的,所以数据库要一开始就设计好。因为是个人练手,所以项目比较简单,只有BBS的基本要素:分类(Category)、话题(Topic)和帖子(Message)等。这里,顶层的帖子是Topic,然后所有的跟帖都是Message类型。下面是具体的表的内容Category{id名字子Topic(一对多)}Category是分类,这个很简单,就是分类的名字,然后底下所包含的Top
2015-12-17 22:34:29
713
原创 servlet中filter的的异步问题以及JSP与servlet配合时filter的注意
这是今天写的时候遇到的问题,首先说说JSP与servlet配合时的问题建立了一个filter,验证session里的username属性,如果为空则认为未登陆,返回到登陆页面,而登陆是JSP做表现层,servlet做控制层,可是一直不能成功。原因是在JSP的form提交之后,其实session里并没有username属性,也就是说其实还是相当于JSP提交之后,要再向相关的servlet请求,也
2015-10-18 18:48:19
1778
原创 关于servlet中出现GET方法不能应用于此url的解决办法
这种情况其实很简单,新手用户往往会出现这种问题,尤其是在用IDE的自动重写方法的功能时,不管你是用doGet()方法还是service()方法,首先要做的都是删除IDE自动生成的super. service()或者super.doGet(),不然会导致父类的相关方法覆盖你自己的方法,就会出现上述问题。
2015-10-14 22:32:47
1105
原创 eclipse和idea开发servlet的区别
最近在学习开发servlet,本来先用的eclipse,但是因为凶java se开始就用的idea,很喜欢的idea的代码提示的风格,而eclipse需要alt+/才会出现提示。所以换了idea。不过idea调试servlet没有eclipse方便,这里说一下两者的区别1、eclipse可以直接选择新建一个servlet,并且doGet()和doPost()方法是自动写好的,直接向里面添加代码
2015-07-22 09:24:41
2281
原创 简单的俄罗斯方块代码(Java)
package MyGame;/** * Created by zu on 2015/3/30. *//*整个游戏界面分为两部分,左边显示信息,右边是游戏区,是两个JPanel,它们的父窗口是MainWindowFrame。 */import java.awt.*;import java.awt.event.*;import javax.swing.*;public cl
2015-04-02 10:44:13
22416
16
原创 教你用命令行扩展VHD的大小
VHD是一个装windows多系统非常好的选择,不仅仅是方便,而且还干净,不想要了删掉就什么都没有,不用折腾分区,而且,如果VHD里的系统比较重要,在想备份的时候直接复制一个VHD,留在移动硬盘里或者上传到网盘,很方便啊有木有。不过有挺多人会有需要扩展VHD分区的时候,一般都是让你再创建一个大些的VHD然后把内容复制进去,就算是类似于VHDResizer这种工具也是这样的原理,这样很耗时,下面是我
2015-01-15 09:07:35
15769
原创 51单片机配合超声波测距以及用1602液晶进行显示
自己写的一个小程序,给51入门的朋友们用一下,实测还行,没什么问题,但几米以上就不怎么准,主要是模块比较廉价,当练手用。注释也都比较清楚。
2015-01-12 12:35:30
15282
8
空空如也
WPF 在代码中 手动创建了WrapPanel并添加到界面 WrapPanel不会换行
2018-01-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人