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. 行人检测与重识别!SOTA算法
  2. pom.xml设置mysql连接_maven工程配置pom.xml实现mybatis的访问数据库操作
  3. Kali Linux
  4. Java中如何实现线程的超时中断
  5. Windows Server 2016系统高级管理系列-DFS分布式文件系统
  6. ITIL小故事-谁动了他的红包
  7. 【转】C#中没有id 没有name C#怎么点击按钮
  8. requests 上传本地文件到服务器
  9. [BZOJ4653 区间]
  10. 实时采集Canal快速入门
  11. 在电脑上怎么做报表新手_初学者在电脑上如何制作电子表格
  12. 学习分析技术【02】--社交网络分析
  13. python图像识别教程pdf_如何使用Python进行PDF图片识别OCR
  14. docker-sync 加速 Laravel Sail 代码同步
  15. 数据防泄密系统,你了解多少呢?
  16. pnpm install出现:ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies
  17. 一、TF2 常用命令
  18. Excel导出模板加数据时,下拉框丢失解决方案
  19. 浅谈短视频背后的社会道德伦理问题(个人观点,仅供参考)
  20. html复选框美化插件,js和css3超酷checkbox复选框美化插件

热门文章

  1. java编程如何判断素数_Java判断素数
  2. 密码算法的概念及常用算法整理
  3. Android Studio 解决错误 Could not find method android() for arguments
  4. java comparator相等_Java Comparator thenComparingDouble()用法及代码示例
  5. Web安全攻防 渗透测试实战指南2
  6. 谷歌词霸2.0谁用谁知道
  7. Html5中的<section>标签的介绍
  8. 明年将突破2000亿元大关,中国母婴行业处在哪个阶段?企业如何应对“危”与“机”?...
  9. jsplumb拖线_jsPlumb插件做一个模仿viso的可拖拉流程图
  10. 从键盘输入正整数n,编程计算并输出1~n的和。