Blogger Information
Blog 57
fans 3
comment 0
visits 60548
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
laravel实战-仿抖音项目-视频在线播放
岂几岂几
Original
1493 people have browsed it

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. }
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:学得挺快, 加油
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post