VideoPlayer.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <template>
  2. <div id="dplayer" ref="dplayer" style="height: 480px;" />
  3. </template>
  4. <script>
  5. import { videoUrl } from '@/api/video'
  6. import SocketInstance from '@/utils/ws/socket-instance'
  7. import flvjs from 'flv.js'
  8. import DPlayer from 'dplayer'
  9. import { getAccessToken } from '@/utils/auth'
  10. export default {
  11. name: 'VideoPlayer',
  12. props: {
  13. videoProp: {
  14. type: Object,
  15. default: () => null
  16. }
  17. },
  18. data() {
  19. return {
  20. flvjs,
  21. DPlayer,
  22. danmaku: {
  23. api: '//api.reghao.cn/api/comment/danmaku/',
  24. token: 'bili'
  25. },
  26. getUrl: true
  27. }
  28. },
  29. created() {
  30. },
  31. mounted() {
  32. const videoId = this.videoProp.videoId
  33. if (this.getUrl) {
  34. this.getVideoUrl(videoId)
  35. }
  36. },
  37. methods: {
  38. getVideoUrl(videoId) {
  39. videoUrl(videoId).then(res => {
  40. if (res.code === 0) {
  41. var event = false
  42. const token = getAccessToken()
  43. if (token != null) {
  44. SocketInstance.connect()
  45. event = true
  46. }
  47. const urlType = res.data.type
  48. if (urlType === 'mp4') {
  49. const urls = res.data.urls
  50. for (const url of urls) {
  51. url.type = 'normal'
  52. }
  53. this.initMp4Player(this.videoProp.userId, videoId, this.videoProp.coverUrl, urls, res.data.currentTime, event)
  54. } else if (urlType === 'flv') {
  55. const urls = res.data.urls
  56. this.initFlvPlayer(this.videoProp.userId, videoId, this.videoProp.coverUrl, urls, res.data.currentTime, event)
  57. } else {
  58. this.$notify.error({
  59. message: '视频 url 类型不合法',
  60. type: 'warning',
  61. duration: 3000
  62. })
  63. }
  64. } else {
  65. this.$notify.error({
  66. message: '视频 url 获取失败',
  67. type: 'warning',
  68. duration: 3000
  69. })
  70. }
  71. }).catch(error => {
  72. this.$notify.error({
  73. message: error.message,
  74. type: 'error',
  75. duration: 3000
  76. })
  77. })
  78. },
  79. danmakuConfig() {
  80. // TODO 获取弹幕配置,将 videoUrl 作为本函数的回调
  81. },
  82. initMp4Player(userId, videoId, coverUrl, urls, pos, event) {
  83. const player = new DPlayer({
  84. container: document.querySelector('#dplayer'),
  85. lang: 'zh-cn',
  86. logo: '/logo.png',
  87. screenshot: true,
  88. autoplay: true,
  89. volume: 0.1,
  90. mutex: true,
  91. video: {
  92. pic: coverUrl,
  93. defaultQuality: 0,
  94. quality: urls,
  95. hotkey: true
  96. },
  97. danmaku: {
  98. id: videoId,
  99. maximum: 10000,
  100. api: this.danmaku.api,
  101. token: this.danmaku.token,
  102. user: userId,
  103. bottom: '15%',
  104. unlimited: true
  105. }
  106. })
  107. // 设置音量
  108. // player.volume(0.1, true, false)
  109. // 跳转到上次看到的位置
  110. player.seek(pos)
  111. /* 事件绑定 */
  112. player.on('progress', function() {
  113. if (event) {
  114. const payload = {}
  115. payload.videoId = videoId
  116. payload.currentTime = player.video.currentTime
  117. payload.ended = false
  118. const jsonData = {}
  119. jsonData.event = 'progress'
  120. jsonData.payload = JSON.stringify(payload)
  121. SocketInstance.send(jsonData)
  122. }
  123. })
  124. player.on('ended', () => {
  125. if (event) {
  126. const payload = {}
  127. payload.videoId = videoId
  128. payload.currentTime = player.video.currentTime
  129. payload.ended = true
  130. const jsonData = {}
  131. jsonData.event = 'progress'
  132. jsonData.payload = JSON.stringify(payload)
  133. SocketInstance.send(jsonData)
  134. }
  135. })
  136. player.on('volumechange', () => {
  137. console.log('声音改变')
  138. })
  139. },
  140. initFlvPlayer(userId, videoId, coverUrl, urls, pos, event) {
  141. const player = new DPlayer({
  142. container: document.getElementById('dplayer'),
  143. lang: 'zh-cn',
  144. logo: '/logo.png',
  145. screenshot: true,
  146. autoplay: true,
  147. volume: 0.1,
  148. mutex: true,
  149. video: {
  150. pic: coverUrl,
  151. defaultQuality: 0,
  152. quality: urls,
  153. hotkey: true,
  154. type: 'customFlv',
  155. customType: {
  156. customFlv: function(video, player) {
  157. const flvPlayer = flvjs.createPlayer({
  158. type: 'flv',
  159. url: video.src
  160. })
  161. flvPlayer.attachMediaElement(video)
  162. flvPlayer.load()
  163. }
  164. }
  165. }
  166. })
  167. // 跳转到上次看到的位置
  168. player.seek(pos)
  169. /* 事件绑定 */
  170. player.on('progress', function() {
  171. if (event) {
  172. const payload = {}
  173. payload.videoId = videoId
  174. payload.currentTime = player.video.currentTime
  175. payload.ended = false
  176. const jsonData = {}
  177. jsonData.event = 'progress'
  178. jsonData.payload = JSON.stringify(payload)
  179. SocketInstance.send(jsonData)
  180. }
  181. })
  182. player.on('ended', () => {
  183. if (event) {
  184. const payload = {}
  185. payload.videoId = videoId
  186. payload.currentTime = player.video.currentTime
  187. payload.ended = true
  188. const jsonData = {}
  189. jsonData.event = 'progress'
  190. jsonData.payload = JSON.stringify(payload)
  191. SocketInstance.send(jsonData)
  192. }
  193. })
  194. player.on('volumechange', () => {
  195. console.log('声音改变')
  196. })
  197. }
  198. }
  199. }
  200. </script>
  201. <style>
  202. </style>