ijkplayer播放器

播放器系列 android播放器:MediaPlayer ExoPlayer ijkplayer_步基的博客-CSDN博客_mediacodec流程

 一 概述

  IJKPlayer是一款基于ffmpeg/ffplay的开源播放器,可支持rtmp/rtsp/hls等多种媒体协议,支持Android/IOS等移动平台。项目地址:https://github.com/Bilibili/ijkplayer,项目地址有可供参考的编译方式。

 IJKPlayer 在 iOS 和 Android 平台上实现的主要差异表现在视频硬解码方案和音视频渲染方案上:

  • iOS
    • 视频硬解码:VideoToolbox
    • 音频渲染:AudioQueue
    • 视频渲染:OpenGL ES
  • Android
    • 视频硬解码:MediaCodec
    • 音频渲染:OpenSL ES、AudioTrack
    • 视频渲染:OpenGL ES、MediaCodec

        (本文主要讲述android版)

          IJKPlayer(Android)主要由Java层和JNI层组成,Java层主要负责业务控制,JNI部分主要功能是完成音视频的播放。JNI层向Java层提供接口调用,形成事件任务,同时以回调的形式向Java层推送事件完成的状态通知。
          Java层主要包括ijkplayer-exo和ijkplayer-java两个类库,分别代表两个不同的播放器。jikplayer-java里面有IMediaPlayer接口和AbstractMediaPlayer抽象类。所以ijkplayer-exo依赖于ijkplayer-java。

编译结果: android/ijkplayer/ijkplayer-java/build/outputs/aar/ijkplayer-java-debug.aar

可供app调用

IJKPlayer 项目的目录结构大致如下:

  • tool:初始化项目工程脚本。
  • config:编译 FFmpeg 使用的配置文件。
  • extra:存放编译 IJKPlayer 所需的依赖源文件, 如 FFmpeg、OpenSSL 等。
  • ijkmedia:核心代码。
    • ijkplayer:播放器数据下载及解码相关。
    • ijksdl:音视频数据渲染相关。

二 简要流程

read_thread -> PacketQueue(AVPacket) -> FrameQueue(AVFrame) -> 渲染

packet_queue_put是ijkplayer封装的一个缓冲区PacketQueue的 的入队方法。PacketQueue是采用链表构建的循环队列,每个节点循环使用,一部分节点空闲,一部分使用中。

                                                                                     图1

 主要结构体:

在native_setup方法中创建了IjkMediaPlayer、FFPlayer、IJKFF_Pipeline
在prepare阶段通过stream_open创建了VideoState。


结构图:

                                                                                        图2

播放流程图:

                                                                                           图3

                                                                                               图4

猜你喜欢

转载自blog.csdn.net/wangbuji/article/details/127008931