简单版本视频播放服务器V3-前端优化-播放器在左,列表在右侧【推荐】【完成】

news2024/11/26 16:52:10

做个家用版本的家庭影院,通过这个服务器可以给电脑,平板,手机等设备提供直接播放电影的作用,通过离线下载电影放入目录里就是就可以给全家提供电影播放了,通过浏览器就是可以访问电脑里面的视频,实现简单的家庭版本服务了。

一、优化后的前端代码

1.0最终代码:【前端以这个为主;后端不变】

解决滚动条不能滚动的问题,本次带有一个滚动条,可以滚动播放列表资源;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        #container {
            display: flex;
            flex-direction: row;
            height: 50vh; /* 设置容器高度为视窗高度 */


        }


        /* 视频播放器样式 */
        /*#videoPlayer {*/
        /*    display: flex;*/
        /*    flex-direction: row;*/
        /*}*/

        #video {
            flex: 1;
        }

        /* 播放列表样式 */
        .playlist {
            list-style: none;
            padding: 0;
            width: 200px;

            margin-left: 20px;
            overflow-y: auto; /* 当列表超过容器高度时显示滚动条 */
            height: 100%; /* 设置播放列表高度为容器高度 */

        }

        .playlist-item {
            cursor: pointer;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 5px;
            margin-bottom: 10px;

        }

        .playlist-item:last-child {
            margin-bottom: 0;
        }

        .playlist-item.active {
            background-color: #f5f5f5;
        }
        li{
            display: block;
        }
    </style>
</head>
<body>

<div id="container">

<!--    <video id="video" width="420" height="340" controls="controls" src="http://10.72.1.241:8080/GetFile/a1.mp4"-->
    <video id="video" width="420" height="340" controls="controls" src="http://10.72.1.241:8080/GetFile/a1.mp4"
           type="video/ogg"></video></br>

    <ul id="playlist" class="playlist">
        {{range $index,$v := .names}}

        <li class="playlist-item" onclick="changeVideo('{{$v }}', '{{$v }}')">{{$v }}</li><br>
<!--        <li class="playlist-item" onclick="changeVideo('video2.mp4', 'Video 2')">视频 2</li>-->
<!--        <li class="playlist-item" onclick="changeVideo('video3.mp4', 'Video 3')">视频 3</li>-->
        {{end}}
    </ul>

</div>

<script>
    var video = document.getElementById('video');
    var playlistItems = Array.from(document.getElementsByClassName('playlist-item'));

    function changeVideo(source, title) {
        video.src ="http://10.72.1.241:8080/GetFile/" + source;
        // video.play();

        // 更新选中状态和标题
        playlistItems.forEach(function(item) {
            item.classList.remove('active');
        });
        event.target.classList.add('active');
        document.title = title;
    }
</script>
</body>
</html>

 演示截图:


 可以有播放资源的滚动播放条了;

到此基本结束了,这个前端不在优化了,最终版本







=================================

1.1前端代码[参考不作为实际使用]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        /* 视频播放器样式 */
        #videoPlayer {
            display: flex;
        }

        #video {
            flex: 1;
        }

        /* 播放列表样式 */
        .playlist {
            list-style: none;
            padding: 0;
            width: 200px;
            margin-left: 20px;
        }

        .playlist-item {
            cursor: pointer;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 5px;
            margin-bottom: 10px;

        }

        .playlist-item:last-child {
            margin-bottom: 0;
        }

        .playlist-item.active {
            background-color: #f5f5f5;
        }
        li{
            display: block;
        }
    </style>
</head>
<body>
<div id="videoPlayer">
<!--    <video id="video" width="420" height="340" controls></video>-->
    <video id="video" width="420" height="340" controls="controls" src="http://10.72.1.241:8080/GetFile/a1.mp4"
           type="video/ogg"></video></br>

    <ul id="playlist" class="playlist">
        {{range $index,$v := .names}}

        <li class="playlist-item" onclick="changeVideo('{{$v }}', '{{$v }}')">{{$v }}</li><br>
<!--        <li class="playlist-item" onclick="changeVideo('video2.mp4', 'Video 2')">视频 2</li>-->
<!--        <li class="playlist-item" onclick="changeVideo('video3.mp4', 'Video 3')">视频 3</li>-->
        {{end}}
    </ul>

</div>

<script>
    var video = document.getElementById('video');
    var playlistItems = Array.from(document.getElementsByClassName('playlist-item'));

    function changeVideo(source, title) {
        video.src ="http://10.72.1.241:8080/GetFile/" + source;
        // video.play();

        // 更新选中状态和标题
        playlistItems.forEach(function(item) {
            item.classList.remove('active');
        });
        event.target.classList.add('active');
        document.title = title;
    }
</script>
</body>
</html>

1.2前端样式,播放器的最终样式;

二、后端代码

2.1后端代码

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"path"
	"strings"

	"github.com/gin-gonic/gin"
)

