IJK源码分析-android篇

        整个IJK播放器框架相较于原始ffplay.c播放器,在三处进行了抽象,分别是:
(1)解码器配置初始化操作,对应的数据结构是:
 

struct IJKFF_Pipeline {SDL_Class             *opaque_class;IJKFF_Pipeline_Opaque *opaque;void            (*func_destroy)             (IJKFF_Pipeline *pipeline);IJKFF_Pipenode *(*func_open_video_decoder)  (IJKFF_Pipeline *pipeline, FFPlayer *ffp);SDL_Aout       *(*func_open_audio_output)   (IJKFF_Pipeline *pipeline, FFPlayer *ffp);IJKFF_Pipenode *(*func_init_video_decoder)  (IJKFF_Pipeline *pipeline, FFPlayer *ffp);int           (*func_config_video_decoder)  (IJKFF_Pipeline *pipeline, FFPlayer *ffp);
};

在该抽象里针对视频,完成了mediacodec方式解码和软解码的统一接入,对音频实现了opensles的渲染方式和audiotrack方式渲染,这很自然,因为视频的重点是解码,而音频的重点是渲染,当然,不是说视频的渲染不重要,于是有了第二个抽象SDL_Vout。

        对于android平台,该数据结构实际上就是通过接口ffpipeline_create_from_android创建为平台专有的,具体流程是:

(2)视频渲染,对应的数据结构是:

struct SDL_Vout {SDL_mutex *mutex;SDL_Class       *opaque_class;SDL_Vout_Opaque *opaque;SDL_VoutOverlay *(*create_overlay)(int width, int height, int frame_format, SDL_Vout *vout);void (*free_l)(SDL_Vout *vout);int (*display_overlay)(SDL_Vout *vout, SDL_VoutOverlay *overlay);Uint32 overlay_output_format;
};
其中SDL_VoutOverlay的定义是:
struct SDL_VoutOverlay {int w; /**< Read-only */int h; /**< Read-only */Uint32 format; /**< Read-only */int planes; /**< Read-only */Uint16 *pitches; /**< in bytes, Read-only */Uint8 **pixels; /**< Read-write */int is_private;int sar_num;int sar_den;SDL_Class               *opaque_class;SDL_VoutOverlay_Opaque  *opaque;void    (*free_l)(SDL_VoutOverlay *overlay);int     (*lock)(SDL_VoutOverlay *overlay);int     (*unlock)(SDL_VoutOverlay *overlay);void    (*unref)(SDL_VoutOverlay *overlay);int     (*func_fill_frame)(SDL_VoutOverlay *overlay, const AVFrame *frame);
};

该抽象实现了mediacodec解码器接口surface渲染和opengl方式渲染的统一接入接口。

(3)把从av_read_frame接口返回的packet进行解码,并queue_picture放置到渲染帧队列里去这个过程进行抽象,形成IJKFF_Pipenode:

struct IJKFF_Pipenode {SDL_mutex *mutex;void *opaque;void (*func_destroy) (IJKFF_Pipenode *node);int  (*func_run_sync)(IJKFF_Pipenode *node);int  (*func_flush)   (IJKFF_Pipenode *node); // optional
};

IJK播放器经过以上三点抽象后,形成与ffplay不同的整体架构:

1,IJK基于mediacodec硬解码的渲染流程

        IJK播放器如果是使用mediacodec硬解码,则是用mediacodec的config接口设置进来的surface直接渲染,实际上并没有将Frame传递给其他模块,若想通过OpenGL方式渲染,走软解渲染一样的流程,则必须进行定制开发。

2,IJK基于软解的渲染流程

    IJK基于软解的渲染是通过OpenGL方式渲染的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/111812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest测试框架的基本使用与介绍

前言 我发现大家好像很喜欢pytest的内容&#xff0c;那么今天呢我想好好的给大家介绍一下pytest测试框架的一个基本使用。废话不多说了&#xff0c;咱们直接进入主题&#xff0c;喜欢我的可以关注我哟。 pytest介绍 pytest是一个非常成熟的全功能的Python测试框架&#xff0…

【Java】基础知识

Java程序的结构 源文件&#xff08;扩展名为*.java)&#xff1a;源文件带有类的定义。类用来表示程序的一个组件&#xff0c;小程序或许只会有一个类。类的内容必须包含在花括号里面。类&#xff1a;类中带有一个或多个方法。方法必须在类的内部声明。方法&#xff1a;在方法的…

滑动时间窗口的思想和实现,环形数组,golang

固定时间窗口 在开发限流组件的时候&#xff0c;我们需要统计一个时间区间内的请求数&#xff0c;比如以分钟为单位。所谓固定时间窗口&#xff0c;就是根据时间函数得到当前请求落在哪个分钟之内&#xff0c;我们在统计的时候只关注当前分钟之内的数量&#xff0c;即 [0s, 60…

面试题四:请解释一下watch,computed和filter之间的区别

watch与computed、filter&#xff1a; watch:监控已有属性&#xff0c;一旦属性发生了改变就去自动调用对应的方法 computed:监控已有的属性,一旦属性的依赖发生了改变&#xff0c;就去自动调用对应的方法.computed有详细的介绍&#xff0c;移步computed的使用 filter:js中为…

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

西南最大直播产业园 天府蜂巢成都直播产业基地正式落户天府新区

新蓝图已然绘就&#xff0c;新征程击鼓催征。近年来&#xff0c;四川电子商务行业的发展势头日益强劲&#xff0c;为助力成都直播产业的多元化发展&#xff0c;由树莓集团和德商产投合作共建开展的中国西部最大电娱直播产业基地——成都天府蜂巢直播产业基地落户天府新区。该基…

线程的生命周期

CV大师--好文章的搬运工 知乎有质量的文章是真多 CSDN鱼龙混杂 大部分是鱼 原文章:线程的生命周期及其六种状态的转换 - 知乎 (zhihu.com) --------------------------------------------------------------------------------------------------- 线程的生命周期 线程的…

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

Redis五大基本数据类型

1、字符串类型 字符串类型相当于 java 中的 String 类型。Redis 中的 String 类型以二进制方式存储&#xff0c;不会做任何的编码转换&#xff0c;因此不仅仅可以存储文本数据、整数、普通的字符串、JSON、xml文件&#xff0c;还可以存储图片、视频、音频。String 存储的种类虽…

【踩坑篇】代码中使用 Long 作为 Map的Key存在的问题

本周的工作结束&#xff0c;详述一些在项目代码中实际遇到的一些坑。 代码中遇到这样一个场景&#xff1a; 有个业务接口&#xff0c;接口返回的值是一个JSON格式的字符串&#xff0c;通过JSON解析的方式&#xff0c;解析为格式为&#xff1a; Map<Long, Map<String, O…

【物联网】常见电子元器件(电阻、电容、电感、二极管、三极管)综合,详细分析原理及其应用

电子元器件是现代电子技术的基础&#xff0c;它们在各个领域中发挥着重要作用。从三极管到电容器、电阻器&#xff0c;这些常用元器件承担着放大、开关、滤波等关键任务。它们的特性和组合方式决定了电路的性能和功能。本文将介绍常用电子元器件的工作原理和应用场景&#xff0…

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

前言 本篇在讲什么 调试Lua源码 本篇需要什么 对Lua语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题 &#x1f448; &…