Android --- Ijkplayer源码阅读native层之自定义消息处理机制(四)

Android------- IjkPlayer 源码学习目录 在看了雷霄华的VideoEye后,发现其视图层使用的是SDL在windows上展示的。但是本人是搞Android App开发的,读其源码时,总是感觉有点不对劲。最后在找到了bilibili 为移动端封装ffmpeg的框架------ijkplayer。 Android----ijkplayer的学习目录: ijkplayer 的配置 ijkplayer 配置时,遇到的问题(二) ... 阅读详情

整章目录:Android------- IjkPlayer 源码学习目录

本篇主要介绍Ijkplayer 在native 自定义的消息处理机制,其原理于Android的handler相识。下图红色圈起部分:

native层的消息处理机制本命为message_loop,会在ijkplayer_jni->IjkMediaPlayer_native_setup中被设置到IjkMediaPlayer结构体中的msg_loop变量中。

如果不清楚 IjkMediaPlayer_native_setup的调用过程,请看Android ----- ijkplayer源码阅读Java层(二)

message_loop:

message_loop_n:

注意这里有一个死循环,不停的去队列中取消息。

这里预留一个空间A: post_event方法

ijkmp_get_msg:获取一个消息

这里第二个死循环

msg_queue_get:

/**
 *
 * @param q 消息队列
 * @param msg 存放放回的消息
 * @param block 如果消息队列为空,是否等待。 1为等待,0为不等待
 * @return  >0 表示获得消息成功,否则失败。
 */
/* return < 0 if aborted, 0 if no msg and > 0 if msg.  */
inline static int msg_queue_get(MessageQueue *q, AVMessage *msg, int block)
{
    AVMessage *msg1;
    int ret;
    // 获得操作锁,防止异步
    SDL_LockMutex(q->mutex);

    for (;;) {
        // 是否退出了,返回 -1
        if (q->abort_request) {
            ret = -1;
            break;
        }

        // 获得链表头节点,放入msg1
        msg1 = q->first_msg;

        // 如果存在
        if (msg1) {
            // 将链表头指向下一节点
            q->first_msg = msg1->next;

            if (!q->first_msg)
                q->last_msg = NULL;
            // 链表中的节点数减1
            q->nb_messages--;
            // 将取出节点的内容存储到返回指针指向的地址中
            *msg = *msg1;
            // 取出节点已经使用完毕,清除其内容
            msg1->obj = NULL;
#ifdef FFP_MERGE
            av_free(msg1);
#else
            msg1->next = q->recycle_msg;
            // 将节点回收,下次使用。
            q->recycle_msg = msg1;
#endif
            // 返回1
            ret = 1;
            break;
        } else if (!block) {
            // 不等待,直接返回0
            ret = 0;
            break;
        } else {
            // 等待
            SDL_CondWait(q->cond, q->mutex);
        }
    }
    
    // 释放锁
    SDL_UnlockMutex(q->mutex);
    return ret;
}

都加了注释,理解应该没啥问题。当拿到了一个消息后,会到前面的预留空间A-----调用post_event()将消息传回到Java层

定义了别名

void J4AC_tv_danmaku_ijk_media_player_IjkMediaPlayer__postEventFromNative(JNIEnv *env, jobject weakThiz, jint what, jint arg1, jint arg2, jobject obj)
{
    (*env)->CallStaticVoidMethod(env, class_J4AC_tv_danmaku_ijk_media_player_IjkMediaPlayer.id, class_J4AC_tv_danmaku_ijk_media_player_IjkMediaPlayer.method_postEventFromNative, weakThiz, what, arg1, arg2, obj);
}

class_J4AC_tv_danmaku_ijk_media_player_IjkMediaPlayer.id:调用的Java 类


class_J4AC_tv_danmaku_ijk_media_player_IjkMediaPlayer.method_postEventFromNative: 调用的Java 类中的方法

 

上述操作即是调用IjkMediaPlayer.java 类中的postEventFromNative方法

然后回到Java层,将消息发送给mEventHandler 处理:

ijkplayer Android 端简要使用流程 ijkplayer Android 端的简单使用流程及接口说明 阅读详情

相关推荐

IJKPLAYER源码分析-mediacodec硬解

mediacodec技术是Android系统音视频硬编/硬解的一套标准,各硬件厂商加以实现,常和MediaDrmImageSurfaceAudioTrack一起使用。请参考MEDIACODEC开发文档。由上图了解到,一言以蔽之,一端输入、一端输出,input输入的数据提交给codec异步处理后,由output输出再归还给codec。

