[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:获取流的详细信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计原则篇】聊聊开闭原则

开闭原则 其实就是对修改关闭,对拓展开放。 是什么 OCP(Open/Closed Principle)- 开闭原则。关于开发封闭原则,其核心的思想是:模块是可扩展的,而不可修改的。也就是说,对扩展是开放的&#xf…

单电源供电的运放如何增加直流偏置

在一些单电源供电的运放电路中,输入信号可能是交流信号,有正也有负,如果输入信号直接接到运算放大电路,则运放不会输出负电压,只有正电压,从而不能实现信号的调理; 这时我们就需要给运放添加直流…

css选择器

目录 1.什么是css? 2.选择器分类 2.1类选择器 2.3id选择器 2.3通配符选择器 3.字体样式 3.1字体大小 3.2字体粗细 3.3字体系列 3.4font属性连写 3.5样式的层叠问题 4.文本样式 4.1文本缩进 4.2文本水平对齐方式 4.3文本修饰 5.行高 6.垂直居中 7.margin:0 au…

【JAVA】去掉 if...else 的七种绝佳之法...

文章目录 前言方法一:提前 return方法二:枚举方案三:Optional 判空方案四:表驱动法方案五:策略模式 工厂方法方案六:责任链模式方案七:Function总结 前言 我相信小伙伴一定看过多篇怎么去掉 i…

Libhybris之线程局部存储TLS实例(五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Redis应用之二分布式锁

一、前言 前一篇 Redis应用之一自增编号 我们主要介绍了使用INCR命令来生成不重复的编号,今天我们来了解Redis另外一个命令SET NX的用途,对于单体应用我们可以简单使用像synchronized这样的关键字来给代码块加锁,但对于分布式应用要实现锁机…

select在标准输出和套接字上进行监控

selectServerInTCPIPbook.c的内容如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/…

kubernetes--Pod进阶

目录 一、资源限制&#xff1a; 1. 资源限制的两种规范&#xff1a; 2. Pod 和 容器 的资源请求和限制&#xff1a; 3. CPU 资源单位&#xff1a; 4. 内存资源单位 &#xff1a; 5. 资源限制示例&#xff1a; 二、健康检查&#xff1a;探针&#xff08;Probe&#xff09; 1. 探…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

【cfeng-work】架构演进和漫谈

架构漫谈和入门 内容管理 intro分层架构MVC模式分层架构大数据时代的复杂架构 前端架构后端架构运维端架构持续演进变化 本文主要是自己接触架构的一些输出漫谈 cfeng 在work中某次负责了后端一个服务的上线&#xff0c;多个模块一起上&#xff0c;结果上线失败&#xff0c;幸运…

Mysql 和 Redis 数据如何保持一致

先阐明一下Mysql和Redis的关系&#xff1a;Mysql是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致&#xff08;即缓存一致性问题&#xf…

Python实现WOA智能鲸鱼优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

适用于WPF的设计模式

适用于WPF的设计模式 讨论“XAML能不能写逻辑代码”这个问题。我发现这是个有歧义的问题。这个问题可以有两种意思&#xff1a; XAML能不能用来写逻辑代码&#xff1f; XAML文件里能不能包含逻辑代码&#xff1f; 对于第一种意思——XAML是一种声明性语言&#xff0c;就是用来…

Adobe家里那点事儿~~~

今天&#xff0c;我们来谈谈关于Adobe全家桶中Photoshop的故事。 Adobe Photoshop&#xff0c;简称PS。其定位是一款图像处理软件。他主要处理以像素所构成的数字图像。也就是说我们常见的非矢量图片。 Photoshop的专长在于图像处理&#xff0c;而不是图形的创作。他是对已有的…

项目应用多数据源动态切换(动态切换数据库连接)

文章目录 前言准备阶段具体配置功能展示注解方式切换数据源代码方式切换数据源优化方式 动态添加删除数据源事务问题参考文章 前言 最近公司的权限项目要实现多租户的功能&#xff0c;于是就要做数据隔离以确保每个租户的数据的安全性&#xff0c;但是项目中也要动态的提供能够…

动态修改hosts

前言 因工作需要频繁变更hosts&#xff0c; 故须自己实现一个动态管理器&#xff0c; 市面上其实已经有了类似的软件&#xff0c;比如switchhosts!但因为不好集成其他功能&#xff08;如远程连接KVM&#xff09;&#xff0c;所以还是决定自己开发一套。 原理 使用之前强烈建…

JavaScript从入门到精通系列第三十六篇:详解JavaScript中的事件监听和事件响应

文章目录 一&#xff1a;什么叫事件 1&#xff1a;概念 2&#xff1a;处理这个事件 (一)&#xff1a;鼠标单机按钮 (二)&#xff1a;鼠标双机按钮 (三)&#xff1a;鼠标移动 3&#xff1a;写法弊端 4&#xff1a;Dom Event 二&#xff1a;监听事件 1&#xff1a;元素事…

Netty实现通信框架

一、LengthFieldBasedFrameDecoder的参数解释 1、LengthFieldBasedFrameDecoder的构造方法参数 看下最多参数的构造方法 /*** Creates a new instance.** param byteOrder* the {link ByteOrder} of the length field* param maxFrameLength* the maximum len…

4面字节跳动拿到2-2Offer,入职就是30K16薪,全靠这份PDF

前言 当你开始开始去跳槽面试的时候&#xff0c;明明只是一份15K的工作&#xff0c;却问你会不会多线程&#xff0c;懂不懂高并发&#xff0c;火箭造得让你猝及不防&#xff0c;结果就是凉凉&#xff1b;现如今市场&#xff0c;多线程、高并发编程、分布式、负载均衡、集群等可…

ZYNQ实验--Petalinux--Linux C 编程入门

Linux C 编程入门 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具&#xff0c;但是大多都只是编辑器&#xff0c;也就是只能进行代码编辑&#xff0c;如果要编译的话就需要用到 GCC 编译器&…