[{"data":1,"prerenderedAt":1525},["ShallowReactive",2],{"content-ca-\u002Ffeatures\u002Fmulti-display":3},{"id":4,"title":5,"author":6,"body":7,"date":6,"description":1518,"extension":1519,"meta":1520,"navigation":1054,"path":1521,"seo":1522,"stem":1523,"tags":6,"__hash__":1524},"content_ca\u002Fca\u002Ffeatures\u002Fmulti-display.md","Sincronitzacio multipantalla",null,{"type":8,"value":9,"toc":1498},"minimark",[10,14,23,28,33,40,43,54,58,65,68,74,84,272,275,280,310,314,320,323,327,388,395,399,406,412,435,441,445,451,478,482,486,489,493,501,582,593,601,667,670,674,680,724,730,821,826,918,923,1015,1018,1022,1025,1073,1076,1088,1091,1095,1102,1108,1112,1174,1178,1327,1330,1334,1337,1367,1370,1487,1494],[11,12,5],"h1",{"id":13},"sincronitzacio-multipantalla",[15,16,17,18,22],"p",{},"XiboPlayer es l'",[19,20,21],"strong",{},"unic reproductor de Xibo amb sincronitzacio entre dispositius",". Multiples pantalles — a la mateixa maquina o a traves de la LAN — es mantenen perfectament sincronitzades: transicions de layout coordinades, inici sincronitzat de video i descobriment automatic de seguidors.",[24,25,27],"h2",{"id":26},"dos-modes-de-sincronitzacio","Dos modes de sincronitzacio",[29,30,32],"h3",{"id":31},"mode-mirall-per-defecte","Mode mirall (per defecte)",[15,34,35,36,39],{},"Totes les pantalles mostren el ",[19,37,38],{},"mateix layout"," al mateix temps. El lider decideix quin layout mostrar i tots els seguidors carreguen el mateix contingut.",[15,41,42],{},"Cas d'us: multiples pantalles en un vestibul, botiga o aeroport — totes mostrant contingut identic amb transicions perfectament sincronitzades.",[44,45,50],"pre",{"className":46,"code":48,"language":49},[47],"language-text","Lider mostra layout 42 ──→ Seguidor 1 mostra layout 42\n                        ──→ Seguidor 2 mostra layout 42\n                        ──→ Seguidor 3 mostra layout 42\n","text",[51,52,48],"code",{"__ignoreMap":53},"",[29,55,57],{"id":56},"mode-wall-amb-layoutmap","Mode wall (amb layoutMap)",[15,59,60,61,64],{},"Cada pantalla mostra un ",[19,62,63],{},"layout diferent"," per posicio, pero les transicions son coordinades pel lider. Aixi es com es construeix un video wall on cada pantalla mostra una porcio d'una composicio mes gran.",[15,66,67],{},"Es dissenyen layouts individuals per a cada posicio de pantalla al CMS, i despres es mapegen a la configuracio del seguidor:",[44,69,72],{"className":70,"code":71,"language":49},[47],"Lider mostra layout 42 ──→ Seguidor 1 mapeja 42 → 101 (dalt-dreta)\n                        ──→ Seguidor 2 mapeja 42 → 102 (baix-esquerra)\n                        ──→ Seguidor 3 mapeja 42 → 103 (baix-dreta)\n",[51,73,71],{"__ignoreMap":53},[15,75,76,79,80,83],{},[19,77,78],{},"config.json del seguidor"," (",[51,81,82],{},"sync.layoutMap","):",[44,85,89],{"className":86,"code":87,"language":88,"meta":53,"style":53},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"cmsUrl\": \"https:\u002F\u002Fcms.example.com\",\n  \"cmsKey\": \"laTevaCLau\",\n  \"displayName\": \"vestibul-dalt-dreta\",\n  \"sync\": {\n    \"layoutMap\": {\n      \"42\": 101,\n      \"43\": 105,\n      \"44\": 109\n    }\n  }\n}\n","json",[51,90,91,100,130,151,172,187,203,222,239,254,260,266],{"__ignoreMap":53},[92,93,96],"span",{"class":94,"line":95},"line",1,[92,97,99],{"class":98},"sP7_E","{\n",[92,101,103,107,111,114,117,121,125,127],{"class":94,"line":102},2,[92,104,106],{"class":105},"s39Yj","  \"",[92,108,110],{"class":109},"sseR_","cmsUrl",[92,112,113],{"class":105},"\"",[92,115,116],{"class":98},":",[92,118,120],{"class":119},"sjJ54"," \"",[92,122,124],{"class":123},"s_sjI","https:\u002F\u002Fcms.example.com",[92,126,113],{"class":119},[92,128,129],{"class":98},",\n",[92,131,133,135,138,140,142,144,147,149],{"class":94,"line":132},3,[92,134,106],{"class":105},[92,136,137],{"class":109},"cmsKey",[92,139,113],{"class":105},[92,141,116],{"class":98},[92,143,120],{"class":119},[92,145,146],{"class":123},"laTevaCLau",[92,148,113],{"class":119},[92,150,129],{"class":98},[92,152,154,156,159,161,163,165,168,170],{"class":94,"line":153},4,[92,155,106],{"class":105},[92,157,158],{"class":109},"displayName",[92,160,113],{"class":105},[92,162,116],{"class":98},[92,164,120],{"class":119},[92,166,167],{"class":123},"vestibul-dalt-dreta",[92,169,113],{"class":119},[92,171,129],{"class":98},[92,173,175,177,180,182,184],{"class":94,"line":174},5,[92,176,106],{"class":105},[92,178,179],{"class":109},"sync",[92,181,113],{"class":105},[92,183,116],{"class":98},[92,185,186],{"class":98}," {\n",[92,188,190,193,197,199,201],{"class":94,"line":189},6,[92,191,192],{"class":105},"    \"",[92,194,196],{"class":195},"sZMiF","layoutMap",[92,198,113],{"class":105},[92,200,116],{"class":98},[92,202,186],{"class":98},[92,204,206,209,213,215,217,220],{"class":94,"line":205},7,[92,207,208],{"class":105},"      \"",[92,210,212],{"class":211},"srdBf","42",[92,214,113],{"class":105},[92,216,116],{"class":98},[92,218,219],{"class":211}," 101",[92,221,129],{"class":98},[92,223,225,227,230,232,234,237],{"class":94,"line":224},8,[92,226,208],{"class":105},[92,228,229],{"class":211},"43",[92,231,113],{"class":105},[92,233,116],{"class":98},[92,235,236],{"class":211}," 105",[92,238,129],{"class":98},[92,240,242,244,247,249,251],{"class":94,"line":241},9,[92,243,208],{"class":105},[92,245,246],{"class":211},"44",[92,248,113],{"class":105},[92,250,116],{"class":98},[92,252,253],{"class":211}," 109\n",[92,255,257],{"class":94,"line":256},10,[92,258,259],{"class":98},"    }\n",[92,261,263],{"class":94,"line":262},11,[92,264,265],{"class":98},"  }\n",[92,267,269],{"class":94,"line":268},12,[92,270,271],{"class":98},"}\n",[15,273,274],{},"Cada clau es l'ID del layout del lider, cada valor es l'ID del layout corresponent d'aquesta pantalla. Si un layout no esta al mapa, la pantalla fa fallback al mode mirall per a aquell layout.",[15,276,277],{},[19,278,279],{},"Com configurar un video wall:",[281,282,283,287,290,297,307],"ol",{},[284,285,286],"li",{},"Al CMS, dissenyeu N layouts (un per posicio de pantalla) — p.ex., layout 42 (lider\u002Fdalt-esquerra), 101 (dalt-dreta), 102 (baix-esquerra), 103 (baix-dreta)",[284,288,289],{},"Programeu el layout 42 al lider — ell controla el temps",[284,291,292,293,296],{},"Programeu els layouts 101, 102, 103 als seguidors perque es descarreguin (o confieu en la programacio del lider per enviar-los via ",[51,294,295],{},"RequiredFiles",")",[284,298,299,300,302,303,306],{},"Afegiu ",[51,301,82],{}," al ",[51,304,305],{},"config.json"," de cada seguidor",[284,308,309],{},"Totes les pantalles transicionen al mateix moment, cadascuna mostrant el contingut de la seva posicio",[24,311,313],{"id":312},"com-funciona","Com funciona",[44,315,318],{"className":316,"code":317,"language":49},[47],"                    Reproductor lider (Pantalla 1)\n                    ┌────────────────────────┐\n                    │  SyncManager (lider)    │\n                    │  ┌──────────────────┐   │\n                    │  │  Servidor Proxy  │   │\n                    │  │  ┌────────────┐  │   │\n                    │  │  │ Sync Relay │  │   │\n                    │  │  │  \u002Fsync WS  │  │   │\n                    │  │  └─────┬──────┘  │   │\n                    │  └────────┼──────────┘   │\n                    └───────────┼──────────────┘\n                                │\n              ┌─────────────────┼─────────────────┐\n              │ WebSocket       │ WebSocket        │ WebSocket\n              ▼                 ▼                  ▼\n    ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐\n    │  Seguidor 1     │ │  Seguidor 2     │ │  Seguidor 3     │\n    │  (Pantalla 2)   │ │  (Pantalla 3)   │ │  (Pantalla 4)   │\n    │  SyncManager    │ │  SyncManager    │ │  SyncManager    │\n    └─────────────────┘ └─────────────────┘ └─────────────────┘\n",[51,319,317],{"__ignoreMap":53},[15,321,322],{},"El reproductor lider orquestra les transicions de layout. El seu servidor proxy inclou un relay WebSocket integrat — els seguidors s'hi connecten per la LAN, sense infraestructura addicional.",[24,324,326],{"id":325},"dues-capes-de-transport","Dues capes de transport",[328,329,330,349],"table",{},[331,332,333],"thead",{},[334,335,336,340,343,346],"tr",{},[337,338,339],"th",{},"Transport",[337,341,342],{},"Abast",[337,344,345],{},"Cas d'us",[337,347,348],{},"Com",[350,351,352,369],"tbody",{},[334,353,354,360,363,366],{},[355,356,357],"td",{},[19,358,359],{},"BroadcastChannel",[355,361,362],{},"Mateixa maquina",[355,364,365],{},"Multiples pestanyes o finestres en un dispositiu",[355,367,368],{},"API nativa del navegador, zero configuracio",[334,370,371,376,379,382],{},[355,372,373],{},[19,374,375],{},"Relay WebSocket",[355,377,378],{},"LAN entre dispositius",[355,380,381],{},"Dispositius separats a la mateixa xarxa",[355,383,384,385],{},"Es connecta al proxy del lider a ",[51,386,387],{},"\u002Fsync",[15,389,390,391,394],{},"El transport es selecciona automaticament segons la configuracio. Si ",[51,392,393],{},"relayUrl"," esta definit, s'utilitza WebSocket; en cas contrari, BroadcastChannel.",[24,396,398],{"id":397},"aillament-de-grups","Aillament de grups",[15,400,401,402,405],{},"Quan multiples grups de pantalles comparteixen el mateix servidor relay, l'",[19,403,404],{},"aillament de grups"," assegura que els missatges es mantenen dins del seu grup. Cada pantalla declara el seu grup de sincronitzacio en connectar-se, i el relay nomes reenvia als companys del mateix grup.",[44,407,410],{"className":408,"code":409,"language":49},[47],"Servidor relay (port 9590)\n├── Grup \"vestibul\"\n│   ├── vestibul-lider (Pantalla 1)\n│   ├── vestibul-esquerra (Pantalla 2)\n│   └── vestibul-dreta (Pantalla 3)\n│\n└── Grup \"cafeteria\"\n    ├── cafe-lider (Pantalla 4)\n    └── cafe-dreta (Pantalla 5)\n",[51,411,409],{"__ignoreMap":53},[15,413,414,415,418,419,422,423,426,427,430,431,434],{},"Un canvi de layout a ",[51,416,417],{},"vestibul-lider"," arriba a ",[51,420,421],{},"vestibul-esquerra"," i ",[51,424,425],{},"vestibul-dreta"," pero mai a ",[51,428,429],{},"cafe-lider"," ni ",[51,432,433],{},"cafe-dreta",".",[15,436,437,440],{},[19,438,439],{},"Compatible cap enrere:"," Les pantalles que no declaren un grup fan fallback al comportament de difusio a tothom.",[24,442,444],{"id":443},"protocol-de-sincronitzacio","Protocol de sincronitzacio",[44,446,449],{"className":447,"code":448,"language":49},[47],"Lider                              Seguidor(s)\n─────                              ──────────\nlayout-change(layoutId, showAt)  →  rep, carrega layout (o layout mapejat)\n                                 ←  layout-ready(layoutId, displayId)\n(espera que tots els seguidors estiguin llestos)\nlayout-show(layoutId)            →  mostra el layout simultaneament\nvideo-start(layoutId, regionId)  →  despausa el video simultaneament\n",[51,450,448],{"__ignoreMap":53},[452,453,454,460,466,472],"ul",{},[284,455,456,459],{},[19,457,458],{},"Heartbeat",": cada 5s, cada node difon la seva presencia. El lider fa seguiment dels seguidors actius.",[284,461,462,465],{},[19,463,464],{},"Deteccio d'inactivitat",": si un seguidor no respon durant 15s, s'exclou de l'espera de preparacio.",[284,467,468,471],{},[19,469,470],{},"Temps maxim d'espera",": el lider espera fins a 10s pels seguidors, despres continua sense els que no responen.",[284,473,474,477],{},[19,475,476],{},"Delegacio d'estadistiques",": els seguidors envien les seves estadistiques\u002Fregistres al lider, que els envia al CMS en nom seu.",[24,479,481],{"id":480},"exemples-de-configuracio","Exemples de configuracio",[29,483,485],{"id":484},"sincronitzacio-a-la-mateixa-maquina-dues-pestanyes","Sincronitzacio a la mateixa maquina (dues pestanyes)",[15,487,488],{},"No cal configuracio especial. Obre el reproductor en dues pestanyes del navegador — BroadcastChannel gestiona la sincronitzacio automaticament. Les dues pestanyes mostren el mateix contingut (mode mirall).",[29,490,492],{"id":491},"pantalles-mirall-entre-dispositius-3-pantalles-a-la-lan","Pantalles mirall entre dispositius (3 pantalles a la LAN)",[15,494,495,79,498,500],{},[19,496,497],{},"Reproductor lider",[51,499,305],{}," a 192.168.1.100):",[44,502,504],{"className":86,"code":503,"language":88,"meta":53,"style":53},"{\n  \"cmsUrl\": \"https:\u002F\u002Fcms.example.com\",\n  \"cmsKey\": \"laTevaCLau\",\n  \"displayName\": \"vestibul-lider\",\n  \"serverPort\": 8765\n}\n",[51,505,506,510,528,546,564,578],{"__ignoreMap":53},[92,507,508],{"class":94,"line":95},[92,509,99],{"class":98},[92,511,512,514,516,518,520,522,524,526],{"class":94,"line":102},[92,513,106],{"class":105},[92,515,110],{"class":109},[92,517,113],{"class":105},[92,519,116],{"class":98},[92,521,120],{"class":119},[92,523,124],{"class":123},[92,525,113],{"class":119},[92,527,129],{"class":98},[92,529,530,532,534,536,538,540,542,544],{"class":94,"line":132},[92,531,106],{"class":105},[92,533,137],{"class":109},[92,535,113],{"class":105},[92,537,116],{"class":98},[92,539,120],{"class":119},[92,541,146],{"class":123},[92,543,113],{"class":119},[92,545,129],{"class":98},[92,547,548,550,552,554,556,558,560,562],{"class":94,"line":153},[92,549,106],{"class":105},[92,551,158],{"class":109},[92,553,113],{"class":105},[92,555,116],{"class":98},[92,557,120],{"class":119},[92,559,417],{"class":123},[92,561,113],{"class":119},[92,563,129],{"class":98},[92,565,566,568,571,573,575],{"class":94,"line":174},[92,567,106],{"class":105},[92,569,570],{"class":109},"serverPort",[92,572,113],{"class":105},[92,574,116],{"class":98},[92,576,577],{"class":211}," 8765\n",[92,579,580],{"class":94,"line":189},[92,581,271],{"class":98},[15,583,584,585,588,589,592],{},"El grup de sincronitzacio del lider es configura des del CMS via ",[51,586,587],{},"RegisterDisplay",". El servidor proxy a ",[51,590,591],{},":8765\u002Fsync"," actua com a relay.",[15,594,595,79,598,600],{},[19,596,597],{},"Seguidor 1",[51,599,305],{}," a 192.168.1.101):",[44,602,604],{"className":86,"code":603,"language":88,"meta":53,"style":53},"{\n  \"cmsUrl\": \"https:\u002F\u002Fcms.example.com\",\n  \"cmsKey\": \"laTevaCLau\",\n  \"displayName\": \"vestibul-esquerra\"\n}\n",[51,605,606,610,628,646,663],{"__ignoreMap":53},[92,607,608],{"class":94,"line":95},[92,609,99],{"class":98},[92,611,612,614,616,618,620,622,624,626],{"class":94,"line":102},[92,613,106],{"class":105},[92,615,110],{"class":109},[92,617,113],{"class":105},[92,619,116],{"class":98},[92,621,120],{"class":119},[92,623,124],{"class":123},[92,625,113],{"class":119},[92,627,129],{"class":98},[92,629,630,632,634,636,638,640,642,644],{"class":94,"line":132},[92,631,106],{"class":105},[92,633,137],{"class":109},[92,635,113],{"class":105},[92,637,116],{"class":98},[92,639,120],{"class":119},[92,641,146],{"class":123},[92,643,113],{"class":119},[92,645,129],{"class":98},[92,647,648,650,652,654,656,658,660],{"class":94,"line":153},[92,649,106],{"class":105},[92,651,158],{"class":109},[92,653,113],{"class":105},[92,655,116],{"class":98},[92,657,120],{"class":119},[92,659,421],{"class":123},[92,661,662],{"class":119},"\"\n",[92,664,665],{"class":94,"line":174},[92,666,271],{"class":98},[15,668,669],{},"Les tres pantalles mostren el mateix contingut amb transicions sincronitzades.",[29,671,673],{"id":672},"video-wall-graella-2x2-contingut-per-posicio","Video wall (graella 2x2, contingut per posicio)",[15,675,676,679],{},[19,677,678],{},"Lider (dalt-esquerra)"," — configuracio normal, executa la programacio:",[44,681,683],{"className":86,"code":682,"language":88,"meta":53,"style":53},"{\n  \"displayName\": \"wall-dalt-esquerra\",\n  \"serverPort\": 8765\n}\n",[51,684,685,689,708,720],{"__ignoreMap":53},[92,686,687],{"class":94,"line":95},[92,688,99],{"class":98},[92,690,691,693,695,697,699,701,704,706],{"class":94,"line":102},[92,692,106],{"class":105},[92,694,158],{"class":109},[92,696,113],{"class":105},[92,698,116],{"class":98},[92,700,120],{"class":119},[92,702,703],{"class":123},"wall-dalt-esquerra",[92,705,113],{"class":119},[92,707,129],{"class":98},[92,709,710,712,714,716,718],{"class":94,"line":132},[92,711,106],{"class":105},[92,713,570],{"class":109},[92,715,113],{"class":105},[92,717,116],{"class":98},[92,719,577],{"class":211},[92,721,722],{"class":94,"line":153},[92,723,271],{"class":98},[15,725,726,729],{},[19,727,728],{},"Seguidor (dalt-dreta)"," — mapeja els layouts del lider a la seva posicio:",[44,731,733],{"className":86,"code":732,"language":88,"meta":53,"style":53},"{\n  \"displayName\": \"wall-dalt-dreta\",\n  \"sync\": {\n    \"layoutMap\": {\n      \"42\": 101,\n      \"43\": 105\n    }\n  }\n}\n",[51,734,735,739,758,770,782,796,809,813,817],{"__ignoreMap":53},[92,736,737],{"class":94,"line":95},[92,738,99],{"class":98},[92,740,741,743,745,747,749,751,754,756],{"class":94,"line":102},[92,742,106],{"class":105},[92,744,158],{"class":109},[92,746,113],{"class":105},[92,748,116],{"class":98},[92,750,120],{"class":119},[92,752,753],{"class":123},"wall-dalt-dreta",[92,755,113],{"class":119},[92,757,129],{"class":98},[92,759,760,762,764,766,768],{"class":94,"line":132},[92,761,106],{"class":105},[92,763,179],{"class":109},[92,765,113],{"class":105},[92,767,116],{"class":98},[92,769,186],{"class":98},[92,771,772,774,776,778,780],{"class":94,"line":153},[92,773,192],{"class":105},[92,775,196],{"class":195},[92,777,113],{"class":105},[92,779,116],{"class":98},[92,781,186],{"class":98},[92,783,784,786,788,790,792,794],{"class":94,"line":174},[92,785,208],{"class":105},[92,787,212],{"class":211},[92,789,113],{"class":105},[92,791,116],{"class":98},[92,793,219],{"class":211},[92,795,129],{"class":98},[92,797,798,800,802,804,806],{"class":94,"line":189},[92,799,208],{"class":105},[92,801,229],{"class":211},[92,803,113],{"class":105},[92,805,116],{"class":98},[92,807,808],{"class":211}," 105\n",[92,810,811],{"class":94,"line":205},[92,812,259],{"class":98},[92,814,815],{"class":94,"line":224},[92,816,265],{"class":98},[92,818,819],{"class":94,"line":241},[92,820,271],{"class":98},[15,822,823,116],{},[19,824,825],{},"Seguidor (baix-esquerra)",[44,827,829],{"className":86,"code":828,"language":88,"meta":53,"style":53},"{\n  \"displayName\": \"wall-baix-esquerra\",\n  \"sync\": {\n    \"layoutMap\": {\n      \"42\": 102,\n      \"43\": 106\n    }\n  }\n}\n",[51,830,831,835,854,866,878,893,906,910,914],{"__ignoreMap":53},[92,832,833],{"class":94,"line":95},[92,834,99],{"class":98},[92,836,837,839,841,843,845,847,850,852],{"class":94,"line":102},[92,838,106],{"class":105},[92,840,158],{"class":109},[92,842,113],{"class":105},[92,844,116],{"class":98},[92,846,120],{"class":119},[92,848,849],{"class":123},"wall-baix-esquerra",[92,851,113],{"class":119},[92,853,129],{"class":98},[92,855,856,858,860,862,864],{"class":94,"line":132},[92,857,106],{"class":105},[92,859,179],{"class":109},[92,861,113],{"class":105},[92,863,116],{"class":98},[92,865,186],{"class":98},[92,867,868,870,872,874,876],{"class":94,"line":153},[92,869,192],{"class":105},[92,871,196],{"class":195},[92,873,113],{"class":105},[92,875,116],{"class":98},[92,877,186],{"class":98},[92,879,880,882,884,886,888,891],{"class":94,"line":174},[92,881,208],{"class":105},[92,883,212],{"class":211},[92,885,113],{"class":105},[92,887,116],{"class":98},[92,889,890],{"class":211}," 102",[92,892,129],{"class":98},[92,894,895,897,899,901,903],{"class":94,"line":189},[92,896,208],{"class":105},[92,898,229],{"class":211},[92,900,113],{"class":105},[92,902,116],{"class":98},[92,904,905],{"class":211}," 106\n",[92,907,908],{"class":94,"line":205},[92,909,259],{"class":98},[92,911,912],{"class":94,"line":224},[92,913,265],{"class":98},[92,915,916],{"class":94,"line":241},[92,917,271],{"class":98},[15,919,920,116],{},[19,921,922],{},"Seguidor (baix-dreta)",[44,924,926],{"className":86,"code":925,"language":88,"meta":53,"style":53},"{\n  \"displayName\": \"wall-baix-dreta\",\n  \"sync\": {\n    \"layoutMap\": {\n      \"42\": 103,\n      \"43\": 107\n    }\n  }\n}\n",[51,927,928,932,951,963,975,990,1003,1007,1011],{"__ignoreMap":53},[92,929,930],{"class":94,"line":95},[92,931,99],{"class":98},[92,933,934,936,938,940,942,944,947,949],{"class":94,"line":102},[92,935,106],{"class":105},[92,937,158],{"class":109},[92,939,113],{"class":105},[92,941,116],{"class":98},[92,943,120],{"class":119},[92,945,946],{"class":123},"wall-baix-dreta",[92,948,113],{"class":119},[92,950,129],{"class":98},[92,952,953,955,957,959,961],{"class":94,"line":132},[92,954,106],{"class":105},[92,956,179],{"class":109},[92,958,113],{"class":105},[92,960,116],{"class":98},[92,962,186],{"class":98},[92,964,965,967,969,971,973],{"class":94,"line":153},[92,966,192],{"class":105},[92,968,196],{"class":195},[92,970,113],{"class":105},[92,972,116],{"class":98},[92,974,186],{"class":98},[92,976,977,979,981,983,985,988],{"class":94,"line":174},[92,978,208],{"class":105},[92,980,212],{"class":211},[92,982,113],{"class":105},[92,984,116],{"class":98},[92,986,987],{"class":211}," 103",[92,989,129],{"class":98},[92,991,992,994,996,998,1000],{"class":94,"line":189},[92,993,208],{"class":105},[92,995,229],{"class":211},[92,997,113],{"class":105},[92,999,116],{"class":98},[92,1001,1002],{"class":211}," 107\n",[92,1004,1005],{"class":94,"line":205},[92,1006,259],{"class":98},[92,1008,1009],{"class":94,"line":224},[92,1010,265],{"class":98},[92,1012,1013],{"class":94,"line":241},[92,1014,271],{"class":98},[15,1016,1017],{},"Quan el lider transiciona del layout 42 al layout 43, les quatre pantalles transicionen simultaneament — cadascuna al seu layout especific de posicio.",[29,1019,1021],{"id":1020},"servidor-relay-independent","Servidor relay independent",[15,1023,1024],{},"Per a desplegaments grans, executa un relay dedicat en lloc d'utilitzar el proxy del lider:",[44,1026,1030],{"className":1027,"code":1028,"language":1029,"meta":53,"style":53},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# Instal·lar\nnpm install @xiboplayer\u002Fproxy\n\n# Executar relay independent\nnpx xiboplayer-relay --port=9590\n","bash",[51,1031,1032,1038,1050,1056,1061],{"__ignoreMap":53},[92,1033,1034],{"class":94,"line":95},[92,1035,1037],{"class":1036},"sutJx","# Instal·lar\n",[92,1039,1040,1044,1047],{"class":94,"line":102},[92,1041,1043],{"class":1042},"sbgvK","npm",[92,1045,1046],{"class":123}," install",[92,1048,1049],{"class":123}," @xiboplayer\u002Fproxy\n",[92,1051,1052],{"class":94,"line":132},[92,1053,1055],{"emptyLinePlaceholder":1054},true,"\n",[92,1057,1058],{"class":94,"line":153},[92,1059,1060],{"class":1036},"# Executar relay independent\n",[92,1062,1063,1066,1069],{"class":94,"line":174},[92,1064,1065],{"class":1042},"npx",[92,1067,1068],{"class":123}," xiboplayer-relay",[92,1070,1072],{"class":1071},"stzsN"," --port=9590\n",[15,1074,1075],{},"O amb el paquet RPM:",[44,1077,1079],{"className":1027,"code":1078,"language":1029,"meta":53,"style":53},"xiboplayer-relay --port=9590\n",[51,1080,1081],{"__ignoreMap":53},[92,1082,1083,1086],{"class":94,"line":95},[92,1084,1085],{"class":1042},"xiboplayer-relay",[92,1087,1072],{"class":1071},[15,1089,1090],{},"El relay es un hub WebSocket lleuger (~100 linies) sense cap dependencia del CMS. Gestiona l'aillament de grups, el monitoratge de heartbeats i la neteja de clients inactius.",[29,1092,1094],{"id":1093},"multiples-grups-de-pantalles-un-relay","Multiples grups de pantalles, un relay",[15,1096,1097,1098,1101],{},"Configureu les pantalles de cada grup amb el mateix ",[51,1099,1100],{},"syncGroup"," al CMS. El relay ailla els missatges per grup automaticament:",[44,1103,1106],{"className":1104,"code":1105,"language":49},[47],"Grup \"vestibul\"   → syncGroup: \"vestibul\"   → relay a relay.lan:9590\nGrup \"cafeteria\"  → syncGroup: \"cafeteria\"  → relay a relay.lan:9590\n",[51,1107,1105],{"__ignoreMap":53},[24,1109,1111],{"id":1110},"funcionalitats","Funcionalitats",[452,1113,1114,1120,1128,1134,1140,1146,1151,1156,1162,1168],{},[284,1115,1116,1119],{},[19,1117,1118],{},"Mode mirall"," — totes les pantalles mostren el mateix layout (per defecte)",[284,1121,1122,1125,1126],{},[19,1123,1124],{},"Mode wall"," — cada pantalla mostra un layout per posicio via ",[51,1127,196],{},[284,1129,1130,1133],{},[19,1131,1132],{},"Transicions de layout coordinades"," — totes les pantalles canvien de layout simultaneament",[284,1135,1136,1139],{},[19,1137,1138],{},"Inici sincronitzat de video"," — els videos es despausen al mateix moment en totes les pantalles",[284,1141,1142,1145],{},[19,1143,1144],{},"Descobriment automatic de seguidors"," — basat en heartbeats, sense registre manual",[284,1147,1148,1150],{},[19,1149,476],{}," — els seguidors encaminen estadistiques\u002Fregistres a traves del lider cap al CMS",[284,1152,1153,1155],{},[19,1154,398],{}," — multiples grups de pantalles comparteixen un relay sense interferencies",[284,1157,1158,1161],{},[19,1159,1160],{},"Reconnexio automatica"," — backoff exponencial (1s a 30s) amb re-unio automatica al grup",[284,1163,1164,1167],{},[19,1165,1166],{},"Degradacio graciosa"," — el lider continua despres del temps maxim si un seguidor no respon",[284,1169,1170,1173],{},[19,1171,1172],{},"Independent del transport"," — la mateixa API SyncManager per a BroadcastChannel i WebSocket",[24,1175,1177],{"id":1176},"comparacio-amb-altres-reproductors","Comparacio amb altres reproductors",[328,1179,1180,1199],{},[331,1181,1182],{},[334,1183,1184,1187,1190,1193,1196],{},[337,1185,1186],{},"Funcionalitat",[337,1188,1189],{},"Windows v4",[337,1191,1192],{},"XLR",[337,1194,1195],{},"Arexibo",[337,1197,1198],{},"XiboPlayer",[350,1200,1201,1215,1228,1242,1256,1270,1286,1300,1313],{},[334,1202,1203,1206,1209,1211,1213],{},[355,1204,1205],{},"Sincronitzacio mateixa maquina",[355,1207,1208],{},"No",[355,1210,359],{},[355,1212,1208],{},[355,1214,359],{},[334,1216,1217,1220,1222,1224,1226],{},[355,1218,1219],{},"Sincronitzacio entre dispositius",[355,1221,1208],{},[355,1223,1208],{},[355,1225,1208],{},[355,1227,375],{},[334,1229,1230,1232,1234,1237,1239],{},[355,1231,1118],{},[355,1233,1208],{},[355,1235,1236],{},"Si (mateixa pestanya)",[355,1238,1208],{},[355,1240,1241],{},"Si (mateixa maquina + LAN)",[334,1243,1244,1247,1249,1251,1253],{},[355,1245,1246],{},"Mode wall (layoutMap)",[355,1248,1208],{},[355,1250,1208],{},[355,1252,1208],{},[355,1254,1255],{},"Layouts per posicio",[334,1257,1258,1260,1263,1265,1267],{},[355,1259,398],{},[355,1261,1262],{},"N\u002FA",[355,1264,1262],{},[355,1266,1262],{},[355,1268,1269],{},"Encaminament per grup",[334,1271,1272,1275,1277,1279,1281],{},[355,1273,1274],{},"Relay independent",[355,1276,1262],{},[355,1278,1262],{},[355,1280,1262],{},[355,1282,1283,1284],{},"CLI ",[51,1285,1085],{},[334,1287,1288,1290,1292,1295,1297],{},[355,1289,476],{},[355,1291,1208],{},[355,1293,1294],{},"Si (nomes BC)",[355,1296,1208],{},[355,1298,1299],{},"Si (BC + WebSocket)",[334,1301,1302,1304,1306,1308,1310],{},[355,1303,1160],{},[355,1305,1262],{},[355,1307,1262],{},[355,1309,1262],{},[355,1311,1312],{},"Backoff exponencial",[334,1314,1315,1318,1320,1322,1324],{},[355,1316,1317],{},"Sincronitzacio inici video",[355,1319,1208],{},[355,1321,1208],{},[355,1323,1208],{},[355,1325,1326],{},"Despausa coordinada",[15,1328,1329],{},"XiboPlayer es l'unic reproductor de Xibo que suporta sincronitzacio entre dispositius. L'XLR oficial utilitza BroadcastChannel per a pestanyes del mateix origen pero no te capacitat entre dispositius ni mode wall.",[24,1331,1333],{"id":1332},"arquitectura","Arquitectura",[15,1335,1336],{},"El sistema de sincronitzacio es divideix entre dos paquets del SDK:",[452,1338,1339,1356],{},[284,1340,1341,1344,1345,1348,1349,1352,1353],{},[19,1342,1343],{},"@xiboplayer\u002Fsync"," — ",[51,1346,1347],{},"SyncManager"," (logica de protocol), ",[51,1350,1351],{},"BroadcastChannelTransport",", ",[51,1354,1355],{},"WebSocketTransport",[284,1357,1358,1344,1361,1364,1365],{},[19,1359,1360],{},"@xiboplayer\u002Fproxy",[51,1362,1363],{},"attachSyncRelay()"," (relay del servidor), CLI ",[51,1366,1085],{},[15,1368,1369],{},"La interficie de transport es connectable:",[44,1371,1375],{"className":1372,"code":1373,"language":1374,"meta":53,"style":53},"language-javascript shiki shiki-themes material-theme-lighter github-light github-dark","interface SyncTransport {\n  send(msg: object): void;\n  onMessage(callback: (msg: object) => void): void;\n  close(): void;\n  readonly connected: boolean;\n}\n","javascript",[51,1376,1377,1388,1417,1453,1467,1483],{"__ignoreMap":53},[92,1378,1379,1383,1386],{"class":94,"line":95},[92,1380,1382],{"class":1381},"sbsja","interface",[92,1384,1385],{"class":1042}," SyncTransport",[92,1387,186],{"class":98},[92,1389,1390,1394,1397,1401,1404,1407,1409,1411,1414],{"class":94,"line":102},[92,1391,1393],{"class":1392},"sVXei","  send",[92,1395,1396],{"class":98},"(",[92,1398,1400],{"class":1399},"s99_P","msg",[92,1402,116],{"class":1403},"smGrS",[92,1405,1406],{"class":195}," object",[92,1408,296],{"class":98},[92,1410,116],{"class":1403},[92,1412,1413],{"class":195}," void",[92,1415,1416],{"class":98},";\n",[92,1418,1419,1422,1424,1428,1430,1432,1434,1436,1438,1440,1443,1445,1447,1449,1451],{"class":94,"line":132},[92,1420,1421],{"class":1392},"  onMessage",[92,1423,1396],{"class":98},[92,1425,1427],{"class":1426},"sGLFI","callback",[92,1429,116],{"class":1403},[92,1431,79],{"class":98},[92,1433,1400],{"class":1399},[92,1435,116],{"class":1403},[92,1437,1406],{"class":195},[92,1439,296],{"class":98},[92,1441,1442],{"class":1381}," =>",[92,1444,1413],{"class":195},[92,1446,296],{"class":98},[92,1448,116],{"class":1403},[92,1450,1413],{"class":195},[92,1452,1416],{"class":98},[92,1454,1455,1458,1461,1463,1465],{"class":94,"line":153},[92,1456,1457],{"class":1392},"  close",[92,1459,1460],{"class":98},"()",[92,1462,116],{"class":1403},[92,1464,1413],{"class":195},[92,1466,1416],{"class":98},[92,1468,1469,1472,1476,1478,1481],{"class":94,"line":174},[92,1470,1471],{"class":1381},"  readonly",[92,1473,1475],{"class":1474},"sucvu"," connected",[92,1477,116],{"class":1403},[92,1479,1480],{"class":195}," boolean",[92,1482,1416],{"class":98},[92,1484,1485],{"class":94,"line":189},[92,1486,271],{"class":98},[15,1488,1489,1490,1493],{},"Es poden injectar transports personalitzats (p.ex., WebRTC per a latencia ultra-baixa) via l'opcio ",[51,1491,1492],{},"transport"," del constructor.",[1495,1496,1497],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":53,"searchDepth":132,"depth":132,"links":1499},[1500,1504,1505,1506,1507,1508,1515,1516,1517],{"id":26,"depth":102,"text":27,"children":1501},[1502,1503],{"id":31,"depth":132,"text":32},{"id":56,"depth":132,"text":57},{"id":312,"depth":102,"text":313},{"id":325,"depth":102,"text":326},{"id":397,"depth":102,"text":398},{"id":443,"depth":102,"text":444},{"id":480,"depth":102,"text":481,"children":1509},[1510,1511,1512,1513,1514],{"id":484,"depth":132,"text":485},{"id":491,"depth":132,"text":492},{"id":672,"depth":132,"text":673},{"id":1020,"depth":132,"text":1021},{"id":1093,"depth":132,"text":1094},{"id":1110,"depth":102,"text":1111},{"id":1176,"depth":102,"text":1177},{"id":1332,"depth":102,"text":1333},"Pantalles sincronitzades entre dispositius amb mode mirall, mode wall (layouts per posicio), aillament de grups i relay independent.","md",{},"\u002Fca\u002Ffeatures\u002Fmulti-display",{"title":5,"description":1518},"ca\u002Ffeatures\u002Fmulti-display","lktfEjUnm_QbptEk94hsFcDEFEijAhihkOsC0x8a0Iw",1775148105253]