IJKPlayer是一款基于ffmpeg/ffplay的开源播放器,可支持rtmp/rtsp/hls等多种媒体协议,支持Android/IOS等移动平台。项目地址: https://github.com/Bilibili/ijkplayer,项目地址有可供参考的编译方式。
“Android/iOS video player based on FFmpeg n3.1, with MediaCodec, VideoToolbox support.”
IJKPlayer(Android)主要由Java层和JNI层组成,Java层主要负责业务控制,JNI部分主要功能是完成音视频的播放。JNI层向Java层提供接口调用,形成事件任务,同时以回调的形式向Java层推送事件完成的状态通知。
Java层主要包括ijkplayer-exo和ijkplayer-java两个类库,分别代表两个不同的播放器。jikplayer-java里面有IMediaPlayer接口和AbstractMediaPlayer抽象类。所以ijkplayer-exo依赖于ijkplayer-java。
ijkplayer-java的底层JNI基于ffplay。在ffplay里面,通过事件循环来实现流程的控制,ijkplayer-java不同于ffplay的事件循环,采用的是消息队列,但在本质上是一样的。
调用流程图:
JNI提供接口形式:

static JNINativeMethod g_methods[] = {{"_setDataSource","(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V",(void *) IjkMediaPlayer_setDataSourceAndHeaders},{ "_setDataSourceFd",       "(I)V",     (void *) IjkMediaPlayer_setDataSourceFd },{ "_setDataSource",         "(Ltv/danmaku/ijk/media/player/misc/IMediaDataSource;)V", (void *)IjkMediaPlayer_setDataSourceCallback },{ "_setVideoSurface",       "(Landroid/view/Surface;)V", (void *) IjkMediaPlayer_setVideoSurface },{ "_prepareAsync",          "()V",      (void *) IjkMediaPlayer_prepareAsync },{ "_start",                 "()V",      (void *) IjkMediaPlayer_start },{ "_stop",                  "()V",      (void *) IjkMediaPlayer_stop },{ "seekTo",                 "(J)V",     (void *) IjkMediaPlayer_seekTo },{ "_pause",                 "()V",      (void *) IjkMediaPlayer_pause },{ "isPlaying",              "()Z",      (void *) IjkMediaPlayer_isPlaying },{ "getCurrentPosition",     "()J",      (void *) IjkMediaPlayer_getCurrentPosition },{ "getDuration",            "()J",      (void *) IjkMediaPlayer_getDuration },{ "_release",               "()V",      (void *) IjkMediaPlayer_release },{ "_reset",                 "()V",      (void *) IjkMediaPlayer_reset },{ "setVolume",              "(FF)V",    (void *) IjkMediaPlayer_setVolume },{ "getAudioSessionId",      "()I",      (void *) IjkMediaPlayer_getAudioSessionId },{ "native_init",            "()V",      (void *) IjkMediaPlayer_native_init },{ "native_setup",           "(Ljava/lang/Object;)V", (void *) IjkMediaPlayer_native_setup },{ "native_finalize",        "()V",      (void *) IjkMediaPlayer_native_finalize },{ "_setOption",             "(ILjava/lang/String;Ljava/lang/String;)V", (void *) IjkMediaPlayer_setOption },{ "_setOption",             "(ILjava/lang/String;J)V",                  (void *) IjkMediaPlayer_setOptionLong },{ "_getColorFormatName",    "(I)Ljava/lang/String;",    (void *) IjkMediaPlayer_getColorFormatName },{ "_getVideoCodecInfo",     "()Ljava/lang/String;",     (void *) IjkMediaPlayer_getVideoCodecInfo },{ "_getAudioCodecInfo",     "()Ljava/lang/String;",     (void *) IjkMediaPlayer_getAudioCodecInfo },{ "_getMediaMeta",          "()Landroid/os/Bundle;",    (void *) IjkMediaPlayer_getMediaMeta },{ "_setLoopCount",          "(I)V",                     (void *) IjkMediaPlayer_setLoopCount },{ "_getLoopCount",          "()I",                      (void *) IjkMediaPlayer_getLoopCount },{ "_getPropertyFloat",      "(IF)F",                    (void *) ijkMediaPlayer_getPropertyFloat },{ "_setPropertyFloat",      "(IF)V",                    (void *) ijkMediaPlayer_setPropertyFloat },{ "_getPropertyLong",       "(IJ)J",                    (void *) ijkMediaPlayer_getPropertyLong },{ "_setPropertyLong",       "(IJ)V",                    (void *) ijkMediaPlayer_setPropertyLong },{ "_setStreamSelected",     "(IZ)V",                    (void *) ijkMediaPlayer_setStreamSelected },{ "native_profileBegin",    "(Ljava/lang/String;)V",    (void *) IjkMediaPlayer_native_profileBegin },{ "native_profileEnd",      "()V",                      (void *) IjkMediaPlayer_native_profileEnd },{ "native_setLogLevel",     "(I)V",                     (void *) IjkMediaPlayer_native_setLogLevel },
};JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
{JNIEnv* env = NULL;g_jvm = vm;if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {return -1;}assert(env != NULL);pthread_mutex_init(&g_clazz.mutex, NULL );// FindClass returns LocalReferenceIJK_FIND_JAVA_CLASS(env, g_clazz.clazz, JNI_CLASS_IJKPLAYER);(*env)->RegisterNatives(env, g_clazz.clazz, g_methods, NELEM(g_methods) );ijkmp_global_init();ijkmp_global_set_inject_callback(inject_callback);FFmpegApi_global_init(env);return JNI_VERSION_1_4;
}

