[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。一般我们设快指针走两步,慢指针走…

多种方法实现conda环境迁移

Conda 为包管理器和虚拟环境管理器。在配置完项目环境,进行了编写和测试代码,需要大量数据测试运行时,需要将其移至另一台主机上。Conda 提供了多种保存和移动环境的方法。 方法1: scp拷贝法,直接将envs的环境文件夹…

RSS订阅快速连接Notion

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

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

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

6.11.面图层(Polygon)

愿你出走半生,归来仍是少年&#xff01; 通过面图层可实现一个面的绘制&#xff0c;该面可包含多个孔洞。 1.构造 Polygon()Polygon(MapView mapView) 2. 顶点管理 voidsetPoints(List<GeoPoint> points)voidaddPoint(GeoPoint p)List<GeoPoint>getPoints() 通…

Python算法——树的直径

Python中的树的直径算法详解 树的直径是树中任意两个节点之间最长路径的长度。在本文中&#xff0c;我们将深入讨论树的直径问题以及如何通过深度优先搜索&#xff08;DFS&#xff09;算法来解决。我们将提供Python代码实现&#xff0c;并详细说明算法的原理和步骤。 树的直径…

java实现插入排序

图解 以下是Java实现插入排序的代码&#xff1a; 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和计算…

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

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

Apache Log4j2漏洞

目录 漏洞复现 漏洞原理 MessagePatternConverter.format() StrSubstitutor.resolveVariable() Interpolator.lookup() JndiLookup.lookup() JndiManager.lookup(

聊聊logback的MDCFilter

序 本文主要研究一下logback的MDCFilter MatchingFilter ch/qos/logback/classic/turbo/MatchingFilter.java public abstract class MatchingFilter extends TurboFilter {protected FilterReply onMatch FilterReply.NEUTRAL;protected FilterReply onMismatch FilterR…

rabbitmq 集群搭建

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

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;**学习目标: 坚持每一次的学习打卡 文章…

C语言实现杨辉三角

杨辉三角是一个经典的数学图形&#xff0c;可以用C语言来实现&#xff0c;实现代码如下&#xff1a; #include <stdio.h>int main() {int i, j, n;int a[10][10];printf("请输入要打印的行数: ");scanf("%d", &n);// 初始化第一行和对角线for (…