- 博客(26)
- 收藏
- 关注
原创 卡尔曼滤波
简介卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出测量数据,对系统状态进行最优估计的算法。由于测量数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。原理详情参考The alpha - beta - gamma filter,该网站对卡尔曼滤波的原理进行了由浅入深地解读。这里简单介绍下卡尔曼滤波的五个方程:1.状态更新方程,表示根据系统当前状态对下一时刻状态的估计,其中x为估计值,z为测量值,Kn为卡尔曼增益。该公式也可以转换为下面
2022-04-19 20:32:00
4755
1
原创 Android应用的流量统计方法
通过shell读取1.获取应用的userId adb shell dumpsyspackagetv.danmaku.ijk.media.example |grep userId 2.根据userId查询/proc/net/xt_qtaguid/stats文件 adb shell cat /proc/net/xt_qtaguid/stats | grep10156 之后会得到类似如下输出: idx|iface|acct_tag_hex|uid_t...
2022-03-09 16:14:18
5174
原创 播放器网络带宽预测方法
简介带宽预测是播放器实现码率自适应的技术基础。只有对当前的带宽预测的足够准确,才能够选择出当前场景下最优的码率进行播放。下面分别介绍下ijkplayer和exoplayer的带宽预测方法。ijkplayerijkplayer的带宽预测代码位于ijksdl_timer.c中,核心思想是对过去时间点的网速进行采样,使用过去所有采样点的加权均值对当前带宽进行预测。其核心结构体为SDL_SpeedSampler2: typedef struct SDL_SpeedSampler2 {
2022-02-26 16:05:15
3635
原创 VLC-Android起播丢帧问题分析
最近在搞MEMC优化过程中,经常能够发现视频在起播阶段会丢几帧,记录下问题分析过程。对于AV同步及丢帧等问题的分析,最好就是将数据从demux到decoder最后到output的pts都打印出来,VLC还涉及到stream时间与系统时间的转换,因此clock_point也需要打印出来,这样能够快速地定位到问题原因。对于这题,视频被丢的前几帧和后续的正常帧有一个区别,那就是它们在做时间转换时参考的clock_point不一样。为什么会发生这种情况呢?我们回顾下VLC-Android音画同步原理中关于b
2021-11-25 15:14:48
3823
原创 VLC-Android退出流程
最近在分析一个播放器退出ANR的问题时,详细地跟踪了VLC的退出流程,这里问题的分析先按下不表,我们先结合代码详细了解下播放器的退出流程。1.java—>jni—>native的Stop调用流程,没什么好说的,直接上代码 //MediaPlayer.java /** * Stops the playing media * */ publicvoidstop() { synchronized(this) { ...
2021-11-18 17:23:03
3038
原创 VLC-Android视频显示流程
最近在做MEMC调试涉及到了播放器刷帧频率的问题,因此深入研究了一下VLC视频的显示流程,仔细研究过后发现还是有挺多坑的,在这里分享下:VLC的视频显示逻辑主要在video_output.c中,其内部维护了一个线程用来接收control和刷新显示(这里和ijkplayer很像): //vout中其实有两个线程,分别名为Thread和ThreadStep,视频正常播放走的是Thread,步进播放走的是ThreadStep(类似ffplay的s键),这里主要还是介绍Thread /****
2021-11-15 14:15:00
1609
原创 VLC-Android音频播放不完整问题踏坑
对于音频播放异常的问题,由于我们可以拿到解码前后的数据,因此还是比视频播放异常的问题好分析一些的。通过dump解封装后的es数据和解码后的pcm数据,我们可以快速的定位问题出现的大致位置:demux,decoder,aout。本题也是一样,先dump es和pcm数据,发现都没有问题,那基本就是aout部分惹的祸了。通过加日志,发现在音频播放快结束的时候,aout调用了两次flush。全局搜索aout_DecFlush函数,发现有三种情况下会调用:1.decoder flush;2.decoder de
2021-11-12 14:04:11
4199
转载 linux下内存压力测试——stressapptest
一、简介 stressapptest是Stressfull Application Test的简称。 该软件更多的时候测试的是内存控制器和总线接口,而不是存储单元的功能。测试是会最大化总线和内存的交换量,从而使交换失败的概率会增加。 该软件采用多线程对内存进行拷贝和磁盘接口读写,占用85%的内存块,而且每个线程都是随机进行读写操作,一般每个处理开启2个线程,磁盘也是。 该软件在测试系统接口方面比较好,可以评估一些内存信号完整性或者内存芯片、接口总线及磁盘方面的情况;...
2021-11-05 09:49:06
12264
原创 ExoPlayer音画同步原理
ExoPlayer和大部分播放器一样,默认采用Audio Master的同步方式,其视频同步原因在MediaCodecVideoRender.java的processOutputBuffer()函数中,下面结合函数详细看下音画同步的原理。protected boolean processOutputBuffer( long positionUs, long elapsedRealtimeUs, @Nullable MediaCodecAdapter codec,
2021-11-01 16:06:29
615
原创 应用级播放器对比
VLC ExoPlayer ijkplayer 平台 Android、iOS、Linux、Windows跨平台 Android Android、iOS 封装格式 全面 一般 全面 协议 全面 全面 全面 Android MediaCodec NDK java jni->java Tunnel Mode 不支持 支持 支持 Audio Bypass 不支持 支...
2021-11-01 14:46:54
1229
原创 VLC-Android消息机制介绍
VLC通过variables来接受外部控制事件和向外部发送事件,variables同时也可以作为modules之间简单通讯的载体。本文通过举例详细介绍下variables的功能。接受外部控制事件以seek为例,vlc-android在seek时可以调用MediaPlayer.java的setTime()方法。 /** * Sets the movie time (in ms), if any media is being played. * @param time: T..
2021-10-28 18:45:00
1162
原创 VLC-Android音画同步原理
简介播放器的音视频同步无外乎三种方式:视频往音频同步、音频往视频同步及音视频同时往系统时钟同步。大部分播放器都是采取第一种方式,例如ffplay、EXOPlayer、Nuplayer、ijkplayer等。而VLC就比较不合群了,它采用音视频同时往系统时钟同步的方式,下面结合代码简单介绍下音画同步的原理。VLC专门有一个clock.c文件,用来维护时钟信息,其核心结构体如下,阐述了VLC音画同步的核心思想: typedef struct { mtime_t i_st...
2021-10-25 11:32:47
1430
1
原创 VLC-Android seek后闪黑屏问题分析
从测试描述了解到该问题复现概率较高,因此决定刷最新版本后重新抓份log。果然,seek几次就遇到了问题,查看log并定位到最后一次seek的位置,可以明显的看到如下异常打印: //seekto指令 04-3012:02:08.8401616416164I PlayerWrapper: [FMPlayer] [3] seekTo(69069) //dequeue_in超时 04-3012:02:10.9021616419639W VLC : [e3f8...
2021-10-22 10:26:34
1076
原创 Android HandlerThread踏坑
今天在给前人“擦屁股”时看到了类似如下代码:Button mStartButton;mStartButton = findViewById(R.id.start_button);mStartButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "mStartButton onClick"); i
2021-09-24 17:06:22
315
转载 【转载】Android NDK 面试题汇总
一、谈谈你对 JNI 和 NDK 的理解 JNI: JNI 是 Java Native Interface 的缩写,即 Java 的本地接口。 目的是使得 Java 与本地其他语言(如 C/C++)进行交互。 JNI 是属于 Java 的,与 Android 无直接关系。 NDK: NDK 是 Native Develop...
2021-09-14 19:49:42
386
原创 ijkplayer-android编译踏坑
最近心血来潮想研究下ijkplayer,于是去github上下载了最新的代码准备编译一下研究一番。没想到这么出名的项目编译过程也不是十分顺利,在此记录下遇到的坑,希望对后来人有帮助。ijkplayer的README其实是有介绍编译方法的,然而README截至目前已经四年没有更新了,所以即使按照README一步一步来也会遇到各种问题,下面一边说一边介绍问题吧。首先声明下我的编译环境是Ubuntu 18.04,因为我从事的是Android音视频开发工作,所以后面也只会介绍Android版本的编译。1
2021-08-27 09:52:44
442
原创 VLC Buffering机制介绍
一、简介了解一定播放器知识的同学应该都知道,播放器内部是有缓存的(非直播场景)。缓存的作用主要是解决生产者和消费者速度的不匹配,给用户更好的使用体验。例如,在网络不稳定的情况下,可以提前缓存部分数据确保视频流畅播放;在网络差的情况下,可以及时弹出缓冲标志提示用户当前网络不好。下面简单介绍下VLC的Buffering机制。我们在使用VLC播放视频时,能够明确的看到类似如下日志: 08-0613:48:51.8451149512427D VLC : [894f9830/308b...
2021-08-06 17:17:29
1275
原创 VLC 视频pause后seek画面概率性卡主问题分析记录
在讲这个问题之前需要先介绍下VLC的AV同步逻辑,截止VLC 3.0.16版本,VLC只支持AV同步到系统时钟,所以clock中有stream和system两个概念。播放器会将解码后数据的pts从stream参考系转换到system参考系,具体的转换方式这里不做赘述,这里想说明的是,解码之后数据的pts被转换成系统时间了,如果此时暂停播放器,系统时间还是会线性增长的,一段时间后恢复播放,这些数据会触发too late逻辑被丢掉。为了防止这种情况出现,VLC在video_output中添加了如下逻辑,记录了从
2021-07-30 18:25:44
1008
5
原创 VLC rmvb视频seek后间断性无声问题分析
拿到问题首先还是看日志,可以明显看到触发了VLC的too early条件,往AudioTrack塞0导致的无声。 04-2811:33:12.5541082511073W VLC : [a5a8d430/2b41] libvlc audio output: playback way too early (-1264388) than (-240000), cache734153: playing silence 04-2811:33:12.5551082511073...
2021-05-31 18:42:37
731
原创 Dolby fMP4视频seek后卡顿问题分析
最近在做Dolby认证时遇到了一个fMP4视频seek后卡顿的问题,最终定位到是ffmpeg对于异常片源的容错做的不是很好。由于该问题涉及到大量ffmpeg原生代码流程的分析,整体分析的时间会比较长,对mov.c的理解也更加深刻了,特此记录一下。对于这种卡顿问题首先肯定是怀疑丢帧,果然在问题日志中看到了如下异常打印: 05-1211:04:51.24753340487508W VLC : [d294a530/1d54] libvlc video output: pictur...
2021-05-19 11:19:24
1366
2
原创 Dolby FRT测试简介
FRT及Frame Rate Test,是Dolby定义的一套帧率测试手段。测试时需要使用苹果手机的慢动作录像对电视画面进行录制,录制的位置是一串二进制数,这个数字代表当前视频帧的序号,录制完成后将视频导入Dolby提供的分析工具,其实就是用OCR算法将录制的帧序号图像还原成数字进行分析是否有丢帧和重复帧。分析工具在分析完成后会在UI上显示分析结果,并在录制视频的同级目录生成测试报告和图片。测试的具体步骤见Dolby的官方说明文档。下面一起看下测试报告的格式:第一部分如下所示,包含了测试结果的概述。
2021-05-18 20:28:14
1067
原创 Android Tunnel Mode配置简介
目录简介处理方式配置流程VLC适配简介Tunnel Mode是Android专门在TV上提出的多媒体技术方案,用来缓解播放4K高帧率视频播放带来的性能问题。有关Tunnel Mode的官方详细介绍地址如下https://source.android.com/devices/tv/multimedia-tunneling,下面简单介绍下Tunnel Mode的配置方式。关于Tunnel Mode的配置,在Android 11版本以后又发生了一些变化,我们看下Android的官.
2021-05-06 15:37:04
2608
2
原创 VLC无声问题总结
VLC的avsync方案是audio video同步到系统时钟,且audio sync的阈值比较敏感,很容易出现丢帧的情况。相对于audio master的同步方案,VLC的同步方案比较“理想”化,经常会出现无声问题。下面记录下目前遇到过的无声问题及分析记录:目录一、seek后无声1.片源av pts差异较大2.pts跳变二、起播无声1.AudioTrack起播慢一、seek后无声1.片源av pts差异较大首先先介绍下ffmpeg的demux方式,ffmpeg在解封
2021-04-28 17:16:37
3952
5
原创 C语言Union踏坑
目录简介案例分析简介C语言中的联合体Union可以说是非常冷门的一个关键字了,平时基本不怎么会用到。它的定义格式如下:union 联合体名{ 成员列表};例如:union data{ int n; char ch; double f;};可以看到联合体union和常用的结构体struct在定义上非常相似。二者的区别如下:1.结构体的各个成员会占用不同的内存,互相之间没有影响;而联合体的所有成员占用同一段内存,修改一个成员会影响其余.
2021-04-27 15:55:11
340
原创 VLC Audio同步原理分析
VLC 音频同步的核心代码在aout_DecSynchronize函数中,其中涉及到的变量及逻辑比较复杂,但其核心思想其实已经包含在了下面的注释中: /** * Depending on the drift between the actual and intended playback times, * the audio core may ignore the drift, trigger upsampling or downsampling, * insert ...
2021-04-26 19:08:51
1094
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人