欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[IJKPLAYER]基于DEMO分析IJKPLAYER

程序员文章站 2024-03-22 23:01:10
...

背景

博主主要是从事C语言开发,因此本文着重强调FFMPEG部分,关于JAVA应用和框架层只是一笔带过

1.目录结构

[IJKPLAYER]基于DEMO分析IJKPLAYER

  • 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代码的映射;

    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选项;

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

--filter相关
af:音频的filter,类型时字符串
vf:视频的filter0,类型时字符串

--ijkplayer(ff_ffplay.c)中扩展的选项
max-fps:设置最大的fps,但值大于max-fps时,将丢弃多余的帧,范围-1121,默认值31
overlay-format:可设置的值为fcc-_es2,fcc-i420,fcc-yv12,fcc-rv16,fcc-rv24和fcc-rv32,默认值fcc-rv32
start-on-prepared:使能当准备好后自动播放,默认值1
video-pictq-size:设置图片队列的最大的帧数,范围316,默认值3
max-buffer-size:设置预读取的最大缓冲区,范围015M,默认值15M
min-frames:设置停止预读取的最小帧数,范围250000,默认值50000
first-high-water-mark-ms:设置第一次唤醒read_thread线程的时间(毫秒),范围1005000,默认值100
next-high-water-mark-ms:设置下一次唤醒read_thread线程的时间(毫秒),范围1005000,默认值1000
last-high-water-mark-ms:设置最后一次唤醒read_thread线程的时间(毫秒),范围1005000,默认值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

--安卓选项
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

3.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:获取流的详细信息
相关标签: ijkplayer