SDL2文章列表
SDL系列讲解 视频渲染入门_irainsa的博客-CSDN博客
SDL2 PCM音频播放_irainsa的博客-CSDN博客
FFmpeg+SDL2实现视频流播放_irainsa的博客-CSDN博客
FFmpeg+SDL2实现音频流播放_irainsa的博客-CSDN博客
经过前面一系列的SDL2学习,终于到最后实现一个完整的简易播放器了。
线程模型
这是实现的简易播放器的线程模型,通过这张图再结合我们之前博客中学习的内容,基本可以了解播放器的一个整体运行流程。具体代码也是根据这张图来实现。
重要结构体
VideoState
整个播放器中最重要的结构体,解复用、解码、音视频同步、渲染相关参数都在该结构体中,它贯穿了整个播放流程。
typedef struct VideoState {
char filename[1024]; // 文件名称
AVFormatContext *pFormatCtx; // 上下文
int videoStream, audioStream; //音视频流index
同步相关
double audio_clock;
double frame_timer;
double frame_last_pts;
double frame_last_delay;
double video_clock;
double video_current_pts;
int64_t video_current_pts_time;
//音频相关
AVStream *audio_st; // 音频流
AVCodecContext *audio_ctx; // 音频解码上下文
PacketQueue audioq; // 音频队列
uint8_t audio_buf[(MAX_AUDIO_FRAME_SIZE * 3) / 2]; // 音频缓存
unsigned int audio_buf_size;
unsigned int audio_buf_index;
AVFrame audio_frame; // 音频帧
AVPacket audio_pkt; // 音频包
uint8_t *audio_pkt_data;
int audio_pkt_size;
struct SwrContext *audio_swr_ctx; // 音频重采样
//video
AVStream *video_st; // 视频流
AVCodecContext *video_ctx; // 视频流解码上下文
PacketQueue videoq; // 视频流队列
VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE]; // 解码后视频帧数组
int pictq_size, pictq_rindex, pictq_windex;
SDL_mutex *pictq_mutex;
SDL_cond *pictq_cond;
SDL_Thread *parse_tid; // 解复用线程
SDL_Thread *vi