音视频 ijkplayer 源码解析系列1--播放器介绍

349 阅读5分钟

整个系列的文档链接如下,贴出来方便大家直接跳转:

音视频 ijkplayer 源码解析系列1--播放器介绍

音视频 ijkplayer源码解析系列2--如何解码图像

音视频ijkplayer源码解析系列3--解码流程

音视频ijkplayer源码解析系列4--ijkplayer里面如何使用SDL渲染

音视频ijkplayer源码解析系列5--初始化源码拆解

# 音视频ijkplayer源码解析系列6--pipeline和node解析

1、ijkplayer是什么

ijkplayer是一个基于FFmpeg和SDL的开源Android/iOS视频播放器,由bilibili开发。它支持几乎所有视频格式,具有高效的硬件解码和渲染能力,可以实现流畅的视频播放体验。ijkplayer还提供了丰富的API接口,支持多种播放控制方法和事件监听,可以让开发者灵活地集成和定制播放器。此外,ijkplayer还提供了一些强大的剪辑和水印功能,可以实现视频编辑和个性化定制。

ijkplayer和FFMpeg、SDL的关系是如何的呢?简单来说ffmpeg提供最基础的解码能力,将视频文件解析成特定的二进制流数据(比如我们常见的RGB、YUV),而SDL负责将特定的二进制流文件渲染出来。

2、ijkplayer优缺点及适用场景

2.1 使用场景

  • 高效稳定的音视频直播
  • 视频社交类app的视频播放器
  • 在线视频教育、远程视频会议

2.2 支持的格式

ijkplayer是基于FFmpeg开发的视频播放器,因此其支持的视频格式与FFmpeg支持的格式基本一致。其中,常见的视频格式包括:MP4、AVI、MPEG、WMV、MOV、FLV、MKV、WebM、3GP、ASF。

除了上述格式,ijkplayer还支持一些不太常见的格式,比如VOB、DAT、RM、RMVB等

2.3 优点

  1. 支持几乎所有的视频格式,具有强大的解码能力,能够实现高效的视频播放
  2. 采用基于OpenGL ES 2.0的视频渲染方式,具有更好的视频画质和更高的渲染效率
  3. 提供了丰富的API和多种控制方式,包括手势控制、进度条控制、滑动控制等,方便开发者集成和用户使用
  4. 支持多种视频流传输协议,比如Http、Rtmp等,可以使用不同的网络环境和应用场景
  5. 开源,跨平台

2.4 缺点

  1. 使用操作相对复杂,需要具有一定的音视频开发能力和经验
  2. 与其他商业视频播放器相比,在一些细节或者高级功能上可能存在一些不足
  3. 对于某些Android系统版本和设备型号的兼容性和适配性较差,需要进行额外的优化和开发工作

三、ijkplayer抽象流程

我们以抖音视频播放器为例,浅浅的画出ijkplayer解码和播放的流程,具体的流程解析我们会在后续的章节中持续更新,大家可以先按照下图了解下流程。

ijkplayer流程图.drawio.png

四、ijkplayer流程框架解析

image-20230830091616928.png 整体的播放流程可以参考上图,native发起解析流程,经过jni层来到了c的这一层,主要就是在ff_ffplayer.c这个文件中,其做的主要工作就是先解封装,然后分成音频、视频、字幕三个流,分别在三个线程执行,主要就是也就是用流里解码数据,然后做音画同步和渲染。在上图中有以下的几个概念,我们先大体描述下这几个概念是什么以及相应的作用,在后续中的文档中在继续展开。

常见流:音频、视频、弹幕

Packet概念:在FFmpeg解码过程中,音频数据都是以包(Packet)的形式来传递的。Packet是一个数据单元,包含了一帧音频或视频数据的完整内容,以及相关的元数据,如时间戳、数据大小、解码器属性等等。为了提供压缩率,通常会把多帧压缩成一个Packet。

重采样:音频重采样是指将一种采样率的音频转换为另一种采样率的音频的过程。一般情况下,音频重采样是为了使不同采样率的音频能够互相兼容。例如,播放器接受到一个采样率为44.1khz的音频文件,但是你的音频设备只能支持48khz的采样率,这是就需要对音频进行重采样,将其采样率转换到48khz才能播放。

音频渲染:ijkplayer利用FFmpeg和openSL ES。openSL ES的作用有点类似android原生的AudioTrack,是一个音频播放器。音渲染就是把FFmpeg解码后的数据,送人OpenSL ES引擎播放。

视频解码:将编码后的文件格式(比如MP4)转换成YUV格式,常见的就是YUV420。

图片格式转换:ijkplayer会调用opneGL ES(或者Android的canvas)把解码后的文件格式进行颜色空间转换。转换颜色空间的目的:大多数的设备屏幕都是RGB格式,而YUV格式通常是用于传输和存储视频数据的一种格式,所以需要将解码后的YUV格式的数据转换为RGB格式,这样才能最终渲染到屏幕上。

音画同步:实现音画同步的目的是保证视频和音频可以同步播放

五、ffmpeg核心库的作用

在上述流程中其中最为关键的就是ffmpeg相关库的使用了。

其中ffmpeg种核心so的作用如下:

  • libavcodec:包含音视频编码器和解码器
  • libavutil:包含多媒体应用常用的简化编程的工具,比如随机数生成器、数据结构、数学函数等
  • libavformat:包含多种多媒体容器格式的封装、解封装工具
  • libavfilter:包含多媒体处理常用的滤镜功能
  • libavdevice:用于音视频数据采集和渲染等功能的设备相关
  • libswscale:用于图像缩放、色彩空间、像素格式转换等功能
  • libswresample:用于音频重采样和格式转换等功能