1. 多屏同步的使用場景
此功能來自于一個需求:在同一個螢幕上同步顯示同一個内容的四個不同碼率的畫面,用來展示不同的分辨率和碼率最終被播放出來的畫質的差異。
抽象一下此需求的場景,其實就是要多個播放器之間進行同步的需求,這些播放器之間可以不一定是同一個app内,甚至可以是網際網路上的任何兩個播放器執行個體。
使用場景一
一個App中多個播放器間同步,如同最原始的需求。
使用場景二
一個博物館要投射一個模拟清明上河圖的場景再現視訊,由于清明上河的寬度非常寬,如果用普通的方案去投射,那麼視訊将無法觀看,博物館采用的方案是使用多個投影儀排成一排,每個投影儀投射整個視訊的一部分,多個投影儀同步播放,這樣就可以更好的把清明上河圖的場景再現視訊更好的播放了。
此場景可以使用一台比較強大的主機,同時播放各個部分的畫面,然後通過hdmi陣列輸出,如果這樣實作,則和場景一差不多,隻是内容不是相同的而已。如果這麼實作,那麼對主機的要求就比較高了,需要一個強大的解碼功能,和多hdmi輸出的顯示卡,并需要考慮畫面和hdmi的輸出對應關系。
此場景也可以使用區域網路來連接配接多個播放裝置進行同步,這樣的成本就會低很多,裝置的擺放和線路的連接配接也要容易得多。
使用場景三
網際網路上有個虛拟的房間,房間裡面的人會觀看同一個内容的視訊,但是希望房間裡面的所有觀看者觀看的視訊的進度是一緻的,這樣可以更好的進行一些互動。如答題,猜球之類。
此場景需要網際網路上的兩個播放器進行同步。
2實作
從上面能想到的場景來看,隻要播放器之間可以通過網絡進行通信,上述的所有需求都可以滿足,是以CicadaPlayer多屏同步采用的是tcp網絡協定進行同步。
可以參考
https://github.com/alibaba/CicadaPlayer/blob/develop/cmdline/example/syncPlayer.cpp中的實作。
其中實作了一個用tcp client server的方式實作了一個master播放器和多個slave播放器之間進行同步的例子
static string serverIp = "tcp://localhost:8888";
server的位址,如果在同一台機器上跑,則host就是localhost或者127.0.0.1,如果跑在不同的機器上,請填入正确的ip位址。
此例子中同時實作了master和slave player,通過bMaster變量進行控制,
如果想啟動server,則
./syncPlayer file
如果想啟動slave
./syncPlayer file 1
由于播放的内容可能是網絡内容,也有可能是直播,是以要想讓兩個視訊能内容同步,則必須讓兩個播放器同時prepare,同時start才行,是以在syncPlayer中prepare是使用者來控制的,并且不能autostart。
此示例是所有的slave隻向master同步,未考慮雙向通信,雙向通信在後面如果有需求再去實作。
如果是master
建立一個messageServer并初始化,播放器的設定按照正常的邏輯走,在
syncPlayerEventListener::onPrePare中prepare自己,并同時向server中發送prepare消息,讓所有的slave開始prepare。
onStatusChanged onLoadingStart onLoadingEnd中根據狀态向server中發送start或者pause消息。
在一個循環中定時GetMasterClockPts擷取目前播放器的clock發送給sever。
如果是slave
建立一個messageClient,并連接配接server,用來接收來自server的消息。
播放器設定成隻播放視訊(音視訊都播放的case暫時還不支援),在一個循環中收到消息後進行處理,pause prepare start 暫不多說,slave中自己啟動一個時鐘來記錄從server中發送過來的clock的值,由于server不可能特别頻繁的發送clock值,所有slave中的clock本身就具有計時功能,在server的clock發送過來的時候隻是進行校正而已。
slave播放器将自己的clock當成播放器的參考時鐘,通過SetClockRefer api設定給播放器,這樣slave播放器内部在播放視訊的時候就會擷取這個參考時鐘,進而實作和master同步播放的功能。
未完成的工作
- 目前slave隻支援純視訊播放,如果要音視訊都要播放,要考慮slave播放過快或者過慢的時候要進行音頻的等待或者丢幀(倍速也可以)。
- 目前隻支援了單向通信,目前還不完善,隻能比較好的實作通一個App内的同步,多程序間要考慮在每個slave都prepare完成後才能start。
- 目前無整體進度同步的邏輯,若在場景三種使用,則master應該不是一個實體播放器,應該是一個放到公網上的虛拟播放器,虛拟播放器通過所有的client端回報上來的狀态來決定什麼時候要開始播放,怎麼确定主時鐘的值等,來讓絕大部分播放器同步。