前言
FFplay是 FFmpeg 官方提供的一个播放器的实现,支持快进快退,逐帧播放,滤镜等。本文是在VS2017的Debug x86模式下调试运行的,ffplay.c移植到VS2017工程可以参考
ffplay移植vs2017
https://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

最低0.47元/天 解锁文章
1277

被折叠的 条评论
为什么被折叠?