// 这个代码在windows,linux中都是可以使用,这里重点关注的就是
//
//	videos := fmt.Sprintf("%s/%s", ml, "videos") 这样设置  windows linux都是可以使用
//
// 实现遍历程序的当前目录videos下的文件
func ListDir() ([]string, error) {
	ml, _ := os.Getwd()
	videos := fmt.Sprintf("%s/%s", ml, "videos")

	infos, err := ioutil.ReadDir(videos)
	if err != nil {
		return nil, err
	}
	names := make([]string, len(infos))
	for i, info := range infos {
		//获取文件名 确认以*MP4结尾的放入切片中
		filename := info.Name()
		if strings.HasSuffix(filename, ".mp4") {
			//if filename
			names[i] = info.Name()
		}

	}
	return names, nil
}

func ListDirllinux() ([]string, error) {
	ml, _ := os.Getwd()
	videos := fmt.Sprintf("%s//%s", ml, "videos")

	infos, err := ioutil.ReadDir(videos)
	if err != nil {
		return nil, err
	}
	names := make([]string, len(infos))
	for i, info := range infos {
		//获取文件名 确认以*MP4结尾的放入切片中
		filename := info.Name()
		if strings.HasSuffix(filename, ".mp4") {
			//if filename
			names[i] = info.Name()
		}

	}
	return names, nil
}

// 文件下载功能实现
func DowFile(c *gin.Context) {
	//通过动态路由方式获取文件名,以实现下载不同文件的功能
	name := c.Param("name")
	//拼接路径,如果没有这一步,则默认在当前路径下寻找
	filename := path.Join("./videos", name)
	//响应一个文件
	c.File(filename)
	return
}

func main() {
	r := gin.Default()
	r.LoadHTMLGlob("templates/*")
	// 初始化默认静态资源
	r.StaticFS("/videos", http.Dir("./videos"))
	//windows 和linux下的路径稍微不同
	names, _ := ListDir()
	//names, _ := ListDirllinux()

	r.GET("/index", func(c *gin.Context) {

		//c.HTML(http.StatusOK, "index.html", gin.H{"names": names})
		c.HTML(http.StatusOK, "newindexV1.html", gin.H{"names": names})
	})
	r.GET("/GetFile/:name", DowFile)
	//r.Run()
	r.Run("0.0.0.0:8080")
}

 2.2后端代码组成样式

 三、代码经历过程

简单版本视频播放服务器V2
https://blog.csdn.net/wtt234/article/details/131752840

简单版本视频播放服务器V1
https://blog.csdn.net/wtt234/article/details/131708946


简单播放器的打包过程,在不同平台如何打包事项
https://blog.csdn.net/wtt234/article/details/131728078

 到这里经过几次修改基本完成了一个简单的视频服务,为家庭使用可以的,前端界面也优化了多个版本,以及打包过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Html基础知识学习——圣杯布局、margin负值、等高布局

文章目录 圣杯布局margin负值等高布局 圣杯布局 两边页面固定中间页面宽度随着浏览器大小自适应 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

代码随想录算法训练营day6 | 242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

目录 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242. 有效的字母异位词 242. 有效的字母异位词 难度&#xff1a;easy 类型&#xff1a;哈希表 思路&#xff1a; 代码&#xff1a; class Solution {public boolean isAnagram(String s, St…

计算机网络 day9 DNAT实验

目录 DNAT DNAT策略的典型应用环境 DNAT策略的原理 在网关中使用DNAT策略发布内网服务器 DNAT实验&#xff1a; 实验环境&#xff1a; DNAT网络规划拓扑图&#xff1a; 步骤&#xff1a; 1、创建linux客户端Web网站&#xff08;go语言&#xff09;&#xff0c;实现Web服…

二、DDL-1.数据库操作

一、查询 1、查询所有数据库 show databases; MySQL自带的默认的数据库有四个&#xff1a; 二、创建 1、创建一个新的数据库itcast&#xff08;不区分大小写&#xff09;&#xff1a; create database itcast; 查询所有数据库&#xff1a;多了itcast 2、再创建同名的数据库…

Latex合并多个公式且居中

要求&#xff1a;1&#xff1a;多个公式居中对齐 2&#xff1a;多个公式组合只有一个编号。 结果类似于这一种&#xff1a; 代码&#xff1a;使用gathered可以。 \begin{equation}\begin{gathered}\vspace{0.6em}{E} {A(I)}\\\vspace{0.6em}{F} Conv(\sum_{i1}^3{M_i}) \\{…

可移植性测试包括哪些

可移植性测试 可移植性是指应用程序能够安装到不同的环境中&#xff0c;在不同的环境中使用&#xff0c;甚至可以移动到不同的环境中。当然&#xff0c;前两者对所有系统都很重要。就PC软件而言&#xff0c;鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速…

AutoSAR EM执行管理模块01

1执行管理的作用&#xff1f; 管理应用AA的生命周期&#xff0c;啥时候启动&#xff0c;啥时候shut down。管理板子的启动和关闭&#xff0c;这里的板子跑的程序是最基本的程序&#xff0c;不包含业务逻辑的AA&#xff0c;可以理解为最小系统的程序。根据定义的执行依赖关系加载…