老中医的博客 1807

ijkplayer 源码分析(2):消息分发处理机制

ijkplayer 源码详解,源码剖析,详细梳理了 ijkplayer 的消息机制,消息分发处理流程。

AlanWang4523 758

IJKPLAYER源码分析-常用API

本文简要介绍IJKPLAYER的几个关键API,站在使用的角度,来审视其内部运作原理。这里以iOS端直播API调用切入。

老中医的博客 1105

Android音视频开发入门(2)MediaPlayer 生命周期及create()分析

MediaPlayer是Android中的一个多媒体播放类,我们用它来控制音视频流或本地音视频资源的播放过程。 这篇blog我们就来从MediaPlayer的生命周期、用法、工作流程、源码来分析。 1. 状态图和及生命周期 1.1 MediaPlayer状态图 反正状态图,都会丢出下面这么一个图噶。 其中蓝色的椭圆表示的是MediaPlayer的状态,弧线表示状态进行过渡。有两种类型的弧,单箭头...

RikkaTheWorld 1599

IJKPLAYER源码分析-总体概述

pipeline是在分析了软硬解及跨平台视频decoder的创建、配置及初始化与音频的跨平台输出共性,从而抽象出来的接口;pipeline定义了配置、初始化和创建视频decoder的接口(包括FFmpeg软解及对应平台硬解decoder),及创建SDL_Aout实例的接口;音频decoder的创建、配置及初始化,则是在SDL_Aout接口里定义;

老中医的博客 1495

IJKPLAYER源码分析-主要队列

对IJKPLAYER播放器内核几个关键的队列的理解,将有助于掌控全局。单链表环形队列。

老中医的博客 925

ijkplayer 入门之Error事件源码简单跟踪

MediaPlayer对于Error事件的接收都是通过Handler来处理的(其实还包括了Info事件),而这个Handler就是EventHandler,而消息的发送则在postEventFromNative,看名字就可以很容易知道,这个代码是给C调用的。//不完整代码 private static class EventHandler extends Handler { pri

jack123lian的博客 4219

ijkplayer源码分析 整体概述

前言 本系列是对ijkPlayer进行源码分析,本篇是对ijkPlayer的整体概述,分析了主要流程、主要结构体和初始化流程,为后面的文章打下基础。 主要流程 read_thread -> PacketQueue(AVPacket) -> FrameQueue(AVFrame) -> 渲染 对应关系 PacketQueue FrameQueue Clock 解码线程 渲染线程 视频 videoq pictq vidclk video_thread video_refres

baiiu 4307

应用层-Ijk-ffmpeg消息实现机制

