ffplay源码分析__stream_open函数(二)

前言

FFplay是 FFmpeg 官方提供的一个播放器的实现,支持快进快退,逐帧播放,滤镜等。本文是在VS2017的Debug x86模式下调试运行的,ffplay.c移植到VS2017工程可以参考
ffplay移植vs2017https://mp.youkuaiyun.com/mp_blog/creation/editor/143884981

stream_open函数主要是做了些初始化工作,并创建了读文件线程read_thread。先分析函数中出现的几个结构体。

一、数据结构

1、VideoState结构体

是ffplay的全局管理器,记录各种数据状态(时钟,队列,解码器等)。先看VideoState的部分字段

1)read_tid :read_thread线程ID,由SDL_CreateThread()返回

2)  AVInputFormat *iformat:媒体文件容器

3)Clock audclk:音频时钟,Clock vidclk:视频时钟,Clock extclk:外部时钟

4)FrameQueue pictq:视频帧队列,存放解码后的视频数据

     FrameQueue subpq:字幕帧队列,存放解码后的字幕数据

     FrameQueue sampq:音频帧队列,存放解码后的音频数据

5)Decoder auddec:音频解码器,存放音频解码器相关的参数
     Decoder viddec:视频解码器
     Decoder subdec:字幕解码器

6)av_sync_type:时钟同步方式,默认以音频时钟为主

7)last_video_stream:代表最后一个视频流,另外两个 last_audio_stream, last_subtitle_stream一样

8)char* filename:音视频文件名或者网络地址url。

9)width, height, xleft, ytop:分别代表SDL播放器窗口的宽,高,左偏移和上偏移。

10)PacketQueue videoq:视频AVPacket 队列

PacketQueue audioq:音频AVPacket 队列

PacketQueue subtitleq:字幕AVPacket 队列

11)continue_read_thread:条件变量,当解码队列为空或视频跳转时发送信号给read_thread,通知read_thread立即读取数据

2、MyAVPacketList结构体

typedef struct MyAVPacketList {
    AVPacket *pkt;
    int serial;
} MyAVPacketList;

MyAVPacketList结构体包含了AVPacket *pkt和 int serial两个字段,增加serial字段是为了给AVPacket添加序列号标识,跳转的时候serial字段会变。

3、PacketQueue结构体

typedef struct PacketQueue {
    AVFifoBuffer *pkt_list; //ffmpeg实现的先进先出的队列
    int nb_packets; // 队列中AVPacket数量
    int size; //队列占用内存大小
    int64_t dur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值