BiliBili-IJKPlayer播放器源码分析(一)相关推荐

  1. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

    https://www.cnblogs.com/harlanc/p/9693983.html 目录 OpenSL ES & AudioTrack 源码分析 创建播放器音频输出对象 配置并创建音 ...

  2. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇...

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  3. 最新哔哩bilibili视频弹幕播放器源码+完整无错带后台/亲测

    正文: 最新哔哩bilibili视频弹幕播放器源码+完整无错带后台/亲测,此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况,测试环境:PHP7.0+MySQL5.6 播放器跨域 ...

  4. PHP哔哩哔哩bilibili视频弹幕播放器源码 带后台版本

    简介: PHP哔哩哔哩bilibili视频弹幕播放器源码 带后台版本 此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况. 环境:PHP7.0+MySQL5.6 优化修复功能: ...

  5. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  6. 超美响应式自适应引导页带音乐播放器源码

    介绍: 超美响应式自适应引导页带音乐播放器源码,纯html源码,右键记事本修改即可~自带音乐播放器,自带自动打字特效,自带网站存活时间,自带随机ACG背景,自适应响应式网页 网盘下载地址: http: ...

  7. THOR:MindSpore 自研高阶优化器源码分析和实践应用

    摘要:这篇文章跟大家分享下THOR的实践应用.THOR算法的部分内容当前已经在MindSpore中开源 本文分享自华为云社区<MindSpore 自研高阶优化器源码分析和实践应用>,原文作 ...

  8. html5 mp3播放器源码,HTML5自定义mp3播放器源码

    audio对象 src兼容.ogg .wav .mp3 width autoplay loop muted静音 播放play() var myAudio = new Audio(); myAudio. ...

  9. 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误

    正文: 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误,此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况,测试环境:PHP7.0+MySQL5.6 安装教程: 1,访问/d ...

最新文章

  1. 各版本jdk下载地址
  2. 学习 git clone 几种不同的协议
  3. Spring Cloud——基于OpenFeign调用PaddleOCR的Restful API服务解决方案
  4. 【PAT甲级 约会】1061 Dating (20 分) C++ 全部AC
  5. Android_Kotlin 代码学习
  6. 字节跳动杯2018中国大学生程序设计竞赛-女生专场题解
  7. php替换图片_php实现图片上传并进行替换操作
  8. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_3_综合案例_文件上传案例的服务器端...
  9. mongodb搭建和基本语法
  10. html状态栏透明,HTML – 如何使我的导航栏略微透明?
  11. unity 获得当前物体_unity 获取物体尺寸
  12. 《JAVA语言程序设计与数据结构》(基础篇)原书第11版 第一章(答案)
  13. ThinkPad R400 Windows7 驱动安装
  14. BackTrack5 下破解无线
  15. 智联+影音,AITO问界M7想干翻的不止理想One
  16. AR地图与虚拟现实技术
  17. Win10运行红色警戒2尤里的复仇联机技巧+防守地图
  18. 263企业邮箱imap服务器,263企业邮箱支持IMAP邮箱搬家功能
  19. c/c++ 洛谷 P1428 小鱼比可爱
  20. virt-install命令详解

热门文章

  1. C. Prepend and Append
  2. 求三角形的周长类的取值范围
  3. CSDN【精品专栏】第26期
  4. Java图像检索库Lire:基本介绍
  5. CRM中客户端的开发
  6. 3D视觉(一):双目摄像头的调用
  7. Android 混合开发优缺点
  8. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度
  9. [论文笔记]Graph Cube: 基于数据仓库和OLAP多维网络
  10. Spring Boot项目同时使用http和https