1.初始化准备1.1 应用层的初始化准备IjkVideoView.setVideoURI--> IjkVideoView.openVideo { // 将各类监听回调接口设置给IjkMediaPlayer。IjkVideoView对外也提供设置这些监听器的接口 mMediaPlayer = createPlayer(mSettings.getPlayer())

lin111000713的专栏 757

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 452

Python自动化神器:OP插件64位版从安装到实战(附雷电模拟器截图技巧)

本文详细介绍了Python自动化神器OP插件64位版的安装与实战应用,包括环境搭建、窗口控制、鼠标键盘模拟等核心功能。特别针对雷电模拟器提供了最小化截图技术和OCR识别优化方案,帮助开发者高效实现Windows自动化任务。

weixin_29094539的博客 330

Android ---- Ijkplayer阅读native层源码之IjkMediaPlayer_prepareAsync(五)

IjkMediaPlayer_prepareAsync的作用为播放器播放前做准备。其被Java层的IjkMediaPlayer.prepareAsync调用。 IjkMediaPlayer_prepareAsync: static int ijkmp_prepare_async_l(IjkMediaPlayer *mp) { 省略。。。。 // 1.向消息链表发送一个FFP_MSG_PLAYBACK_STATE_CHANGED消息,改变IjkMediaPlayer的状态为MP_.

silently_frog的博客 2044

Proteus实现电子秤仿真与称重检测显示

Proteus实现电子秤仿真与称重检测显示测量原理(或设计方案)原理图代码 测量原理(或设计方案) 数字电子秤总体框图如图所示: 金属箔式应变片工作原理 电阻丝在外力作用下发生机械变形时,其电阻值发生变化,这就是电阻应变效应,描述 电阻应变效应的关系式 金属箔式应变片就是通过光刻、腐蚀等工艺制成的应变敏感元件。如图所示,将四个金属箔应变片(R1、R2、R3、R4)分别贴在双杆式悬臂梁弹性体的上下两侧,弹性体受到压力发生形变,应变片随悬臂梁形变被拉伸或被压缩 测量电路 通过应变片转换悬臂梁被测部位受力

Matataya的博客 1万+

Android ----- ijkplayer源码阅读Java层(二)

xxx

silently_frog的博客 869

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ...

开开心心 25万+

全志V3S开发板实战:从零构建嵌入式Linux系统

本文提供了一份针对全志V3S开发板(如LicheePi Zero)的零基础教程,详细指导如何从零开始构建嵌入式Linux系统。内容涵盖编译环境搭建、交叉工具链配置、U-Boot引导程序编译与烧录、Linux内核定制与编译,以及使用Buildroot构建根文件系统,最终实现系统成功启动,帮助开发者深入理解嵌入式系统构建全流程。

tensor9flow的博客 574

Android ijkplayer的使用解析

ijkplayer是Bilibili基于ffmpeg开发并开源的轻量级视频播放器,支持播放本地网络视频,也支持流媒体播放。支持Android&iOS。 导包 ijkplayer导包源码下载https://github.com/lmx-fashion/IjikPlayer 我们需要的只有widget.media的类。  然后进行配置就好了 修改APP下的build.

潇湘夜雨 3248

PINNACLE:PINN自适应配点与实验点选择算法

PINNACLE算法通过引入动态权重机制,实现了PINN训练点选择的自适应优化。该算法基于对训练过程中不同区域学习需求变化的深入理解,设计了平滑过渡的权重函数,确保了模型在不同训练阶段能够优先学习最需要的区域。理论分析和实验结果均表明,PINNACLE不仅能够保证收敛性,而且能够显著提高PINN的性能。这一算法为物理信息神经网络的应用提供了重要支持,尤其适用于复杂PDE问题的求解。

VectorShift的博客 1136

ijkplayer播放器剖析(二)消息机制分析

ijkplayer播放器剖析(二)消息机制分析

m0_60259116的博客 774

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2910

基于simulink构建一个完整的航空航天器姿态控制与导航仿真模型

航空航天器的姿态控制与导航系统是确保飞行器稳定运行和精确执行任务的核心技术。其目标是通过传感器获取飞行器的状态信息,并利用控制器调整飞行器的姿态,使其按照预定轨迹飞行。基于MATLAB/Simulink平台进行航空航天器姿态控制与导航系统的建模与仿真,可以帮助研究者验证算法性能并优化系统的动态响应。本项目旨在构建一个完整的航空航天器姿态控制与导航仿真模型,包括飞行器动力学建模、传感器模块设计、控制器实现以及导航算法仿真,并通过仿真分析其性能。

xiaoheshang_123的博客 272

IJKPLAYER源码分析-主结构体

本文来介绍下IJKPLAYER的几个主要结构体。主要有以下几个:IjkMediaPlayer:是IJKPLAYER的外围结构体,最接近于caller层,主要包装了FFPlayer结构;FFPlayer:这个代表的是IJKPLAYER播放器内核的结构;VideoState:这个是FFPLAY的上下文,被IJKPLAYER包装在了FFPlayer中;

老中医的博客 945

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

解析Android JNI机制

Android深入理解JNI

DreamWendy 4903

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ijkplayer源码分析 —— 事件消息设计

1. 事件消息队列设计 1.1 结构体对象定义 ff_ffmsg_queue.h 消息、队列结构体定义和功能函数 // 消息结构体(节点) typedef struct AVMessage { int what; //消息类型 int arg1; //整型可选参数 int arg2; //整型可选参数 void *obj; //无类型可选动态内存参数 void (*free_l)(void *obj); //用于释放obj指针的内存 } AVMessage; //

u010187654的博客 423

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ijkplayer播放器剖析(三)消息机制分析

一、引言: 上一篇博客中分析了ijkplayer的整个流程,相信大家对其中的消息队列看的也是云里雾里的,所以这里单独会ijkplayer的消息机制做一个分析。 二、代码分析: 先看下消息机制是怎么创建起来的。创建的发起是native_setup函数: static void IjkMediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) { MPTRACE("%s\n", __func__); IjkMedi

achina2011jy的博客 982
上一篇: Android ----Ijkplayer源码阅读native层之动态库的加载和初始化(三)
下一篇: Android --- IjkPlayer提供的播放器设置表
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值