運(yùn)行tutorial03及以后包含音頻播放的示例程序,發(fā)現(xiàn)播出的聲音全是噪聲,而ffplay卻沒出現(xiàn)這個(gè)問題,于是決定將ffplay的代碼大致看一遍,看看有關(guān)音頻這部分的處理有何不同。這里只簡(jiǎn)單介紹ffplay的流程,怎么解決噪音問題將會(huì)在下一章說明。 數(shù)據(jù)隊(duì)列
整個(gè)ffplay包括6個(gè)數(shù)據(jù)隊(duì)列,每種數(shù)據(jù)各兩個(gè),包含已解碼和未解碼: 1、視頻數(shù)據(jù):未解碼的is->viddec->queue(is->videoq),已解碼的is->pictq 2、音頻數(shù)據(jù):未解碼的is->auddec->queue(is->audioq),已解碼的is->sampq 3、字幕數(shù)據(jù):未解碼的is->auddec->queue(is->subtitleq),已解碼的is->subpq 線程
線程包括以下幾個(gè): 1、read_thread,負(fù)責(zé)讀取文件(流)的數(shù)據(jù)存到相應(yīng)的未解碼數(shù)據(jù)隊(duì)列中 2、video_thread、audio_thread、subtitle_thread負(fù)責(zé)從對(duì)應(yīng)的未解碼數(shù)據(jù)隊(duì)列中取數(shù)據(jù)并解碼,然后存到已解碼的數(shù)據(jù)隊(duì)列中 3、event_loop,事件循環(huán),捕獲按鍵、刷新等事件并做相應(yīng)處理 4、sdl_audio_callback,這個(gè)是sdl的音頻回調(diào)(姑且把它當(dāng)做一個(gè)單獨(dú)的線程),在這個(gè)方法中需要做的是給sdl填充音頻數(shù)據(jù) 總的來說,就是一個(gè)線程負(fù)責(zé)讀數(shù)據(jù)并保存到隊(duì)列,三個(gè)線程負(fù)責(zé)解碼并保存到隊(duì)列,其余的與事件循環(huán)、sdl相關(guān)。廢話不多說,直接上圖:
|