baiiu
每天前进三十公里
展开
-
MediaCodec源码分析 ACodec状态机详解
UninitializedState:未初始化状态。在业务层调用完成后切换到LoadedState。LoadedState:表示解码器已经加载完了;调用,和后,在LoadedState::onStart中调用让omx进入可Idel状态,后切换到LoadedToIdleState状态。LoadedToIdleState:初始化Buffer,解码器可用了;在接收到OMX_StateIdle返回后,并发送让omx切换到执行态,后切换到IdleToExecutingState状态。原创 2024-03-17 10:55:06 · 214 阅读 · 0 评论 -
MediaCodec源码分析 状态简单介绍
本文分析MediaCodec.h层的状态机,下篇介绍ACodec状态机,基于7.0代码。During its life a codec conceptually exists in one of three states: Stopped, Executing or Released.Stopped 状态具有三个子状态:Uninitialized、Configured 和 Error。有三种方式可以使 MediaCodec 进入 Uninitialized 子状态:使用工厂方法创建 MediaCodec原创 2024-03-17 10:43:17 · 111 阅读 · 0 评论 -
MediaCodec源码分析 Codec消息轮转
本文梳理MediaCodec的消息轮转流程,基于7.0代码。MediaCodec底层实现为JMediaCodec、MediaCodec.cpp、ACodec,他们之间是通过media包下的ALooper、AHandler、AMeesage这一套机制进行线程间通信的。本文就是分析这里的流程,先分析ALooper这一套,然后再分析MediaCodec.java是怎么调用操作下去的,ACodec又是如何跟MediaCodec.cpp通信的。原创 2024-03-13 11:38:59 · 288 阅读 · 2 评论 -
Android Native Hook 深入理解PLT hook
本文介绍NativeHook技术里的PLT hook,参考开源的xhook和bhook进行理解,本文不涉及该hook技术源码的分析,只分析大体原理,用于在进行修复稳定性问题时候寻找hook点使用。原创 2023-12-22 20:28:28 · 1481 阅读 · 0 评论 -
Android 深入理解SurfaceView
更改layoutParams、surfaceView.setVisibility、滑动等基本任何一个对view的操作都会引起updateWindow,所以我们在对SurfaceView操作的时候要加倍小心,避免引起多次updateWindow,从回调上看,就是避免多次触发sufaceChange。通过调整surfaceViewContainer大小、surfaceHolder.setFixedSize,这三种方式均能触发surfaceChange。原创 2023-09-24 21:18:17 · 551 阅读 · 0 评论 -
MediaCodec源码分析 configure流程
本文梳理MediaCodec configure流程,基于7.0代码,这里只分析AVC和HEVC的视频硬解,流程图如下。原创 2023-09-12 08:00:00 · 362 阅读 · 0 评论 -
MediaCodec源码分析 createByCodecName流程
本文梳理MediaCodec初始化流程,即create流程,基于7.0代码。流程图如下,创建流程还是比较清晰简单的。原创 2023-09-07 08:00:00 · 337 阅读 · 0 评论 -
Android 设置线程优先级源码分析
Android中设置线程优先级有thread.setPriority()方式和Process. setThreadPriority()两个方法。使用Process. setThreadPriority()进行更精准的设置,thread.setPriority可能会将线程优先级设置的比background还低,导致线程运行获取不到足够的时间片,出现不可知问题。本篇文章对这两种设置线程优先级的API的进行源码分析。原创 2023-05-27 17:26:26 · 519 阅读 · 0 评论 -
Android 创建线程源码分析 JavaThread&NativeThread
本文分析在Android中创建线程时候的源码分析,即JavaThread和NativeThread。原创 2023-05-20 17:59:32 · 775 阅读 · 0 评论 -
Android 性能优化 命令行查看CPU使用率
本文介绍cpu使用率概念,和使用ps命令、top命令和dumpsys cpuinfo命令来查看cpu使用率,帮助我们了解应用程序在运行过程中的整体状态和各个线程状态。原创 2023-05-06 23:28:21 · 4134 阅读 · 0 评论 -
音视频 HLS协议和m3u8格式分析
HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。HLS是提供一个m3u8地址,他俩的区别可以说HLS是协议,m3u8是文件格式;原创 2022-09-05 08:13:48 · 1704 阅读 · 0 评论 -
音视频 TS格式解析
前言本文介绍TS文件封装格式,是一种被广泛应用的文件格式。全称为MPEG2-TS。其中TS即"Transport Stream"的缩写。PS和TS如下图所示,PES封包后能按需打出PS流和TS流,其中区别如下:MPEG2-PS主要应用于存储的具有固定时长的节目,全称是Program Stream,如DVD电影;MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。PS 流 (Program Stream):节目流,PS 流由 PS 包组成,而一个 PS 包又由若干个 PES 包组成。原创 2021-08-15 12:54:29 · 8221 阅读 · 4 评论 -
FFmpeg学习 avcodec软解码函数分析
前言本文分析ffmpeg软解码流程,相关函数如下,以find_stream_info中的try_decode_frame为例;相关函数都在libavcodec包下。const AVCodec *codec = find_probe_decoder(s, st, st->codecpar->codec_id);/* * Force thread count to 1 since the H.264 decoder will not extract * SPS and PPS to ex原创 2021-07-29 10:54:27 · 1189 阅读 · 0 评论 -
FFmpeg学习 av_read_frame()函数分析
前言本文分析av_read_frame函数,该函数在libavformat包下。/** * Return the next frame of a stream. * This function returns what is stored in the file, and does not validate * that what is there are valid frames for the decoder. It will split what is * stored in the fi原创 2021-07-22 11:03:17 · 979 阅读 · 0 评论 -
ijkplayer源码分析 FrameQueue分析
前言上一篇文章介绍了PacketQueue,本文介绍FrameQueue。FrameQueue结构体FrameQueue结构体,持有queue数组,是基于环形队列实现的;rindex、windex、size、max_size和等待唤醒机制获取读写位置,利用环形队列最大限度节约了空间;默认队列大小为16,最后由max_size = Math.min(max_size,FRAME_QUEUE_SIZE)来决定最大的元素个数;其中keep_last表示是否保留上一个可读节点,在frame_queue原创 2021-03-11 15:01:59 · 591 阅读 · 0 评论 -
ijkPlayer源码分析 PacketQueue分析
前言本文介绍PacketQueue,相对于FrameQueue来说比较简单,可以类比Android中的MessageQueue。PacketQueue总体介绍单向链表结构。first_pkt、last_pkt,是链表的起点和终点结点;recycle_pkt链表用于节点复用;是一个多线程安全队列,靠等待唤醒机制保证线程安全;当遇到flush_pkt时,serial加1自增,标志着流序列变化,区分是否是连续的流;typedef struct MyAVPacketList { AVPack原创 2021-03-11 14:52:33 · 595 阅读 · 0 评论 -
FFmpeg学习 avformat_find_stream_info()函数分析
前言本文分析avformat_find_stream_info函数,该函数在libavformat包下。/** * Read packets of a media file to get stream information. * This is useful for file formats with no headers such as MPEG. * This function also computes the real framerate in case of MPEG-2 repe原创 2021-02-10 17:39:32 · 1634 阅读 · 2 评论 -
FFmpeg学习 avformat_open_input()函数分析
前言本文梳理libavformat包下的avformat_open_input函数。通读avformat_open_input,主要功能是:根据传入的filename确定了要使用的协议URLProtocol,比如http的或是file类型的协议;然后按该协议循环从2048byte大小2的幂次递增开始读取数据,然后再遍历所有的AVInputFormat,确定是个什么格式的数据,flv啊还是mp4啥的;调用AVInputFormat#read_header读取数据文件格式AVI原创 2021-02-03 14:47:00 · 3537 阅读 · 4 评论 -
FFmpeg学习 总体介绍
前言前面文章学习ijk后,之后开始对FFmpeg进行学习。FFmpeg是很优秀的音视频库,将会进行深入学习。本文介绍FFmpeg大概模块、结构体和基本使用,之后在遇到具体函数会对具体函数进行分析。模块介绍libavformat该模块下实现了目前绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、TS等文件格式;RTMP、RTSP、HLS等网络协议封装格式。FFmpeg可以在编译时按需选择要支持哪些封装格式。另外也可以增加自己定制的封装格式,只需添加自己的封装处理模块muxer、dem原创 2021-02-03 14:39:43 · 363 阅读 · 0 评论 -
ijkplayer源码分析 start流程和buffering缓冲策略
前言本文是分析ijkPlayer中的start流程和buffering机制,放在一块分析是因为两部分代码都在对播放状态进行操作,暂停或恢复播放。其中buffering机制也是ijk的核心,是卡顿和延时的核心。关键bool值ffp->render_wait_start:等到start时候再渲染;为0表示不用等start调用,为1表示必须等start调用;ffp->start_on_prepared:prepared之后自动开始读数据流程,不用等start;为0表示必须等star原创 2021-01-28 15:55:36 · 2267 阅读 · 8 评论 -
ijkplayer源码分析 视频向音频同步
前言本文是流程分析的第七篇,分析ijkPlayer中的音视频同步,在video_refresh_thread中。音视频同步基本概念因为音视频是独立线程解码和输出的,如果不进行音视频同步输出的话,则播放时会各播各的,会出现音画不同步的现象,所以需要进行音视频同步输出。有三种同步策略视频同步到音频,即音频为主时钟音频同步到视频,即视频为主时钟视频、音频同步到外部时钟,即外部时钟(系统时间)为主时钟本文分析视频同步到音频的,这也是业界普遍采用的一种方式。因为人们对声音的敏感度比视觉高,优先保证原创 2021-01-21 19:52:53 · 1052 阅读 · 2 评论 -
ijkplayer源码分析 视频解码流程
前言本文是流程分析的第六篇,分析ijkPlayer中的视频解码流程,在video_thread中,如下流程图中所示。IJKFF_Pipenode结构体定义在 ff_ffpipenode.h 和 ff_ffpipenode.cffpipenode表示视频解码器,封装了软解和硬解。// ff_ffpipenode.htypedef struct IJKFF_Pipenode_Opaque IJKFF_Pipenode_Opaque;typedef struct IJKFF_Pipenode IJ原创 2021-01-21 19:49:38 · 1394 阅读 · 0 评论 -
ijkplayer源码分析 音频解码流程
前言本文是流程分析的第三篇,分析ijkPlayer中的音频解码流程,在audio_thread中,如下流程图中所示。音频帧是如何解码的、如何入队的音频帧的解码操作是在audio_thread线程中,audio_thread从packet_queue中读取了音频packet,并软解码成音频帧,放入frame_queue中。音频帧只有软解码,无硬解码。static int stream_component_open(FFPlayer *ffp, int stream_index) { //原创 2021-01-21 19:44:24 · 890 阅读 · 0 评论 -
ijkplayer源码分析 read_thread流程
前言前言本文是流程分析的第四篇,分析ijkPlayer中的read_thread流程,如下流程图中所示。read_thread干了些啥准备阶段:打开文件,检测Stream信息打开音频播放器,创建音频解码线程audio_thread;创建视频解码器,创建视频解码线程video_thread;创建字幕解码线程subtitle_thread;循环读取Packet,解封装,并存入PacketQueuestatic int read_thread(void *arg) { AVForma原创 2021-01-21 19:39:48 · 874 阅读 · 3 评论 -
ijkplayer源码分析 音频播放流程
前言本文是流程分析的第三篇,分析ijkPlayer中的音频播放流程,在aout_thread中,如下流程图中所示。SDL_Aout结构体SDL_Aout是对音频播放的抽象,实现是使用OpenGLES播放和使用AudioTrack播放。// ijksdl_aout.htypedef struct SDL_Aout_Opaque SDL_Aout_Opaque; // 在各自实现类有不同的定义typedef struct SDL_Aout SDL_Aout;struct SDL_Aout {原创 2021-01-21 19:36:08 · 828 阅读 · 0 评论 -
ijkplayer源码分析 视频渲染流程
前言本文是流程分析的第二篇,分析ijkPlayer中的视频渲染流程,在video_refresh_thread中,如下流程图中所示。SDL_Vout和SDL_VoutOverlay结构体SDL_VoutSDL_Vout表示一个显示上下文,或者理解为一块画布,ANativeWindow,控制如何显示overlay。// ijksdl_aout.cstruct SDL_Vout { SDL_mutex *mutex; SDL_Class *opaque_class;原创 2021-01-21 19:24:16 · 1559 阅读 · 0 评论 -
ijkplayer源码分析 整体概述
前言本系列是对ijkPlayer进行源码分析,本篇是对ijkPlayer的整体概述,分析了主要流程、主要结构体和初始化流程,为后面的文章打下基础。主要流程read_thread -> PacketQueue(AVPacket) -> FrameQueue(AVFrame) -> 渲染对应关系PacketQueueFrameQueueClock解码线程渲染线程视频videoqpictqvidclkvideo_threadvideo_refres原创 2021-01-21 19:18:17 · 3739 阅读 · 5 评论 -
音视频 FLV格式解析
格式介绍概览FLV是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。用UltraEdit打开FLV文件,如下图1. 文件头File Header46 4C 56 01 05 00 00 00 09头部分由一下几部分组成Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 B原创 2020-09-07 10:41:25 · 1762 阅读 · 1 评论 -
音视频 H.264格式介绍
名字解释:GOP (图像组)主要用作形容一个 i 帧 到下一个 i 帧之间的间隔了多少个帧。增大图片组(GOP)能有效的减少编码后的视频体积,但是也会降低视频质量。编码后视频的每一组图像(GOP,图像组)都给予了传输中的序列(PPS)和本身这个帧的图像参数(SPS)。SPS(Sequence Parameter Set)序列参数集、PPS(Picture Parameter Set)图像参数集,包含了图像编码的各种参数信息,是作为解码器初始化所必须的参数信息。IDR(Instantaneous原创 2020-09-07 10:34:23 · 15937 阅读 · 1 评论 -
音视频 RTMP协议分析
字节序大小端模式理解字节序Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端;Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:大端模式:低地址 -----------------> 高地址0x12 | 0x34 | 0x56 | 0x78小端模式:低地址 ------------------> 高地址0x78 |原创 2020-08-13 12:03:31 · 793 阅读 · 2 评论