Appium Android ——利用 TestNG 并行执行用例

目录 前言&#xff1a; 一、测试类 二、连接两个 Android 设备或启动两个虚拟机 三、项目路径下新建两个 testng.xml 四、开启两个 appium server 五、导出依赖 六、执行测试 七、查看报告 前言&#xff1a; Appium是一个流行的移动应用自动化测试工具&#xff0c;…

PHP与Golang对战:两种语言的比较与应用场景探讨

引言 在软件开发领域&#xff0c;选择一种合适的编程语言对于项目的成功至关重要。而在今天的文中&#xff0c;我们将探讨两个备受争议的编程语言——PHP与Golang之间的对战。通过比较它们的优势和应用场景&#xff0c;帮助开发者更好地了解如何选择适合自己项目的语言。 PHP的…

vue3和vue2主要的一些区别?

一、Vue3介绍 关于vue3的重构背景&#xff0c;尤大是这样说的&#xff1a; 「Vue 新版本的理念成型于 2018 年末&#xff0c;当时 Vue 2 的代码库已经有两岁半了。比起通用软件的生命周期来这好像也没那么久&#xff0c;但在这段时期&#xff0c;前端世界已经今昔非比了 在我…

Spring 框架——事件驱动模型

目录 1.概述2.三种角色2.1.事件角色2.2.事件监听者角色2.3.事件发布者角色 3.示例 1.概述 &#xff08;1&#xff09;Spring 事件驱动模型是 Spring 框架中的一种编程模型&#xff0c;也被称为发布/订阅模型&#xff0c;通过使用观察者模式和事件机制&#xff0c;实现了组件之…

Flask_自定义flask的cmd命令

创建自定义命令 from flask import Flaskapp Flask(__name__)app.cli.command() def hello():"""命令说明写这里"""print("hello python")if __name__ __main__:app.run() 执行flask --help 可以在命令查看定义的命令 注意事项&a…

网络工程基础框架3层次模型 ,1接入层2 汇聚层 3核心层

网络工程基础框架3层次模型 ,1接入层2 汇聚层 3核心层_「已注销」的博客-CSDN博客 CISCO有自己的3层层次模型 1&#xff0c;接入层 2&#xff0c;汇聚层 3&#xff0c;核心层 区别&#xff1a;通常将网络中直接面向用户连接或访问网络的部分称为接入层&#xff0c;将位于接入层…

盛元广通科研院所实验室安全管理系统LIMS

实验室的管理与安全直接影响着教学与科研质量&#xff0c;从科研角度出发&#xff0c;实验室安全风险特点与生产现场安全风险特点存在较大差异&#xff0c;危险源种类复杂实验内容变更频繁&#xff0c;缺乏有效监管&#xff0c;实验室安全运行及管理长期游离于重点监管领域外&a…

抖音seo矩阵源码SaaS搭建代码分享-可二开

场景&#xff1a;适用于抖音seo源码&#xff0c;抖音矩阵源码&#xff0c;短视频seo源码&#xff0c;短视频矩阵源码&#xff0c;抖音短视频seo矩阵系统源码开发搭建等。 抖音seo源码优化逻辑 抖音SEO是通过一系列的技术手段和优化策略来提升视频内容在抖音平台内的曝光率和排名…

机器学习实战系列:工业蒸汽量预测

背景介绍 火力发电的基本原理是&#xff1a;燃料在燃烧时加热水生成蒸汽&#xff0c;蒸汽压力推动汽轮机旋转&#xff0c;然后汽轮机带动发电机旋转&#xff0c;产生电能。在这一系列的能量转化中&#xff0c;影响发电效率的核心是锅炉的燃烧效率&#xff0c;即燃料燃烧加热水…

vue项目中实现3D万花筒和3D文字旋转效果

一、万花筒 1、html部分 //万花筒html <div class"carousel" data-gap"368"><figure><div class"carouselItem" v-for"(item,index) in exhibitionList" :key"index"><div class"itemContent&q…

动态内存函数详解-【malloc,calloc,realloc,free】

动态内存函数详解 malloc一、malloc的简介1.malloc函数的定义&#xff1a;2.参数&#xff1a;3.返回值&#xff1a;4.功能&#xff1a; 二、malloc函数的使用 free函数free函数的简介free函数使用注意事项 calloccalloc函数的简介二、calloc函数的使用calloc函数的注意事项 rea…

Ubuntu环境搭建

本文以Ubuntu 18.04为例 安装repo mkdir ~/bin export PATH~/bin:$PATH如果可以访问 google 的地址&#xff0c;下载 Repo 工具&#xff0c;并确保它可执行&#xff1a; curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod ax ~/bin/rep…

memset的坑

前言 memset 作为对内存初始化的函数&#xff0c;还是有不少坑和误区的&#xff0c;今天就来对这个函数作一个总结。 一、函数作用 memset 函数在 C 中被广泛应用于内存的初始化和设置。它可以将一段连续的内存空间快速设置为指定的值。这个函数主要作用于数组、结构体等数据类…