obs源碼分析
一.obs音視頻同步方法
參考:https://blog.csdn.net/liuhengxiao/article/details/83059314
源碼在D:\work\obs-studio-jianan\obs-studio\libobs\obs-output.c
static bool prune_interleaved_packets(struct obs_output *output)
{
size_t start_idx = 0;
//先刪除超過一個視頻幀間隔之前的所有幀
int prune_start = prune_premature_packets(output);
/* prunes the first video packet if it's too far away from audio */
if (prune_start == -1)
return false;
else if (prune_start != 0)
start_idx = (size_t)prune_start;
else
//如果prune_premature_packets沒有,找出離視頻幀最近的音頻幀作為開始
start_idx = get_interleaved_start_idx(output);
if (start_idx)
discard_to_idx(output, start_idx);
return true;
}
一.obs采集與渲染流程
參考:https://www.cnblogs.com/JazzerDaxian/p/8480229.html
攝像頭通過dshow來采集的,然后通過obs_source_output_video方法來寫入一個隊列,然后渲染線程obs_source_video_tick讀這個隊列的內容來渲染顯示咯