不少读者很多是以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