充分利用cpu资源的工具
?多线程管理问题
资源 有限多个人去抢
有序进行
读写锁 读写分离
自旋锁 等待资源释放(例如)
可重入锁
SDL锁
互斥锁
SDL_CreateMutex/SDL_DestroyMutex
SDL_LockMutex/SDL_UnlockMutex
信号量
SDL_CreateCond/SDL_DestroyCond
SDL_CondWait/SDL_CondSignal
typedef struct _PacketQueue{
AVPacketList *first_pkt, *last_pkt;
int nb_packets;
int size;
SDL_mutex *mutex;
SDL_cond *cond;
}PacketQueue;
pts:Presentation timestamp? 展示音频和视频时间戳 最终渲染也是根据这个时间戳
dts: Decoding timestamp 解码时间戳?
I帧 (关键帧 帧内压缩)
p帧(向前参考帧 帧间压缩 只记录前一帧变化的部分)
B帧(帧间压缩 记录前一帧和后一帧的差别 可参考前后几帧 )
实际帧顺序 I B B P?
存放顺序 I P B B
解码时间戳 1423
展示时间戳1234
有b帧的时候pts和dts不一致 无b帧的时候pts和dts是一致的
AVpacket 中的pts
AVFrame中的pts
? av_frame_get_best_effort_timestamp()
tbr: 帧率
tbn: time base of stream 流的时间基
tbc: time base of codec 解码时间基
计算当前帧的pTS
PTS = PTS * av_q2d(video_stream->time_base)
下一帧
video_clockl: 预测的下一帧的pts
frame_delay: 1/ tbr
video_clock:音频当前播放的时间戳
视频同步到音频
音频同步到视频
音视频同步到外部时钟