多线程好处
充分利用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是一致的
从哪获取pts
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:音频当前播放的时间戳
音视频同步方式
视频同步到音频
音频同步到视频
音视频同步到外部时钟