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

news2024/9/20 0:52:45

背景


        博主主要是从事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.coloradmin.cn/o/1203150.html

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

相关文章

react函数式组件props形式父向子传参

父组件中定义 子组件中触发回调传值 import { useState } from "react"; function Son(params) {const [count, setCount] useState(0);function handleClick() {console.log(params, paramsparamsparamsparamsparamsparams);params.onClick(111)setCount(count 1…

多个微信快速同步发圈

做营销最重要的任务是什么? 毋庸置疑,就是发布朋友圈。 为什么要发圈呢? 现在社交媒体中,微信不管在生活上、工作上都是不可或缺的工具,而朋友圈是微信中社交场景之一,也是很多企业作为推广产品和服务的重…

腾讯云服务器多少钱一年?2023年腾讯云优惠云服务器推荐

作为一名程序员,技术的突飞猛进是从拥有第一台云服务器开始的。那时,我开始尝试使用Linux系统,并成功上线了自己的第一个小程序。自此之后,我和我的同事们都开始拥有自己的云服务器,用来搭建各种小项目或者好玩的东西。…

OpenAtom OpenHarmony三方库创建发布及安全隐私检测

OpenAtom OpenHarmony三方库(以下简称“三方库”或“包”),是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开发OpenHarmony应用。三方库根据其开发语言分为2种,一种是使用JavaScript和TypeScr…

wpf devexpress设置行和编辑器

如下教程示范如何计算行布局,特定的表格单元编辑器,和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源,如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…

Containerd接入Harbor仓库

在使用容器时,避免不了会使用到私有仓库,一般都是采用 harbor 作为私有仓库,docker 对接 harbor 仓库非常简单,哪 containerd 如何对接 harbor 呢? 在内网使用 harbor 根据个人习惯,一般都是非 http 并且是…

【SpringBoot3+Vue3】一【基础篇】

目录 一、Spring Boot概述 1、Spring Boot 特性 1.1 起步依赖 1.2 自动配置 1.3 其他特性 1.3.1 内嵌的Tomcat、Jetty (无需部署WAR文件) 1.3.2 外部化配置 1.3.3 不需要XML配置(properties/yml) 二、Spring Boot入门 1、一个入门程序需求 2、步骤 2.1 创建Maven工…

智能配方颗粒管理系统解决方案,专业实现中医药产业数字化-亿发

“中药配方颗粒”,又被称为免煎中药,源自传统中药饮片,经过提取、分离、浓缩、干燥、制粒、包装等工艺加工而成。这种新型配方药物完整保留了原中药饮片的所有特性。既能满足医师的辨证论治和随症加减需求,同时具备强劲好人高效的…

Python实现猎人猎物优化算法(HPO)优化XGBoost回归模型(XGBRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

(论文阅读29/100 人体姿态估计)

29.文献阅读笔记 简介 题目 DeepCut: Joint Subset Partition and Labeling for Multi Person Pose Estimation 作者 Leonid Pishchulin, Eldar Insafutdinov, Siyu Tang, Bjoern Andres, Mykhaylo Andriluka, Peter Gehler, and Bernt Schiele, CVPR, 2016. 原文链接 h…

分享一套适合二开的JAVA开源版本MES系统

一、系统概述: 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码 万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理,车间基础数据管理,计划管理,物料控制,生产执行…

ubuntu开机系统出错且无法恢复。请联系系统管理员。

背景: ubuntu22.04.2命令行,执行自动安装系统推荐显卡驱动命令,字体变大,重启后出现如下图错误,无法进入系统,无法通过CTRLALTF1-F3进入TTY模式。 解决办法: 1.首先要想办法进入系统&#xff…

江门車馬炮汽车金融中心 11月11日开张

江门车马炮汽车金融中心于11月11日正式开张,这是江门市汽车金融服务平台,旨在为广大车主提供更加便捷、高效的汽车金融服务。 江门市作为广东省的一个经济发达城市,汽车保有量持续增长,但车主在购车、用车、养车等方面仍存在诸多不…

华东“启明”青少年音乐艺术实践中心揭幕暨中国“启明”巴洛克合奏团首演音乐会

2023年11月11日,华东“启明”青少年音乐艺术实践中心在上海揭幕,中国“启明”巴洛克合奏团开启了首场音乐会。 华东“启明”青少年音乐艺术实践中心由中共宁波市江北区委宣传部与上音管风琴艺术中心联合指导,宁波音乐港、宁波市江北区洛奇音乐…

Apipost IDEA插件如何使用

Apipost-Helper是由Apipost推出的IDEA插件,写完接口可以进行快速调试,且支持搜索接口、根据method跳转接口,还支持生成标准的API文档,注意:这些操作都可以在代码编辑器内独立完成,非常好用!这里…

Python数据大杀器:掌握collections与heapq,编写更高效的算法与数据处理

前言 在计算机科学的世界中,数据结构是构建强大和高效算法的基石。Python作为一门广泛应用的编程语言,以其丰富的数据结构模块为程序员提供了强大的工具。本文旨在深入研究Python的collections和heapq模块,通过更丰富的示例和详细的解释&…

威海广泰-002111 三季报分析(20231109)

威海广泰-002111 基本情况 公司名称:威海广泰空港设备股份有限公司 A股简称:威海广泰 成立日期:2002-08-30 上市日期:2007-01-26 所属行业:专用设备制造业 周期性:0 主营业务:航空产业、消防产业…

数字互动新纪元 | 拓世法宝商务数字人一体机,带给你智能展会导览体验

人工智能技术的飞速发展之下,各行各业都在迎来颠覆性的变革。大型展会,犹如庞大的迷宫,错综复杂的展区,让参展商和观众往往难以找到理想的商机。展会组织者更是面临着庞大面积的管理任务,如何在这个错综复杂的空间中提…

二叉树题目:二叉树最大宽度

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:二叉树最大宽度 出处:662. 二叉树最大宽度 难度 5 级 题目描述 要求 给定一个二叉树的根结点 …