ijkplayer框架深入剖析

本文深入剖析ijkplayer,基于FFPlay的轻量级播放器,适用于Android和iOS。文章介绍了ijkplayer的目录结构,初始化流程,核心代码涉及数据读取、音视频解码、渲染及同步。重点讨论了音视频解码方式选择,包括软解和硬解,以及音视频同步策略。
摘要由CSDN通过智能技术生成

不少读者很多是以ijkplayer为播放内核。因为编译简单,接口使用方便。核心部分是移植了ffplay.c中的代码。今天分享这篇文章是金山云团队,调研分析的ijkplayer框架代码。涉及了一些基本流程。对于想了解ijkplayer的同学算是很好的借鉴。

随着互联网技术的飞速发展,移动端播放视频的需求如日中天,由此也催生了一批开源/闭源的播放器,但是无论这个播放器功能是否强大、兼容性是否优秀,它的基本模块通常都是由以下部分组成:事务处理、数据的接收和解复用、音视频解码以及渲染,其基本框架如下图所示:

播放器基本框图

针对各种铺天盖地的播放器项目,我们选取了比较出众的ijkplayer进行源码剖析。它是一个基于FFPlay的轻量级Android/iOS视频播放器,实现了跨平台的功能,API易于集成;编译配置可裁剪,方便控制安装包大小。

本文基于k0.7.6版本的ijkplayer,重点分析其C语言实现的核心代码,涉及到不同平台下的封装接口或处理方式时,均以iOS平台为例,Android平台大同小异,请大家自行查阅研究。

一、总体说明

打开ijkplayer,可看到其主要目录结构如下:

  • tool 初始化项目工程脚本

  • config 编译ffmpeg使用的配置文件

  • extra 存放编译ijkplayer所需的依赖源文件, 如ffmpeg、openssl等

  • ijkmedia 核心代码 

    • ijkplayer 播放器数据下载及解码相关

    • ijksdl 音视频数据渲染相关

  • ios iOS平台上的上层接口封装以及平台相关方法

  • android android平台上的上层接口封装以及平台相关方法


在功能的具体实现上,iOS和Android平台的差异主要表现在视频硬件解码以及音视频渲染方面,两者实现的载体区别如下表所示:

二、初始化流程

初始化完成的主要工作就是创建播放器对象,打开ijkplayer/ios/IJKMediaDemo/IJKMediaDemo.xcodeproj工程,可看到IJKMoviePlayerViewController类中viewDidLoad方法中创建了IJKFFMoviePlayerController对象,即iOS平台上的播放器对象。查看ijkplayer/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m文件,其初始化方法具体实现如下:可发现在此创建了IjkMediaPlayer结构体实例_mediaPlayer:在该方法中主要完成了三个动作:创建IJKMediaPlayer对象通过ffp_create方法创建了FFPlayer对象,并设置消息处理函数。

创建图像渲染对象SDL_Vout

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值