博客列表 >laravel实战-仿抖音项目-视频在线播放

laravel实战-仿抖音项目-视频在线播放

岂几岂几
岂几岂几原创
2020年06月28日 00:32:501491浏览

laravel实战-仿抖音项目-视频在线播放

学习心得

  • 报班的目的, 一是想系统的学习PHP互联网开发, 第二个就是想学习网络中的视频播放和如何保护资源安全. 西门老师只介绍了视频播放, 视频安全方面, 提供了视频地址加密和阿里云oss服务的思路, 感觉好像还是不懂怎么做, 先自己看手册吧.

  • web项目中引入第三方插件的一般套路是: 文件包放到/public目录; 页面文件引入插件js, css等文件; 布局中增加一个容器; 使用js创建插件对象, 传入字面量对象设置插件参数.

  • 使用冒泡的方式, 在视频列表容器绑定监听点击事件的处理脚本, 点击视频项, 事件冒泡到视频列表容器, 触发事件处理脚本.

  • 使用定位的方式把标题栏固定在顶部时, 记得加上z-index: 大大的数样式属性, 否则标题栏还是会被滚动的内容遮盖.

  • 目前主流浏览器已禁用视频自动播放功能, 并不是系统bug, 也不是插件bug, 不必纠结.

1. 在项目中使用ckplayer

  • ckplayer官网下载播放器文件包,解压到/public文件夹中,建议放到/public/static/plugin/中.

  • 在前端页面布局中加入渲染播放器的容器<div id="video" style="widows: 100vw;height:100vh;"></div>

  • 使用js创建播放器对象.

  1. <script type="text/javascript">
  2. var videoObject = {
  3. container: '#video',//“#”代表容器的ID,“.”或“”代表容器的class
  4. variable: 'player',//该属性必需设置,值等于下面的new chplayer()的对象
  5. flashplayer:false,//如果强制使用flashplayer则设置成true
  6. video:'/storage/douyin/1.mp4'//视频地址
  7. ,mobileCkControls: true // 中间的大播放按钮
  8. , click: true
  9. };
  10. var player=new ckplayer(videoObject);
  11. </script>

2. 视频列表中点击视频项跳转到播放界面播放

  1. // 点击事件绑定到视频容器上,点击视频项,使用冒泡的方式向上传递点击事件,在视频容器上触发处理脚本
  2. document.querySelector('.video-list').addEventListener('click', function(e) {
  3. // 触发事件的元素
  4. var item = e.target;
  5. // 绑定事件的元素
  6. var list = e.currentTarget;
  7. // 因为绑定事件的元素是视频列表的容器,点击容器不需要触发任何逻辑。
  8. if(item == list) {
  9. return;
  10. }
  11. window.location.href="/douyin/playVideo";
  12. }, false);

