[IJKPLAYER]基于DEMO分析IJKPLAYER(整理版本)

背景


        博主主要是从事C语言开发,因此本文着重强调FFMPEG部分,关于JAVA应用和框架层只是一笔带过。IJKPLAYER的实质是对FFMPEG项目中的ffplayer程序进行的二次封装,通过JNI方式完成对外提供JAVA接口。


1.目录结构

  • activities:包含了demo的所有activity;
  • application:
  • content:
  • eventbus:
  • fragments:
  • services:
  • widget:
  • res
  • AndrodManifest.xml

 
2.代码框架流程

  • IjkVideoView.java中调用IMediaPlayer类的方法;
  • IjkMediaPlayer.java对IMediaPlayer的方法进行重写;
  • ijkplayer_jni.c:通过JNINativeMethod做JAVA和C代码的映射;

3.OPT机制

        可设置的opt_category有:OPT_CATEGORY_FORMAT,OPT_CATEGORY_CODEC,OPT_CATEGORY_SWS,OPT_CATEGORY_PLAYER

        ijkMediaPlayer.setOption函数设置的实质:对应jni接口中的IjkMediaPlayer_setOption函数;

OPT_CATEGORY_CODEC
        在options_table.h文件AVOption avcodec_options中定义了FFPLAYER对外提供的关于编解码参数相关的options选项;
 
OPT_CATEGORY_PLAYER
        在ff_ffplay_options.h文件AVOption ffp_context_options中定义了FFPLAYER对外提供的关于播放器的options选项;

3.1.底层选项

3.1.1.ffmpeg(ffplay.c)中的原生option

an禁止音频,默认值0
vn禁止视频,默认值0
nodisp禁止图形显示,默认值0
volume设置播放启动后的音量,范围0~100,默认值100
fast使能非规范兼容优化,默认值0 
loop设置播放次数,范围INT_MIN~INT_MAX,默认值1
infbuf使能不要限制输入缓冲区大小(对实时流有用),默认值0
framedrop使能当CPU太慢时丢帧的功能,默认值0  
seek-at-start设置播放时seek位置,范围0~INT_MAX,默认值0
subtitle使能解码字幕流,默认值0

3.1.2.filter相关

af音频的filter,类型是字符串
vf视频的filter,类型是字符串

3.1.3.ijkplayer(ff_ffplay.c)中扩展的选项

max-fps设置最大的fps,当fps大于max-fps时,将丢弃多余的帧,范围-1~121,默认值31
overlay-format可设置的值为fcc-_es2,fcc-i420,fcc-yv12,fcc-rv16,fcc-rv24和fcc-rv32,默认值fcc-rv32
start-on-prepared启用当准备好后自动播放的功能,默认值1
video-pictq-size设置图片队列的最大的帧数,范围3~16,默认值3
max-buffer-size设置预读取的最大缓冲区,范围0~15M,默认值15M
min-frames设置停止预读取的最小帧数,范围2~50000,默认值50000
first-high-water-mark-ms设置第一次唤醒read_thread线程的时间(毫秒),范围100~5000,默认值100
next-high-water-mark-ms设置下一次唤醒read_thread线程的时间(毫秒),范围100~5000,默认值1000
last-high-water-mark-ms设置最后一次唤醒read_thread线程的时间(毫秒),范围100~5000,默认值5000
packet-buffering使能当失速时,在读取到足够包前,暂停输出,默认值1
sync-av-start同步AV开始时间,默认值1
iformat强制输入格式,默认值NULL
no-time-adjust从媒体流中返回实时时间而不是调整时间
preset-5-1-center-mix-level:
enable-accurate-seek使能seek准确,默认值0
skip-calc-frame-rate禁止帧率计算,默认值0
get-frame-mode警告,该选项只用于获取帧,默认值0

3.2.安卓选项

