【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置


对应结构体源码

MyAVPacketList
c 复制代码
typedef struct MyAVPacketList {
    AVPacket		pkt;    //解封装后的数据
    struct MyAVPacketList	*next;  //下一个节点
    int			serial;     //播放序列
} MyAVPacketList;
PacketQueue
c 复制代码
typedef struct PacketQueue {
    MyAVPacketList	*first_pkt, *last_pkt;  // 队首,队尾指针
    int		nb_packets;   // 包数量,也就是队列元素数量
    int		size;         // 队列所有元素的数据大小总和
    int64_t		duration; // 队列所有元素的数据播放持续时间
    int		abort_request; // 用户退出请求标志
    int		serial;         // 播放序列号,和MyAVPacketList的serial作用相同,但改变的时序稍微有点不同
    SDL_mutex	*mutex;     // 用于维持PacketQueue的多线程安全(SDL_mutex可以按pthread_mutex_t理解)
    SDL_cond	*cond;      // 用于读、写线程相互通知(SDL_cond可以按pthread_cond_t理解)
} PacketQueue;

内存管理

  • 内部是一个链表队列 MyAVPacketList,存放数据包
    • 链表队列适用于不确定缓存区具体大小的情形
  • 完全由PacketQueue维护管理
    • 放节点 put时malloc
    • 取节点 get时free
  • 锁机制------线程安全
    • put前后,加锁解锁
    • get前后,加锁解锁
  • 写端位于解复用线程,读端位于解码线程

serial字段

  • 为了区分seek前后的连续帧

  • 做法:seek之后,后一段的put节点serial+1

  • 场景

    复制代码
    用户拖动进度条,seek操作,之前缓存的帧不能播放了,要播放seek操作之后新缓存的帧,
    为了区别2段帧,加入serial字段

队列大小设置

PacketQueue 是一种链表式的队列

  • 内存充足情况下:可以不限制将数据包放入队列中,不需要考虑队列的大小。
  • 控制队列大小:如果我们需要控制队列的大小,我们可以使用以下三个变量来限制队列节点的数量:
    • size:控制队列中数据包的总大小。
    • duration:控制队列中数据包的总播放时间。
    • nb_packets:控制队列中数据包的数量。

相关推荐
有毒的教程2 小时前
AI文生视频转场提示词(直接复制,分类型|适配MiniMax H3 / 可灵 / Runway)
人工智能·音视频
浪淘沙jkp3 小时前
ComfyUI全方位指南(5)LTX-2.5 ComfyUI图生视频,文生视频可以你也可以的
音视频·comfyui
AIGC小尼4 小时前
MiniMax-H3 8G 显存 AI 漫剧进阶实战|ComfyUI 命令行调参、角色锁定与 FFmpeg 批量脚本全解析
人工智能·ffmpeg·comfyui·ai漫剧
企业数字化笔记5 小时前
视频上传怎么做才可靠?接收、存储、校验与管理的实现方案
音视频
EasyGBS11 小时前
国标监控PS流是什么?GB28181视频平台EasyGBS视频封装全链路讲解
服务器·音视频·gb28181
深圳市青牛科技实业有限公司11 小时前
GC5358|24bit‑96kHz 立体声 ADC,高性能音频模数转换优选
音视频
企业数字化笔记12 小时前
视频音频怎么稳定抽取?从媒体探测到可用音频资产的实现方案
音视频·媒体
byte轻骑兵12 小时前
VCP核心缩写概览
人工智能·音视频·le audio·低功耗蓝牙音频
2601_9623807612 小时前
历史解说与民俗科普视频的AI自动配素材实现教程
人工智能·音视频
物极必反102412 小时前
QT使用FFMpeg编译安卓程序.md
qt·ffmpeg·安卓