FFmpeg+SDL2实现简易音视频同步播放器

本文介绍了如何利用FFmpeg和SDL2实现一个简易的音视频同步播放器。线程模型包括解复用线程、定时视频刷新等。关键结构体VideoState用于存储解复用、解码和同步参数。通过PacketQueue和VideoPicture管理数据流。主要内容包括Main函数的初始化、解复用、视频和音频解码以及视频刷新播放的代码实现。建议通过运行代码加深理解。
摘要由CSDN通过智能技术生成

SDL2文章列表

SDL系列讲解 视频渲染入门_irainsa的博客-CSDN博客

SDL 事件处理_irainsa的博客-CSDN博客

SDL 纹理渲染_irainsa的博客-CSDN博客

SDL2 PCM音频播放_irainsa的博客-CSDN博客

FFmpeg+SDL2实现视频流播放_irainsa的博客-CSDN博客

FFmpeg+SDL2实现音频流播放_irainsa的博客-CSDN博客

FFmpeg音视频同步_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值