grid.wxml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <!-- template grid -->
  2. <template name='grid'>
  3. <view class="template-grid">
  4. <view class="column-layout">
  5. <view class="column-1">
  6. <view class="grid-scroll-container" bindtouchstart="_handleGridTouchStart" bindtouchend="_handleGridTouchEnd">
  7. <!-- <view id="grid-container-id" class="grid-container {{visibleStreamList.length < 4 ? 'stream-' + visibleStreamList.length : visibleStreamList.length%2 == 0? 'stream-odd':'stream-even'}}"> -->
  8. <view id="grid-container-id" class="grid-container {{visibleStreamList.length < 4 ? 'stream-' + visibleStreamList.length : 'stream-3'}}">
  9. <view class="view-container pusher-container {{pusher.isVisible && ((gridCurrentPage === 1 && gridPlayerPerPage > 3) || gridPlayerPerPage < 4)?'':'none'}}">
  10. <live-pusher
  11. class="pusher"
  12. url="{{pusher.url}}"
  13. mode="{{pusher.mode}}"
  14. autopush="{{pusher.autopush}}"
  15. enable-camera="{{pusher.enableCamera}}"
  16. enable-mic="{{pusher.enableMic}}"
  17. muted="{{!pusher.enableMic}}"
  18. enable-agc="{{pusher.enableAgc}}"
  19. enable-ans="{{pusher.enableAns}}"
  20. enable-ear-monitor="{{pusher.enableEarMonitor}}"
  21. auto-focus="{{pusher.enableAutoFocus}}"
  22. zoom="{{pusher.enableZoom}}"
  23. min-bitrate="{{pusher.minBitrate}}"
  24. max-bitrate="{{pusher.maxBitrate}}"
  25. video-width="{{pusher.videoWidth}}"
  26. video-height="{{pusher.videoHeight}}"
  27. beauty="{{pusher.beautyLevel}}"
  28. whiteness="{{pusher.whitenessLevel}}"
  29. orientation="{{pusher.videoOrientation}}"
  30. aspect="{{pusher.videoAspect}}"
  31. device-position="{{pusher.frontCamera}}"
  32. remote-mirror="{{pusher.enableRemoteMirror}}"
  33. local-mirror="{{pusher.localMirror}}"
  34. background-mute="{{pusher.enableBackgroundMute}}"
  35. audio-quality="{{pusher.audioQuality}}"
  36. audio-volume-type="{{pusher.audioVolumeType}}"
  37. audio-reverb-type="{{pusher.audioReverbType}}"
  38. waiting-image="{{pusher.waitingImage}}"
  39. debug="{{debug}}"
  40. beauty-style="{{pusher.beautyStyle}}"
  41. filter="{{pusher.filter}}"
  42. bindstatechange="_pusherStateChangeHandler"
  43. bindnetstatus="_pusherNetStatusHandler"
  44. binderror="_pusherErrorHandler"
  45. bindbgmstart="_pusherBGMStartHandler"
  46. bindbgmprogress="_pusherBGMProgressHandler"
  47. bindbgmcomplete="_pusherBGMCompleteHandler"
  48. bindaudiovolumenotify="_pusherAudioVolumeNotify"
  49. />
  50. <view class="no-video" wx:if="{{!pusher.enableCamera}}">
  51. <image class="image" src="./static/mute-camera-white.png"></image>
  52. </view>
  53. <!-- <view class="no-audio" wx:if="{{!pusher.enableMic}}">
  54. <image class="image" src="./static/mute-mic-white.png"></image>
  55. </view>
  56. <view class="audio-volume" wx:if="{{pusher.enableMic}}">
  57. <image class="image" src="./static/micro-open.png"></image>
  58. <view class="audio-active" style="height:{{pusher.volume}}%">
  59. <image class="image" src="./static/audio-active.png"></image>
  60. </view>
  61. </view> -->
  62. </view>
  63. <view wx:for="{{visibleStreamList}}"
  64. wx:key="streamID"
  65. class="view-container player-container {{item.isVisible?'':'none'}}"
  66. id="{{'player-'+item.streamID}}"
  67. data-userid="{{item.userID}}"
  68. data-streamtype="{{item.streamType}}"
  69. bindtap="_doubleTabToggleFullscreen">
  70. <live-player
  71. class="player"
  72. id="{{item.streamID}}"
  73. data-userid="{{item.userID}}"
  74. data-streamid="{{item.streamID}}"
  75. data-streamtype="{{item.streamType}}"
  76. src= "{{item.src}}"
  77. mode= "RTC"
  78. autoplay= "{{item.autoplay}}"
  79. mute-audio= "{{item.muteAudio}}"
  80. mute-video= "{{item.muteVideo}}"
  81. orientation= "{{item.orientation}}"
  82. object-fit= "{{item.objectFit}}"
  83. background-mute= "{{item.enableBackgroundMute}}"
  84. min-cache= "{{item.minCache}}"
  85. max-cache= "{{item.maxCache}}"
  86. sound-mode= "{{item.soundMode}}"
  87. enable-recv-message= "{{item.enableRecvMessage}}"
  88. auto-pause-if-navigate= "{{item.autoPauseIfNavigate}}"
  89. auto-pause-if-open-native= "{{item.autoPauseIfOpenNative}}"
  90. debug="{{debug}}"
  91. bindstatechange="_playerStateChange"
  92. bindfullscreenchange="_playerFullscreenChange"
  93. bindnetstatus="_playerNetStatus"
  94. bindaudiovolumenotify="_playerAudioVolumeNotify"
  95. />
  96. <view class="no-video" wx:if="{{item.muteVideo}}">
  97. <image class="image" src="./static/display-pause-white.png"></image>
  98. <view class="text">
  99. <p>{{item.userID}}</p>
  100. </view>
  101. </view>
  102. <view class="no-video" wx:if="{{!item.hasVideo && !item.muteVideo}}">
  103. <image class="image" src="./static/mute-camera-white.png"></image>
  104. <view class="text">
  105. <p>{{item.userID}}</p>
  106. </view>
  107. <view class="text">
  108. <p>对方摄像头未打开</p>
  109. </view>
  110. </view>
  111. <view class="no-audio" wx:if="{{!item.hasAudio}}">
  112. <image class="image" src="./static/mute-mic-white.png"></image>
  113. </view>
  114. <view class="audio-volume" wx:if="{{item.hasAudio}}">
  115. <image class="image" src="./static/micro-open.png"></image>
  116. <view class="audio-active" style="height:{{item.volume}}%">
  117. <image class="image" src="./static/audio-active.png"></image>
  118. </view>
  119. </view>
  120. <view class="operation-bar">
  121. <view class="operation-item-container">
  122. <view class="operation-item" catchtap="_handleSubscribeRemoteAudio" data-user-i-d="{{item.userID}}" data-stream-type="{{item.streamType}}">
  123. <image class="item-image" src="{{item.muteAudio? './static/speaker-false.png': './static/speaker-white.png'}}"></image>
  124. </view>
  125. <view class="operation-item" catchtap="_handleSubscribeRemoteVideo" data-user-i-d="{{item.userID}}" data-stream-type="{{item.streamType}}">
  126. <image class="item-image" src="{{item.muteVideo? './static/display-pause-false.png': './static/display-play-white.png'}}"></image>
  127. </view>
  128. <view class="operation-item" bindtap="_toggleFullscreen" data-user-i-d="{{item.userID}}" data-stream-type="{{item.streamType}}">
  129. <image class="item-image" src="./static/fullscreen-white.png"></image>
  130. </view>
  131. </view>
  132. </view>
  133. </view>
  134. <view wx:for="{{gridPagePlaceholderStreamList}}" wx:key="id" class="view-container player-container player-placeholder">
  135. <image class="image" src="./static/mute-camera-white.png"></image>
  136. </view>
  137. </view>
  138. </view>
  139. </view>
  140. <!-- <view class="column-2">
  141. <view class="menu" wx:if="{{!isShowMoreMenu}}">
  142. <view class="menu-item" bindtap="_switchSettingPanel">
  143. <image class="image" src="./static/setting-white.png"></image>
  144. </view>
  145. <view class="menu-item" bindtap="_switchMemberListPanel">
  146. <image class="image" src="./static/list-white.png"></image>
  147. </view>
  148. <view class="menu-item" bindtap="_hangUp">
  149. <image class="image" src="./static/hangup-red.png"></image>
  150. </view>
  151. <view class="menu-item" bindtap="_toggleIMPanel">
  152. <image class="image" src="{{enableIM? './static/im-white.png': './static/im-disable.png'}}"></image>
  153. </view>
  154. </view>
  155. </view> -->
  156. </view>
  157. <view class="pages-container" wx:if="{{gridPageCount > 1}}">
  158. <view wx:for="{{gridPageCount}}" wx:key="this" class="page-item {{index+1 === gridCurrentPage? 'current':''}}" ></view>
  159. </view>
  160. <view class="panel memberlist-panel {{panelName === 'memberlist-panel' ? '' : 'none'}}" >
  161. <view bindtap="_handleMaskerClick" class='close-btn'>X</view>
  162. <view class="panel-header">成员列表</view>
  163. <view class="panel-body">
  164. <view class="panel-tips" wx:if="{{streamList.length === 0}}">暂无成员</view>
  165. <scroll-view class="scroll-container" scroll-y="true">
  166. <view class="member-item" wx:for="{{streamList}}" wx:key="streamID" >
  167. <view class="member-id">{{item.userID}}</view>
  168. <view class="member-btns">
  169. <button class="btn" hover-class="btn-hover" data-userid="{{item.userID}}" data-streamtype="{{item.streamType}}" data-key="objectFit" data-value="fillCrop|contain" bindtap="_setPlayerProperty">{{item.objectFit === 'fillCrop'? '填充':'适应'}}</button>
  170. <button class="btn" hover-class="btn-hover" data-userid="{{item.userID}}" data-streamtype="{{item.streamType}}" data-key="orientation" data-value="vertical|horizontal" bindtap="_setPlayerProperty">{{item.orientation === 'vertical'? '竖屏':'横屏'}}</button>
  171. <button class="btn" hover-class="btn-hover" data-userid="{{item.userID}}" data-streamtype="{{item.streamType}}" bindtap="_switchStreamType" wx:if="{{item.streamType === 'main'}}">{{item._definitionType === 'small'? '小画面':'主画面'}}</button>
  172. <button class="btn" hover-class="btn-hover" data-userid="{{item.userID}}" data-streamtype="{{item.streamType}}" bindtap="_handleSnapshotClick">截屏</button>
  173. </view>
  174. </view>
  175. </scroll-view>
  176. </view>
  177. </view>
  178. <view class="panel setting-panel {{panelName === 'setting-panel' ? '' : 'none'}}" >
  179. <view bindtap="_handleMaskerClick" class='close-btn'>X</view>
  180. <view class="panel-header">推流设置</view>
  181. <view class="panel-body">
  182. <scroll-view class="scroll-container" scroll-y="true">
  183. <view class="setting-option">
  184. <view class="label">启用摄像头</view>
  185. <view class="btn-normal" bindtap="_toggleVideo">
  186. <image class="btn-image" src="{{pusher.enableCamera? './static/camera-true.png': './static/camera-false.png'}}"></image>
  187. </view>
  188. </view>
  189. <view class="setting-option">
  190. <view class="label">启用麦克风</view>
  191. <view class="btn-normal" bindtap="_toggleAudio">
  192. <image class="btn-image" src="{{pusher.enableMic? './static/audio-true.png': './static/audio-false.png'}}"></image>
  193. </view>
  194. </view>
  195. <view class="setting-option">
  196. <view class="label">切换摄像头</view>
  197. <view class="btn-normal" bindtap="switchCamera" >
  198. <image class="btn-image" src="./static/switch.png"></image>
  199. </view>
  200. </view>
  201. <view class='setting-option'>
  202. <view class="label">开启美颜</view>
  203. <switch class="setting-switch" color="#006eff" checked="{{pusher.beautyLevel == 9 ? true: false}}" data-key="beautyLevel" data-value="9|0" data-value-type="number" bindchange="_setPuserProperty"/>
  204. </view>
  205. <view class='setting-option'>
  206. <view class="label">开启AGC</view>
  207. <switch class="setting-switch" color="#006eff" checked="{{pusher.enableAgc}}" data-key="enableAgc" data-value="true" data-value-type="boolean" bindchange="_setPuserProperty"/>
  208. </view>
  209. <view class='setting-option'>
  210. <view class="label">开启ANS</view>
  211. <switch class="setting-switch" color="#006eff" checked="{{pusher.enableAns}}" data-key="enableAns" data-value="true" data-value-type="boolean" bindchange="_setPuserProperty"/>
  212. </view>
  213. <view class='setting-option'>
  214. <view class="label">开启横屏推流</view>
  215. <switch class="setting-switch" color="#006eff" checked="{{pusher.videoOrientation === 'vertical' ? false: true}}" data-key="videoOrientation" data-value="horizontal|vertical" data-value-type="string" bindchange="_setPuserProperty"/>
  216. </view>
  217. </scroll-view>
  218. </view>
  219. </view>
  220. <view class="panel bgm-panel {{panelName === 'bgm-panel' ? '' : 'none'}}" >
  221. <view bindtap="_handleMaskerClick" class='close-btn'>X</view>
  222. <view class="panel-header">背景音乐</view>
  223. <view class="panel-body">
  224. <view class="setting-option">
  225. <view class="label">MIC音量</view>
  226. <view class="slider-content">
  227. <slider value="{{MICVolume}}" min="0" max="100" show-value="true" activeColor="#006eff" bindchange="_changeProperty" data-property-name="MICVolume" />
  228. </view>
  229. </view>
  230. <view class="setting-option">
  231. <view class="label">BGM音量</view>
  232. <view class="slider-content">
  233. <slider value="{{BGMVolume}}" min="0" max="100" show-value="true" activeColor="#006eff" bindchange="_changeProperty" data-property-name="BGMVolume" />
  234. </view>
  235. </view>
  236. <view class="setting-option">
  237. <view class="label">播放进度</view>
  238. <view class="slider-content">
  239. <progress activeColor="#006eff" percent="{{BGMProgress}}"></progress>
  240. </view>
  241. </view>
  242. <view class="menu">
  243. <view class="menu-item" bindtap="_handleBGMOperation" data-operation-name="playBGM">
  244. <view class="label">播放</view>
  245. </view>
  246. <view class="menu-item" bindtap="_handleBGMOperation" data-operation-name="pauseBGM">
  247. <view class="label">暂停</view>
  248. </view>
  249. <view class="menu-item" bindtap="_handleBGMOperation" data-operation-name="resumeBGM">
  250. <view class="label">继续</view>
  251. </view>
  252. <view class="menu-item" bindtap="_handleBGMOperation" data-operation-name="stopBGM">
  253. <view class="label">停止</view>
  254. </view>
  255. </view>
  256. </view>
  257. </view>
  258. <view class="masker {{panelName =='' ? 'none' : ''}}" bindtap="_handleMaskerClick"></view>
  259. </view>
  260. </template>