3. 代码清单

  • 视图文件

    • 1-视频广场
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>视频广场</title>
  7. <link rel="stylesheet" href="/static/plugin/layui/css/layui.css" media="all">
  8. <script src="/static/plugin/layui/layui.js"></script>
  9. <style>
  10. body {
  11. background-color: #000;
  12. padding: 0;
  13. margin: 0;
  14. width: 100vw;
  15. height: 100vh;
  16. }
  17. .title-area {
  18. background-color: #000;
  19. height: 50px;
  20. line-height: 50px;
  21. text-align: center;
  22. color: #999;
  23. position: fixed;
  24. width: 100vw;
  25. top: 0px;
  26. z-index: 100;
  27. }
  28. .title-area>.return-back {
  29. float: left;
  30. margin-left: 5px;
  31. font-size: 1.3rem;
  32. }
  33. .title-area>.title {
  34. font-size: 1.2rem;
  35. }
  36. #carousel {
  37. margin-top: 50px;
  38. }
  39. .video-list {
  40. margin-top: 3px;
  41. display: grid;
  42. grid-template-columns: 1fr 1fr;
  43. gap: 3px;
  44. }
  45. .video-list>.video-item {
  46. background-color: #000;
  47. position: relative;
  48. text-align: center;
  49. color: #fff;
  50. }
  51. .video-list>.video-item>img {
  52. /* max-width: 100%;
  53. max-height: 100%; */
  54. /* max-width: 50vw;
  55. max-height: 50vw; */
  56. width: 100%;
  57. height: 50vw;
  58. }
  59. .video-list>.video-item>span:first-of-type {
  60. position: absolute;
  61. bottom: 40px;
  62. left: 10px;
  63. }
  64. .video-list>.video-item>span:last-of-type {
  65. position: absolute;
  66. bottom: 20px;
  67. left: 10px;
  68. }
  69. </style>
  70. </head>
  71. <body onload="resizeItem()">
  72. <!-- 标题区 -->
  73. <section class="title-area">
  74. <i class="layui-icon layui-icon-left return-back"></i>
  75. <span class="title">视频广场</span>
  76. </section>
  77. <section class="layui-carousel" id="carousel">
  78. <div carousel-item>
  79. <!-- 条目中可以是任意内容,如:<img src=""> -->
  80. <div>条目1</div>
  81. <div>条目2</div>
  82. <div>条目3</div>
  83. <div>条目4</div>
  84. <div>条目5</div>
  85. </div>
  86. </section>
  87. <section class="video-list">
  88. <div class="video-item">
  89. <img src="/storage/douyin/1.jpg" alt="">
  90. <span class="place">北京</span>
  91. <span class="desc">来吧, 不后悔</span>
  92. </div>
  93. <div class="video-item">
  94. <img src="/storage/douyin/2.jpg" alt="">
  95. <span class="place">北京</span>
  96. <span class="desc">来吧, 不后悔</span>
  97. </div>
  98. <div class="video-item">
  99. <img src="/storage/douyin/3.jpg" alt="">
  100. <span class="place">北京</span>
  101. <span class="desc">来吧, 不后悔</span>
  102. </div>
  103. <div class="video-item">
  104. <img src="/storage/douyin/4.jpg" alt="">
  105. <span class="place">北京</span>
  106. <span class="desc">来吧, 不后悔</span>
  107. </div>
  108. <div class="video-item">
  109. <img src="/storage/douyin/5.jpg" alt="">
  110. <span class="place">北京</span>
  111. <span class="desc">来吧, 不后悔</span>
  112. </div>
  113. <div class="video-item">
  114. <img src="/storage/douyin/6.jpg" alt="">
  115. <span class="place">北京</span>
  116. <span class="desc">来吧, 不后悔</span>
  117. </div>
  118. <div class="video-item">
  119. <img src="/storage/douyin/7.jpg" alt="">
  120. <span class="place">北京</span>
  121. <span class="desc">来吧, 不后悔</span>
  122. </div>
  123. <div class="video-item">
  124. <img src="/storage/douyin/8.jpg" alt="">
  125. <span class="place">北京</span>
  126. <span class="desc">来吧, 不后悔</span>
  127. </div>
  128. </section>
  129. </body>
  130. <script>
  131. layui.use(['layer', 'carousel'], function () {
  132. layer = layui.layer;
  133. // 轮播
  134. carousel = layui.carousel;
  135. //建造实例
  136. carousel.render({
  137. elem: '#carousel'
  138. , width: '100%' //设置容器宽度
  139. , height: '120px'
  140. // , arrow: 'always' //始终显示箭头
  141. //,anim: 'updown' //切换动画方式
  142. });
  143. // 点击事件绑定到视频容器上,点击视频项,使用冒泡的方式向上传递点击事件,在视频容器上触发处理脚本
  144. document.querySelector('.video-list').addEventListener('click', function(e) {
  145. // 触发事件的元素
  146. var item = e.target;
  147. // 绑定事件的元素
  148. var list = e.currentTarget;
  149. // 因为绑定事件的元素是视频列表的容器,点击容器不需要触发任何逻辑。
  150. if(item == list) {
  151. return;
  152. }
  153. window.location.href="/douyin/playVideo";
  154. }, false);
  155. });
  156. </script>
  157. </html>
  • 2-播放视频界面

    • 实际项目中, 视频地址是从DB中动态获取的, 这里使用写死的文件只显示播放效果.
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>播放视频</title>
  7. <link rel="stylesheet" href="/static/plugin/layui/css/layui.css" media="all">
  8. <script src="/static/plugin/layui/layui.js"></script>
  9. <script type="text/javascript" src="/static/plugin/ckplayer/ckplayer/ckplayer.js"></script>
  10. <style>
  11. body {
  12. background-color: #000;
  13. padding: 0;
  14. margin: 0;
  15. width: 100vw;
  16. height: 100vh;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="video" style="widows: 100vw;height:100vh;"></div>
  22. </body>
  23. <script type="text/javascript">
  24. var videoObject = {
  25. container: '#video',//“#”代表容器的ID,“.”或“”代表容器的class
  26. variable: 'player',//该属性必需设置,值等于下面的new chplayer()的对象
  27. flashplayer:false,//如果强制使用flashplayer则设置成true
  28. video:'/storage/douyin/1.mp4'//视频地址
  29. ,mobileCkControls: true // 中间的大播放按钮
  30. , click: true
  31. };
  32. var player=new ckplayer(videoObject);
  33. </script>
  34. </html>
  • 3-“抖音”控制器
  1. <?php
  2. namespace App\Http\Controllers\douyin;
  3. use App\Http\Controllers\Controller;
  4. class Douyin extends Controller {
  5. public function index() {
  6. return view('/douyin/square');
  7. }
  8. public function playVideo() {
  9. return view('/douyin/playVideo');
  10. }
  11. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议