mediacodec使能mediacode的硬解码h.264视频功能,默认值0
mediacodec-auto-rotate使能mediacode的自动选装功能,默认值0
mediacodec-all-videos使能mediacode硬解码所有视频功能,默认值0
mediacodec-avc使能mediacode硬解码h.264视频功能(已过时),默认值0
mediacodec-hevc使能mediacode硬解码hevc视频功能,默认值0
mediacodec-mpeg2使能mediacode硬解码mpeg2视频功能,默认值0
mediacodec-mpeg4使能mediacode硬解码mpeg4视频功能,默认值0
mediacodec-handle-resolution-change使能mediacode自动处理分辨率更改功能,默认值0
opensles使能opensles功能(音频),默认值0
soundtouch使能soundtouch功能(音频),默认值0
mediacodec-sync使能使用mediacode时,同步时使用msg_queue,默认值0

4.JNI代码分析


核心代码ff_ffplay.c和ffplay.c

_setDataSource:将URL赋值给IjkMediaPlayer的data_source;将播放器状态修改为MP_STATE_INITIALIZED;_prepareAsync:将播放器状态修改为MP_STATE_ASYNC_PREPARING;创建一个ff_msg_loop线程,作用暂时不详;ffp_prepare_async_l中包含设置OPT和打开流(stream_open)stream_open函数:创建视频刷新线程ff_vout 创建读取线程ff_read线程ff_read的入口函数read_thread:avformat_open_input:打开流avformat_find_stream_info:获取流的详细信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电路】MOS管开关电路

