天天看點

CicadaPlayer實作多屏同步播放介紹1. 多屏同步的使用場景2實作未完成的工作

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同步播放的功能。

未完成的工作

  1. 目前slave隻支援純視訊播放,如果要音視訊都要播放,要考慮slave播放過快或者過慢的時候要進行音頻的等待或者丢幀(倍速也可以)。
  2. 目前隻支援了單向通信,目前還不完善,隻能比較好的實作通一個App内的同步,多程序間要考慮在每個slave都prepare完成後才能start。
  3. 目前無整體進度同步的邏輯,若在場景三種使用,則master應該不是一個實體播放器,應該是一個放到公網上的虛拟播放器,虛拟播放器通過所有的client端回報上來的狀态來決定什麼時候要開始播放,怎麼确定主時鐘的值等,來讓絕大部分播放器同步。

繼續閱讀