- 博客(141)
- 资源 (16)
- 收藏
- 关注
转载 AHandler AMessage ALooper消息机制
普通消息被Post到消息队列,Looper不断的从队列中取出消息并分发给相应的Handler处理。如果是需答复消息的话使用Handler处理完以后通过postReply将消息返回给发送方,发送方通过新建的接收。
2025-03-13 11:51:33
18
原创 Android MediaPlayer的核心原理
对于Android这样一个完整又相对复杂的系统, 一个MediaPlayer功能的实现不在其具体的功能,而是具体功能如何适应Android系统Android MediaPlayer的主要具体实现在OpenCore的Player中,这部分不是本文的关注点。在各个库中,libmedia.so位于核心的位置,它对上层的提供的接口主要是MediaPlayer类,类libmedia_jni.so通过调用 MediaPlayer类提供对JAVA的接口,并且实现了android.media.MediaPlayer类。
2025-03-13 09:52:23
546
转载 ijkplayer-丢帧策略深入分析
1.测试拿过来个视频,发现用ijk播放器与系统播放器(mediaplayer)播放感觉不一样,用ijk播放感觉播放页面卡顿一点,没有系统播放器那么流畅。下面看一下这个问题,这个问题的原因其实很简单,由于我丢帧值设置的是5,改成1就可以感觉2个播放器在体验上感觉差不多了。(丢5帧人眼就可以看出来差别了!2.在高通660的机器上播放一个4k(30fps)视频,但是无法正常播放,实际一秒的解码帧只有20帧,实际播放只有4帧这样。导致画面卡顿,音视频不同步。
2024-10-22 13:57:16
141
原创 remote: Support for password authentication was removed on August 13, 2021.
2021年8月13日 github修改了验证的方法,相关的密码不能够直接输入,需要通过相关的秘钥token进行输入。因此我们需要在自己的账户生成对应的token才可以正常的在本地push对应的代码到远程github上。生成对应的token。
2024-08-07 17:59:06
308
原创 ijkplayer 自定义协议播放加密内容 Android
想对播放的音视频进行加密,防止资源被盗用,该怎么办呢?这篇文章从自定义协议的角度来提供一中实现思路。在 ijkplayer 的基础上,通过实现自定义协议对文件进行解密。边解边播,以此为基础,还可以实现在线资源边下载边解密边播放。结合 ijkplayer 源码阅读本文效果最佳。
2024-08-02 11:10:20
1748
原创 从零开始,手把手教你如何在Ubuntu下编译VLC-Android源码
公司项目中使用的库文件,有点老,对系统兼容性太差了,当程序运行在系统上时,回弹出警告框,提示异常,虽然,程序播放视频没有问题,但是,总是弹出提示框就非常不友好了,为此,就需要重新编译一个新的库文件。由于,在编译中遇到了一大堆难题,足足花了3天时间才将源码编译成功。期间在网上查找了不少参考资料,但是,大都介绍太过详细,好多地方没有将清楚,非常容易误导他人,所以,决定下一篇详细的教程来记录此次编译的过程,希望能给大家带来帮助。从零开始在Linux编译VLC-Android开源项目这篇博客给我带来的帮助。
2024-07-16 09:30:17
760
原创 ndk编译android系统下运行的ffmpeg配置
bin/bashthenfiAPI=28CPU=$1ARCH=""SYSROOT=""CC=""CXX=""thenARCH=armelsefi--cc=$CC \build()CPU=$1make -j32thenelsefimake cleanmake clean。
2024-04-29 15:11:09
848
3
转载 WebRTC实现Android传屏demo
WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和音频流或其他任意数据的传输。目前,WebRTC的应用已经不局限在浏览器与浏览器之间,通过官方提供的SDK,我们可以很容易的实现本地应用间的音视频传输。在Android平台上,我们也非常容易的集成WebRTC框架,用非常简洁的代码就能实现强大、可靠的音视频传输功能。
2024-03-21 14:25:29
533
转载 Miracast技术详解(四):Sink源码解析
Miracast Sink端源码最早出现在上,通过可以很方便的查看:但是在以后,Google却移除掉了这部分源码,详细的commit记录在:1234虽然移除了Sink端代码,但是Source端源码是还在的,我们可以通过Android手机的投射功能实现Miracast投屏发送端。最终,通过回调音视频裸流给进行解码,进行音视频数据的播放,整个端的流程就到此结束了。相信看完上面所有源码解析后,自己写这部分逻辑也不是难事,当然更好的办法肯定是基于Sink端的代码进行移植。移植。
2024-03-21 14:23:28
675
转载 Miracast技术详解(三):RTP & MPEG2-TS
在上一篇文章中,我们已经成功完成RTSP能力协商与会话的建立,并准备开始音视频流的传输阶段。那么下一步,就是对音视频流进行解析,并将音视频展示给用户的过程。这样整个Miracast的流程就算分析完毕了。先简单来总结下,在Miracast底层的实现中,是采用RTP协议对MPEG2-TS数据包进行封装,其中MPEG2-TS又同时封装了Audio和Video两种ES(Elementary Stream)。其中Audio格式一般为AAC,Video则为H.264。
2024-03-21 14:22:20
711
转载 Miracast技术详解(二):RTSP协议
在上一篇博客中我们已经通过Wi-Fi P2P建立好了Source和Sink端的TCP连接,在Miracast后续的音视频传输过程中,将采用RTSP协议来对流媒体进行控制。因此接下来的步骤就到了RTSP协商、会话建立及流媒体传输的阶段。首先,什么是RTSP协议呢?实时流协议是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体服务器。该协议用于创建和控制终端之间的媒体会话。
2024-03-21 14:20:46
835
转载 Miracast技术详解(一):Wi-Fi Display
Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的消费性电子产品(又称3C设备)可透过无线方式分享视频画面,例如手机可透过Miracast将影片或照片直接在电视或其他设备播放而无需任何连接线,也不需透过无线热点(AP,Access Point)。
2024-03-21 14:19:06
2664
1
原创 MediaPlayer到ACodec到OMX流程(Android7.1 NuPlayer)
【代码】MediaPlayer到ACodec到OMX流程(Android7.1 NuPlayer)
2024-03-13 09:19:26
581
原创 TS流分析
PAT表主要包含频道号码和每一个频道对应的PMT的PID号码,这些信息我们在处理PAT表格的时候会保存起来,以后会使用到这些数据。[cpp]//节目号// 节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个[cpp]">//PMT 表定义[cpp]//指示特定PID的节目元素包的类型。该处PID由elementary PID指定//该域指示TS包的PID值。这些TS包含有相关的节目元素//前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数。
2023-09-25 13:50:30
632
原创 MediaCodec 低延时解码
我们在使用Android的硬解进行解码时,如果是Android11以上则可以使用其特性低延迟,以下是Android 11支持的低时延特性:ANGLE支持:Android 11引入了ANGLE(Almost Native Graphics Layer Engine)支持,它是一个开源的跨平台图形引擎,可以将OpenGL ES和Vulkan API转换为DirectX API。使用ANGLE可以提高图形渲染的性能和稳定性。
2023-08-04 10:30:23
1659
转载 流媒体开发学习7 ffmpeg API保存流到文件demo
3)之所以要除以time_base,是因为AVStream中的duration的单位是time_base,注意这和AVFormatContext中的duration的单位(单位是AV_TIME_BASE,固定取值为1000000)是不一样的。(2)通过已知流的时长。(1)如果AVFormatContext中没有bit_rate信息,就把所有AVStream的bit_rate加起来作为AVFormatContext的bit_rate信息。
2023-06-17 11:41:01
546
转载 IjkPlayer数据读取-read_thread(含s->io_open)
这三个地方总共耗时加起来大概已经180ms左右,所以需要针对这三个过程进行优化。至此,ijkplayer的prepared过程结束。在video_thread,audio_thread等解码完成后,会将解码完成的数据包同步到video_refresh_thread线程中进行时钟同步,同步完后,则会开始绘制第一帧。函数中,初始化完视频,音频,字幕的帧队列后,启动了两个线程。所以如果没有修改的话,则使用该函数打开文件。
2023-06-13 20:54:38
207
原创 android性能测试-内存详解
dex文件代码占用内存。类函数的代码和常量占用的内存,dex mmap是映射classex.dex文件,Dalvik虚拟机从dex文件加载类信息和字符串常量等。Dex文件有索引区和Data区。通常来说,“private dirty”内存是其最重要的部分,因为只被自己的进程使用。它只在内存中存储,因此不能做分页存储到外存(Android不支持swap)。Dalvik堆和本地堆中和Zygote进程共享的部分是共享dirty内存。所有分配的Dalvik堆和本地堆都是“private dirty”内存;
2023-05-25 09:34:06
1292
原创 ijkplayer音视频同步
如果当前这一帧的播放时间已经过了,并且其和当前系统时间的差值超过了AV_SYNC_THRESHOLD_MAX,则将当前这一帧的播放时间改为系统时间,并在后续判断是否需要丢帧,其目的是为后面帧的播放时间重新调整frame_timer,如果缓冲区中有更多的数据,并且当前的时间已经大于当前帧的持续显示时间,则丢弃当前帧,尝试显示下一帧。通过实时计算每秒输入缓冲区的数据和发送出去数据,如果发送出去的数据小于输入缓冲区的数据,那么说明网络带宽不行,这时候缓冲区的数据会持续增多,这时候就要启动相应的机制。
2023-05-18 16:59:06
1184
转载 FFmpeg Heap Overflow 漏洞分析及利用
FFmpeg是一个著名的处理音视频的开源项目,使用者众多。2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190、CVE-2016-10191以及CVE-2016-10192。本文详细分析了CVE-2016-10190,是二进制安全入门学习堆溢出一个不错的案例。操作系统:Ubuntu 16.04 x64FFmpeg版本:3.2.1按照编译。
2023-05-11 14:24:11
482
原创 Android WebView 的 addJavascriptInterface 探究
Java和JS交互的方式有多种,这里探讨的方式是通过以下方式进行的交互。这篇文章是想弄明白 JavaScript 和 Java是如何实现这种方式互调的,就从源码角度开始分析。
2023-05-09 17:49:37
1323
原创 ffmpeg音视频解码和渲染流程
其实 ffpmeg 自带的播放器实例 ffplay 就是一个跨平台的播放器,得益于其依赖的多媒体库 SDL 实现了多平台的音视频渲染。但是 SDL 库过于庞大,并不适合整体移植到移动端。本文介绍的跨平台实现方案也是借鉴了 SDL2.0 的内部实现,只是重新设计了渲染接口。
2023-02-28 17:47:04
1190
原创 视频播放器倍速、清晰度切换、m3u8下载
JiaoZi的播放器控件是 JZVideoPlayerStandard。所有关于播放器布局控件的操作都需要通过该控件,能满足一般的视频播放需求。但是如果需要在 JiaoZi 播放器中添加按钮,就需要自定义JZVideoPlayerStandard, 比如倍速播放、下载、清晰度切换等功能。如果不需要修改布局,直接在xml布局文件中使用即可。a、重写 XML。
2023-02-20 14:03:51
993
原创 Chrome浏览器启动命令行参数
1028 --trace-startup-file 如果提供,则设置将存储启动跟踪的文件,如果省略,则默认将在当前目录中使用“chrometrace.log”。示例:-trace-startup–trace-startup-file=/tmp/trace_event.log作为一种特殊情况,可以设置为’none’-这会禁用自动将结果保存到文件中,并且第一个手动记录的跟踪将然后从启动后接收所有事件。1051 --use-file-for-fake-audio-capture 播放.wav文件作为麦克风。
2023-02-14 16:50:18
875
原创 TCP协议中的Ack和Seq号
发送方的包,包括seq和len,接收方如何告知对方数据已经收到呢?答案就在于接收方的ack=发送方的seq+发送方的len。整体来讲,就是这样。特殊情况在于三次握手时,客户端、服务端握手时,len=0,此时对方就不是ack=seq+0,而是ack=seq+1。
2023-02-07 13:43:34
3584
转载 chromium blink core outline
线程可以执行任务而不干扰用户界面一个worker是使用一个构造函数创建的一个对象(e.g. Worker()) 运行一个命名的JavaScript文件 这个文件包含将在工作线程中运行的代码;否则,v8 :: Isolate :: GetCurrentContext()将返回错误的上下文,在最坏的情况下,它将最终泄漏对象并导致安全问题。在Chrome中,每个渲染进程都有一个V8 Isolate,所有被同一个渲染进程处理的站点的JavaScript代码在同一个Isolate中运行。工作线程有自己的隔离。
2022-12-24 13:47:40
222
原创 Linux 操作系统错误代码解释
错误代码147 :锁表已满;操作系统错误代码81: a. out文件中的.lib段损坏。操作系统错误代码118:不是一个XENIX命名类型的文件。操作系统错误代码84:无效或不完整的多字节以及宽字符。操作系统错误代码88:在非套接字接口进行套接字操作。操作系统错误代码25:不适当的设备ioctl使用。操作系统错误代码75:数值超过对于给定的数据类型。操作系统错误代码85:中断的系统调用需要重新启动。错误代码137:没有更多的记录(已读至文件尾)操作系统错误代码80:访问了一个损坏的共享库。
2022-12-14 10:43:55
3258
转载 viewport 深入理解
在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或响应各种不同分辨率的移动设备。一、viewport的概念通俗的讲,移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大
2022-11-23 13:42:07
227
转载 View系列:硬件加速,从理论到实践
通过这样更进一步的缓存方式,View 的重绘效率进一步提高了:只要绘制的内容没有变,那么不论是 CPU 绘制还是 GPU 绘制,它们都不用重新计算,而只要只用之前缓存的绘制结果就可以了。基于这样的原理,在进行移动、旋转等**无需调用 invalidate()**的属性动画的时候,开启 Hardware Layer 将会极大地提升动画的效率,因为在动画过程中 View 本身并没有发生改变,只是它的位置或角度改变了,而这种改变是可以由 GPU 通过简单计算就完成的,并不需要重绘整个 View。
2022-10-08 18:19:32
719
原创 H5页面与原生交互的方法之 一、addJavascriptInterface
addJavascriptInterface有很大的安全隐患(通过js获取高权限,盗取用户信息、运行病毒代码等等),特别是4.2之前,4.2及以上版本(API >= 17)新增了@JavascriptInterface注解来提高安全等级,没有注解的方法,js无法调用,并在4.4版本增加了带回调的方法webview.evaluateJavascript(s,valuecallback),但仍有更安全的交互方式;3、4.4版本以上,调用带返回值js方法。java调用带返回值的js方法。js创建被调用的方法。
2022-09-19 16:17:24
1000
转载 Android 之 WebView开发问题及优化
当我们在WebView中加载出从web服务器上拿取的内容时,是无法访问本地资源的,如assets目录下的图片资源,因为这样的行为属于跨域行为(Cross-Domain),而WebView是禁止的。当我们做类似上拉加载下一页这样的功能的时候,页面初始的时候需要知道当前WebView是否存在纵向滚动条,如果有则不加载下一页,如果没有则加载下一页直到其出现纵向滚动条。哪些资源需要我们去存储在本地呢,当然是一些不会被更新的资源,例如图片文件,js文件,css文件,替换的方法也很简单,重写WebView的方法即可。
2022-09-14 22:46:24
1540
原创 HTML引入CSS样式三种方法及优先级
css的样式引用由3种方式。分别为行内样式、内部样式(嵌入式)和外部样式;行内样式: 在对象的标记内使用对象的style属性定义适用的样式表属性,格式定义为 :;内部样式(嵌入式):是由标记对放在中;
2022-09-08 11:18:26
2959
原创 typeof使用以及null和undefined的判断区分
但是有一点缺陷就是函数和对象以及DOM对象返回的值都是object,所以typeof用来监测数据类型的时候,如果监测基本数据类型还比较可靠,但是监测对象的时候却无太大作用。if(typeof(exp) == 'object' && exp == null){ //同时进行类型和内容的判断。//var exp;//这种方法才是正确的,注意undefined加"" ,因为typeof返回的值是一个字符串类型的。如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
2022-09-02 15:21:41
1985
转载 Gyp语法规则参考 & 工具的使用
配置文件都是以.gyp结尾每个.gyp文件都描述了如何去构建项目每个.gyp在Mac上,.gyp文件会生成Xcode项目文件,包含了如何构建项目。一个.gyp文件会生成的一个.xcodeproj在Windows上,.gyp文件会生成Visual Studio项目文件。一个.gyp文件会生成一个.sln,并为每个targets生成一个.vcproj在Linux上,.gyp文件会生成Makefile文件.gyp文件的语法是Python数据格式(Json格式).gypi文件可以被.gyp。...
2022-08-08 15:15:42
1851
原创 chromium55 http respone堆栈
> content.dll!content::WebURLLoaderImpl::Context::OnReceivedResponse(const content::ResourceResponseInfo & initial_info) Line 710 C++ content.dll!content::WebURLLoaderImpl::RequestPeerImpl::OnReceivedResponse(const content::ResourceResponseInfo
2022-08-08 10:33:48
386
linux环境编程
2017-09-29
FLEX从入门到精通
2017-09-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人