ijkplayer学习之FFPlayer结构体

在 ijkplayer 中,FFPlayer 结构体是底层核心播放器,用于解码和播放音视频数据。下面对其成员进行详细解释:

typedef struct FFPlayer {
    
    
    // 视频和音频解码器
    AVCodecContext *video_codec;  // 视频解码器上下文
    AVCodecContext *audio_codec;  // 音频解码器上下文

    // 音视频渲染器
    IJKFFVout *ff_vout;           // 视频渲染器
    SDL_AudioDeviceID audio_device_id;  // 音频设备ID

    // 解封装器、解码器和过滤器队列
    FrameQueue frameq;            // 音视频帧队列
    PacketQueue videoq;           // 视频数据包队列
    PacketQueue audioq;           // 音频数据包队列
    PacketQueue subtitleq;        // 字幕数据包队列

    // 播放控制相关
    int abort_request;            // 请求中止播放
    int pause_req;                // 请求暂停播放
    int paused;                   // 播放器是否处于暂停状态
    int seek_req;                 // 跳转请求
    int seek_flags;               // 跳转标志位
    int64_t seek_pos;             // 跳转位置
    int eof;                      // 是否已到达媒体末尾
    int error;                    // 播放错误
    int prepared;                 // 是否准备好播放

    // 封装器上下文和解码器上下文
    AVFormatContext *ic;          // 封装器上下文
    AVFormatContext *iformat;     // 输入封装器上下文
    AVInputFormat *input_format;  // 输入封装器
    AVIOContext *io_context;      // IO上下文

    // 线程
    SDL_Thread *read_tid;         // 读取数据的线程
    SDL_Thread *video_tid;        // 视频解码的线程
    SDL_Thread *audio_tid;        // 音频解码的线程

    // 时钟和同步
    SDL_mutex *play_mutex;        // 播放互斥锁
    SDL_cond *continue_read_thread;  // 继续读取数据的条件变量
    SDL_cond *continue_video_thread; // 继续视频解码的条件变量
    SDL_cond *continue_audio_thread; // 继续音频解码的条件变量
    SDL_cond *read_thread_over;   // 读取线程结束的条件变量

    // 其他信息
    int64_t start_time;           // 媒体文件的起始时间
    int64_t duration;             // 媒体文件的时长
    AVRational tb_start_time;     // 媒体文件的起始时间基准
    AVRational tb_duration;       // 媒体文件的时长基准
    double max_frame_duration;    // 最大帧时长
    int step;                     // 单步播放

    // 回调函数和回调上下文
    ijk_inject_callback inject_callback;   // 注入数据的回调函数
    void *inject_callback_data;  // 注入数据的回调函数的上下文
    void *opaque;                // 用户自定义数据

    // 线程销毁
    int join_video_tid;           // 视频线程结束标志
    int video_tid_valid;          // 视频线程有效标志
    int join_audio_tid;           // 音频线程结束标志
    int audio_tid_valid;          // 音频线程有效标志
} FFPlayer;

FFPlayer 结构体包含了多个成员变量,用于管理解码、渲染、播放控制、线程操作、时钟同步和相关回调函数等。这些成员变量的作用如下:

video_codec 和 audio_codec:视频和音频解码器的上下文。
ff_vout 和 audio_device_id:视频和音频的渲染器/设备。
frameq、videoq、audioq 和 subtitleq:音视频帧队列和数据包队列,用于存储待解码和待渲染的音视频帧和数据包。
abort_request、pause_req、paused、seek_req、seek_flags、seek_pos、eof、error 和 prepared:用于控制播放器的状态和播放控制。
ic、iformat、input_format 和 io_context:用于解封装和输入封装器的上下文。
read_tid、video_tid 和 audio_tid:用于执行读取数据、视频解码和音频解码的线程。
play_mutex、continue_read_thread、continue_video_thread、continue_audio_thread 和 read_thread_over:用于线程同步和互斥访问的互斥锁和条件变量。
start_time、duration、tb_start_time、tb_duration 和 max_frame_duration:媒体文件的起始时间、时长和相关时钟信息。
step:单步播放的标志。
inject_callback、inject_callback_data 和 opaque:用于注入数据和用户自定义数据的回调函数和上下文。
join_video_tid、video_tid_valid、join_audio_tid 和 audio_tid_valid:线程销毁相关标志。

FFPlayer 结构体是 ijkplayer 中核心功能的关键之一,它协调了解码、渲染、播放控制、线程同步和数据管理等操作,实现了媒体的解码和播放功能

猜你喜欢

转载自blog.csdn.net/qq_51282224/article/details/131653213