パケットキューアーキテクチャの場所
対応する構造体のソースコード
MyAVパケットリスト
typedef struct MyAVPacketList {
AVPacket pkt; //解封装后的数据
struct MyAVPacketList *next; //下一个节点
int serial; //播放序列
} MyAVPacketList;
パケットキュー
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 によって完全に保守および管理されます
- ノードを置くときのmalloc
- ノード取得時は無料
- ロック機構 - スレッドセーフティ
- 置く前と後、ロックとロック解除
- 取得、ロック、ロック解除の前後
- 書き込み側は逆多重化スレッドに位置し、読み取り側はデコード スレッドに位置します。
シリアルフィールド
-
シーク前後の連続フレームを区別するため
-
方法: シーク後、次のセクションにノード Serial+1 を配置します。
-
シーン
用户拖动进度条,seek操作,之前缓存的帧不能播放了,要播放seek操作之后新缓存的帧, 为了区别2段帧,加入serial字段
キューサイズの設定
PacketQueue はリンク リスト キューです
- 十分なメモリがある場合: データ パケットを制限なくキューに入れることができ、キューのサイズを考慮する必要はありません。
- キュー サイズの制御: キューのサイズを制御する必要がある場合は、次の 3 つの変数を使用してキュー ノードの数を制限できます。
- size: キュー内のパケットの合計サイズを制御します。
- 継続時間: キュー内のパケットの合計再生時間を制御します。
- nb_packets: キュー内のパケット数を制御します。