目录 简介: MOS管导通特性 应用实例: MOS管的作用-开关 更好的理解方式: 仿真: 简介: MOS管也就是常说的场效应管(FET),有结型场效应管、绝缘栅型场效应管(又分为…

认知升级:模型与范式转换

你好,我是 EarlGrey,一名双语学习者,会一点编程,目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我,持续获取编程干货、好书推荐和高效工具分享,一起提升认知和思维…

LeetCode - 141. 环形链表 (C语言,快慢指针,配图)

141. 环形链表 - 力扣(LeetCode) 1. 什么是快慢指针 这里我们我们将介绍环形链表的经典解法——快慢指针,简单理解,指针移动快的叫做快指针fast,移动速度慢的叫慢指针slow。一般我们设快指针走两步,慢指针走…

RSS订阅快速连接Notion

数环通让您可以通过不到几分钟的时间即可实现RSS订阅与Notion的对接与集成,从而高效实现工作流程自动化,降本增效! 1.产品介绍 RSS订阅是数环通的内置应用,很多用户通过RSS订阅来收集自己在各大平台上看的内容,当RSS…

【Mycat2实战】三、Mycat实现读写分离

1. 无聊的理论知识 什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增、改、删操作, 而从数据库处理查询操作。 为什么使用读写分离 从集中到分布,最基本的一个需求不是数据存储的瓶颈,而是在于计算的瓶颈&#xff…

java实现插入排序

图解 以下是Java实现插入排序的代码: public class InsertionSort {public static void main(String[] args) {int[] arr {5, 2, 4, 6, 1, 3};insertionSort(arr);System.out.println(Arrays.toString(arr)); // output: [1, 2, 3, 4, 5, 6]}public static void i…

线程安全问题及其解决

文章目录 一. 线程安全问题1.1 线程不安全的例子1.2 线程不安全的原因1.2.1 随即调度, 抢占式执行1.2.2 修改共享数据1.2.3 修改操作非原子性1.2.4 内存可见性1.2.5 指令重排序1.2.6 总结 二. 线程安全问题的解决2.1 synchronized(解决前三个问题)2.1.1 synchronized 的锁是什么…

247:vue+openlayers 根据坐标显示多边形(3857投影),计算出最大幅宽

第247个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中根据坐标显示多边形(3857投影),计算出最大幅宽。这里先通过Polygon来显示出多边形,利用getExtent() 获取3857坐标下的最大最小x,y值,通过ransformExtent转换坐标为4326, 通过turf的turf.distance和计算…

社区论坛小程序系统源码+自定义设置+活动奖励 自带流量主 带完整的搭建教程

大家好啊,又到了罗峰来给大家分享好用的源码的时间了。今天罗峰要给大家分享的是一款社区论坛小程序系统。社区论坛已经成为人们交流、学习、分享的重要平台。然而,传统的社区论坛往往功能单一、缺乏个性化设置,无法满足用户多样化的需求。而…

rabbitmq 集群搭建

RabbitMQ集群介绍 RabbitMQ集群是一组RabbitMQ节点(broker)的集合,它们一起工作以提供高可用性和可伸缩性服务。 RabbitMQ集群中的节点可以在同一物理服务器或不同的物理服务器上运行。 RabbitMQ集群的工作原理是,每个节点在一个…

C++编写的多线程自动爬虫程序

以下是一个使用C编写的爬虫程序&#xff0c;用于爬取Python进行多线程跑数据的内容。本示例使用了Python的requests库来发送HTTP请求&#xff0c;并使用cheeseboy的爬虫ipIP库来设置爬虫ip信息。以下是详细代码和步骤&#xff1a; #include <iostream> #include <stri…

StyleGAN:彻底改变生成对抗网络的艺术

一、介绍 多年来&#xff0c;人工智能领域取得了显着的进步&#xff0c;其中最令人兴奋的领域之一是生成模型的发展。这些模型旨在生成与人类创作没有区别的内容&#xff0c;例如图像和文本。其中&#xff0c;StyleGAN&#xff08;即风格生成对抗网络&#xff09;因其创建高度逼…

12-使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

【Spring Boot】035-Spring Boot 整合 MyBatis Plus

【Spring Boot】035-Spring Boot 整合 MyBatis Plus 【Spring Boot】010-Spring Boot整合Mybatis https://blog.csdn.net/qq_29689343/article/details/108621835 文章目录 【Spring Boot】035-Spring Boot 整合 MyBatis Plus一、MyBatis Plus 概述1、简介2、特性3、结构图4、相…

LeetCode - 27. 移除元素 (C语言,快慢指针,配图)

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路一&#xff1a;新开辟一个数组&#xff0c;空间复杂度O(N) 因为本题要求是空间复杂度O(1),所以这里只是列出思路1的思路和配图&#xff0c;并没有具体的实现代码&#xff0c;想必这对大家一定很简单…

使用postman测试

第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a;添加请求 第四步&#xff1a;填写请求 代码实现自动关联的位置&#xff1a; 为相关联的接口设置环境&#xff1a; 使用设置的环境变量&#xff1a; 参数化实现测试&#xff1a;测试脚本中仅测试数据不一样&#xff…

Promise 重写 (第一部分)

学习关键语句&#xff1a; promise 重写 写在前面 重新学习了怎么重写 promise &#xff0c; 我觉得最重要的就是要有思路&#xff0c;不然有些 A 规范是完全想不到的 开始 重写函数的过程中, 最重要的是有思路 我们从哪里获取重写思路? 从正常的代码中 我们先看正常的代码…

『GitHub项目圈选02』一款可实现视频自动翻译配音为其他语言的开源项目

&#x1f525;&#x1f525;&#x1f525;本周GitHub项目圈选****: 主要包含视频翻译、正则填字游戏、敏感词检测、聊天机器人框架、AI 换脸、分布式数据集成平台等热点项目。 1、pyvideotrans pyvideotrans 是一个视频翻译工具&#xff0c;可将一种语言的视频翻译为另一种语…

学习c#的第十三天

目录 C# 多态性 静态多态性 函数重载 运算符重载 动态多态性 virtual 和 abstract 抽象方法和虚方法的区别 重载(overload)和重写(override) 隐藏方法 C# 多态性 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性意味着有多重形式。在面向对象编程范式中…

Postman的Cookie鉴权

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;什么是Cookie 定义&#xff1a;存储在客户端的一小段文本信息&#xff0c;格式为键值对的形式. 二&#xff09…