NET实现分片上传视频,截取

B站视频下载工具选型指南:DownKyi、GreenVideo、飞鱼、BiliTools深度对比 B站视频下载本质是基于公开流媒体协议的合法本地化存档,而非破解行为。其技术原理围绕Dash分片(m4s)、API逆向解析、浏览器网络劫持与Python自动化封装展开,核心价值在于保障离线学习、素材剪辑、内容备份等工程化需求。主流方案中,DownKyi以Windows端稳定API适配见长,GreenVideo主打跨平台轻量截取,飞鱼视频下载助手擅长渲染层现场捕获私密内容,BiliTools则为开发者提供模块化Python工具链。结合清晰度选择、m4s合并、字幕格式(ASS/SRT/LRC)及充电视频鉴权等实操 阅读详情

UpLoadBigFile.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UpLoadBigFile.aspx.cs" Inherits="Pro.UpLoadBigFile" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script src="Scripts/jquery-1.10.2.js"></script>
</head>
<body>
<!--上传视频-->
<div>
    <div>
        <div>
            <div>
                <span class="">上传视频</span>
            </div>
            <input id="uploadvideofile" type="file" accept="video/mp4,video/quicktime" class="up-video"/>
        </div>
    </div>
    <div id="videoplayer" style="display: none"></div>
    <div id="videooutput"></div>
    <div>
        <p style="color: #797979; margin-top: 5px; font-size: 12px;">视频格式必须为: mp4或mov。视频时长须在15秒以内,超出时长系统将自动截取前15秒内容。</p>
    </div>
</div>

<script src="Scripts/ajax.1.5.2.js"></script>
<%--传视频相关--%>
<script type="text/javascript">
    $('#uploadvideofile').change(function() {
        var file, videoURL, windowURL;
        var filemaxsize = 1024 * 1024 * 20; //200M 
        if (fileValid(this, filemaxsize, 'video')) {
            file = this.files[0];
            try {
                var temp = ajax.upload_big(
                    "AjaxHandlers/UploadVideoHandler.ashx?opration=uploadv", //文件上传地址
                    "#uploadvideofile", //input = file 选择器
                    1024 * 1024, //切割文件大小
                    "*", //文件限制类型 mime类型
                    function(index) { //上传成功事件
                        //console.log("slice [ " + index + "] uploaded")
                    },
                    function(index, length) { //上传进度事件
                        //console.log(index + "/" + length);
                        //var ratio = (index / length) * 100.00 | 0.00;
                        //var progress = $(".progress > div");
                        //progress.css("width", ratio + "%");
                        //progress.attr("aria-valuenow", index);
                        //progress.attr("aria-valuemax", length);
                        //progress.children("span").text("" + ratio + "%");
                    },
                    function(index, length) { //超时处理事件
                        console.log(index + "/" + length);
                    }
                );
            } catch (e) {
                console.log(e.name + " " + e.message);
            }
            videoURL = null;
            windowURL = window.URL || window.webkitURL;
            videoURL = windowURL.createObjectURL(file);
            $('#videoplayer').html('<video src="' + videoURL + '" controls="controls"></video>');
            setTimeout(function() { createIMG(); }, 800);
        }
    });

    //验证上传文件大小和类型
    /**
     * 
     * @param {this} value_ [获取input对象,一般为this]
     * @param {[number]} size_ [文件限制的大小,单位为kb]
     * @param {[string]} type_ [文件类别]
     * @param {[function]} callback [验证通过的回调]
     */
    function fileValid(value_, size_, type_, callback) {
        var file = value_.files[0];
        var fileSize = (file.size / 1024).toFixed(0); //文件大小
        var fileType = value_.value.substring(value_.value.lastIndexOf(".")); //文件类型

        if (fileSize > size_) {
            alert('视频过大,请选择小于200MB的视频!');
            return false;
        }
        switch (type_) {
        case 'video':
            if (!fileType.match(/.mp4|.mov/i)) {
                alert('请上传正确格式的视频!');
                return false;
            }
            break;
        default:
            alert('参数设置不正确!');
            return false;
            break;
        }
        return true;
    }

    var createIMG = function() {
        var scale = 0.25,
            video = $('#videoplayer').find('video')[0],
            canvas = document.createElement("canvas"),
            canvasFill = canvas.getContext('2d');
        canvas.width = video.videoWidth * scale;
        canvas.height = video.videoHeight * scale;
        canvasFill.drawImage(video, 0, 0, canvas.width, canvas.height);
        var src = canvas.toDataURL("image/jpeg");
        $('#videooutput').html('<img id="imgSmallView" src="' + src + '" alt="预览图" />');
    }
</script>

<script>
    (function() {
        //$("#uploadvideofile").change(function () {
        //    var temp = ajax.upload_big(
        //        "AjaxHandlers/UploadVideoHandler.ashx", //文件上传地址
        //        "#uploadvideofile", //input = file 选择器
        //        1024 * 1024, //切割文件大小
        //        "*", //文件限制类型 mime类型
        //        function(index) { //上传成功事件
        //            //console.log("slice [ " + index + "] uploaded")
        //        },
        //        function(index, length) { //上传进度事件
        //            //console.log(index + "/" + length);
        //            //var ratio = (index / length) * 100.00 | 0.00;
        //            //var progress = $(".progress > div");
        //            //progress.css("width", ratio + "%");
        //            //progress.attr("aria-valuenow", index);
        //            //progress.attr("aria-valuemax", length);
        //            //progress.children("span").text("" + ratio + "%");
        //        },
        //        function(index, length) { //超时处理事件
        //            console.log(index + "/" + length);
        //        }
        //    );
        //    console.log(temp);
        //});
    })();
</script>
</body>
</html>

UploadVideoHandler.ashx

<%@ WebHandler Language="C#" Class="UploadVideoHandler" %>

using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using VideoEncoder;

public class UploadVideoHandler : IHttpHandler
{
    private string opration
    {
        get { return HttpContext.Current.Request["opration"] ?? ""; }
    }

    public void ProcessRequest(HttpContext context)
    {
        switch (opration)
        {
            case "uploadv":
                int slicenum = UploadVedio();
                context.Response.Write(slicenum);
                break;
            //case "":
            //    break;
            default:
                context.Response.Write("无效参数");
                break;
        }
    }

    private string finalpath = "";

    public int UploadVedio()
    {
        //前端传输是否为切割文件最后一个小文件
        var isLast = HttpContext.Current.Request["isLast"];
        //前端传输当前为第几次切割小文件
        var count = HttpContext.Current.Request["count"];
        //获取前端处理过的传输文件名
        string fileName = HttpContext.Current.Request["name"];
        //存储接受到的切割文件
        if (HttpContext.Current.Request.Files.Count <= 0) return -1;
        HttpPostedFile file = HttpContext.Current.Request.Files[0];

        //处理文件名称(去除.part*,还原真实文件名称)
        string newFileName = fileName.Substring(0, fileName.LastIndexOf('.'));
        //判断指定目录是否存在临时存储文件夹,没有就创建
        if (!System.IO.Directory.Exists(@"E:\uploaded\slice\" + newFileName))
        {
            //不存在就创建目录 
            System.IO.Directory.CreateDirectory(@"E:\uploaded\slice\" + newFileName);
        }

        //存储文件
        file.SaveAs("E:\\uploaded\\slice\\" + newFileName + "\\" + HttpContext.Current.Request["name"]);
        //判断是否为最后一次切割文件传输
        if (isLast == "true")
        {
            //判断组合的文件是否存在
            finalpath = @"E:\\uploaded\\" + newFileName;
            if (File.Exists(finalpath)) //如果文件存在
            {
                File.Delete(finalpath); //先删除,否则新文件就不能创建
            }

            //创建空的文件流
            FileStream FileOut = new FileStream(finalpath, FileMode.CreateNew, FileAccess.ReadWrite);
            BinaryWriter bw = new BinaryWriter(FileOut);
            //获取临时存储目录下的所有切割文件
            string[] allFile = Directory.GetFiles("E:\\uploaded\\slice\\" + newFileName);
            //将文件进行排序拼接
            allFile = allFile.OrderBy(s => int.Parse(Regex.Match(s, @"\d+$").Value)).ToArray();
            for (int i = 0; i < allFile.Length; i++)
            {
                FileStream FileIn = new FileStream(allFile[i], FileMode.Open);
                BinaryReader br = new BinaryReader(FileIn);
                byte[] data = new byte[1048576]; //流读取,缓存空间
                int readLen = 0; //每次实际读取的字节大小
                readLen = br.Read(data, 0, data.Length);
                bw.Write(data, 0, readLen);
                //关闭输入流
                FileIn.Close();
            }

            //关闭二进制写入
            bw.Close();
            FileOut.Close();
            ClipVideo();
        }

        return int.Parse(count) + 1;
    }

    public void ClipVideo()
    {
        /**
         * 支持视频格式:mpeg,mpg,avi,dat,mkv,rmvb,rm,mov.
         *不支持:wmv
         * **/
        VideoEncoder.Encoder enc = new VideoEncoder.Encoder();
        //ffmpeg.exe的路径,控制台程序会在执行目录(....FFmpeg测试\bin\Debug)下找此文件,
        enc.FFmpegPath = "ffmpeg.exe";
        //视频路径
        string finalname = Path.GetFileNameWithoutExtension(finalpath);
        string videoFilePath = finalpath; //"d:\\01.avi";
        finalpath = finalpath.Replace(finalname, finalname + "15S");

        VideoFile videoFile = new VideoFile(videoFilePath);

        enc.GetVideoInfo(videoFile);

        TimeSpan totaotp = videoFile.Duration;
        string totalTime = string.Format("{0:00}:{1:00}:{2:00}", (int) totaotp.TotalHours, totaotp.Minutes,
            totaotp.Seconds);

        #region 自定义逻辑

        //string sourceFileName = Path.GetFileName(upFile.get_FileName()); //取出上传的视频的文件名,进而取出该文件的扩展名
        //string sourceFileName = "02.avi";
        //string flv_file = System.IO.Path.ChangeExtension("d:\\01.avi", ".flv");
        //string Command = " -i \"" + FromName + "\" -y -ab 32 -ar 22050 -b 800000 -s  480*360 \"" + ExportName + "\""; //Flv格式  

        //转换视频为flv
        //ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv

        //视频截图,fileName视频地址,imgFile图片地址
        //ffmpeg -i input.flv -y -f image2 -ss 10.11 -t 0.001 -s 240x180 catchimg.jpg;
        //ImgstartInfo.Arguments = "   -i   " + fileName + "  -y  -f  image2   -ss 2 -vframes 1  -s   " + FlvImgSize + "   " + flv_img;

        //string Command = " -i \"test.wmv\" -y -ab 32 -ar 22050 -b 800000 -s 320*240 \"2.flv\"";
        //string Command = "E:\\FFmpeg\\ffmpeg.exe -i E:\\ClibDemo\\VideoPath\\admin\\a.wmv -y -ab 56 -ar 22050 -b 500 -r 15 -s 320*240 " ExportName;

        //3.重新编码进行剪切
        //ffmpeg -ss [start] -t [duration] -i [in].mp4  -c:v libx264 -c:a aac -strict experimental -b:a 98k [out].mp4
        //相对来说比较精确,可是还是不是特别精确

        //string Command =" -ss 00:00:00 -t 00:00:15 -i  d:\\01.avi   d:\\output.avi"; // ffmpeg -ss 00:00:10 -t 00:01:22 -i 五月天-突然好想你.mp3  out.mp3  
        string Command = " -ss 00:00:00 -t 00:00:15 -i  " + videoFilePath + "   E:\\output.avi";
        string Command1 =
            " -i d:\\01.avi -vf \"drawtext=fontfile=simhei.ttf: text='南通极客如皋张HC':x=w-tw-10:y=10:fontsize=28:fontcolor=red:shadowy=2\" d:\\output1.avi";
        string Command2 =
            " -i d:\\01.avi -vf \"drawtext=fontfile=simhei.ttf: text='南通极客QQ(827XXXXXX)':y=h-line_h-10:x=(w-mod(30*n\\,w+tw)):fontsize=34:fontcolor=yellow:shadowy=2\" d:\\output2.avi";

        System.Diagnostics.Process p = new System.Diagnostics.Process();
        //非控制台程序必须写完整路径
        p.StartInfo.FileName = HttpContext.Current.Server.MapPath("~/bin/" + enc.FFmpegPath + "");
        p.StartInfo.Arguments = Command;
        //p.StartInfo.Arguments = Command1;
        //Asp.net 获取当前目录
        p.StartInfo.WorkingDirectory =
            HttpContext.Current.Server
                .MapPath("~/bin"); //HttpContext.Current.Request.MapPath("~/"); //Environment.CurrentDirectory;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.CreateNoWindow = false;
        //开始执行
        p.Start();
        p.BeginErrorReadLine();
        p.WaitForExit();
        p.Close();
        p.Dispose();

        #endregion

        Console.WriteLine("时间长度:{0}", totalTime);
        Console.WriteLine("高度:{0}", videoFile.Height);
        Console.WriteLine("宽度:{0}", videoFile.Width);
        Console.WriteLine("数据速率:{0}", videoFile.VideoBitRate);
        Console.WriteLine("数据格式:{0}", videoFile.VideoFormat);
        Console.WriteLine("比特率:{0}", videoFile.BitRate);
        Console.WriteLine("文件路径:{0}", videoFile.Path);
        Console.ReadKey();
    }


    public bool IsReusable
    {
        get { return false; }
    }
}

如图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载

下载地址

EDU系统漏洞挖掘实战:逻辑越权与文件上传绕过技巧 在Web应用安全领域,权限控制与文件上传是两大基础且核心的安全机制。权限控制的核心原理在于服务端对每一次用户请求进行严格的身份与权限校验,以防止水平越权(访问同角色他人数据)或垂直越权(执行高权限操作)。其技术价值在于构建安全的访问边界,保障用户数据隔离与系统功能完整性,广泛应用于各类多角色业务系统,如电商、社交及企业OA。文件上传功能则涉及从客户端到服务端完整的处理链条,包括前端校验、传输、服务端安全检查及最终存储访问,任何环节的疏漏都可能导致安全风险。在诸如教育行业(EDU)的在线平台中,这些功能尤为普 阅读详情

相关推荐

大视频分片上传与截取功能实现详解

在C#中,FileStream是用于处理文件输入输出(I/O)操作的核心类之一,属于System.IO命名空间。它提供了对文件进行读写的基本能力,尤其适用于处理大体积文件。FileStream实际上是对文件系统中物理文件的抽象,通过流的方式将文件内容映射为字节序列,从而支持逐段读取和写入。其读写机制基于以下核心流程:打开文件:使用或方法获取文件的句柄。缓冲读取/写入:使用Read()或Write()方法从文件流中读取字节块或写入字节块。关闭文件。

weixin_42609225的博客 857

流媒体之视频切片及播放

https://blog.csdn.net/weixin_30551947/article/details/96540368

sun007700的专栏 670

文件预览技术选型与实现:从PDF到Office全场景避坑指南

在后台管理系统、网盘应用与低代码平台中,文件预览功能看似基础,却常因格式兼容、渲染保真度不足而成为开发痛点。理解不同格式的底层原理是关键:PDF基于页面流,Word采用排版文字流,Excel是结构化表格数据,PPT则遵循幻灯片模型,而浏览器原生仅支持图片、部分视频与纯文本。技术选型上,纯前端方案(如pdf.js、docx-preview、SheetJS)部署轻量,适合中小型系统;服务端转换(如LibreOffice转PDF)则能覆盖老版Office与复杂排版,满足高保真场景。实际落地时需按文件类型分组设计统

weixin_34292402的博客 417

Asp.Net WebAPI + ffmpeg 对视频进行切片和加密

ffmpeg 对视频进行切片加密

qq_43616980的博客 698

.net 做的文件,视频的上传和管理

.net 做的文件,视频的上传和管理,完整代码,VS打开就能用

使用.net技术上传视频

使用Asp.net实现视频的上传,同时通过截屏工具,截取上传视频的图片

SpringMVC大文件(百M以上)的上传下载实现技术

文件夹数据库处理逻辑 publicclassDbFolder { JSONObject root; publicDbFolder() { this.root =newJSONObject(); this.root.put("f_id",""); this.root.put("f_nameLoc","根目录"); this.root.put("f_pid",""); ...

weixin_45525177的博客 454

FRM模型五:Brinson业绩归因

利用Brinson对基金组合业绩进行归因分析。

stonesssssss的博客 3001

asp.net大文件(视频)上传方法

ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。 ASP.NET页面设计:TextBox和Button按钮。 TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实现选择文件夹的问题还没有解决,暂时只能手动输入。 两种方法:生成rar和zip。 1.生成rar using Microsoft.Win32; using System

yjjatqihc的博客 363

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

弘玑RPA进阶攻略

01.弘玑RPA产品概要。02.设计器的安装与卸载。03.设计器特性与使用。

长安诗社社长@-梁瀚文- https://github.com/HevnChin https://gitee.com/HevnChin 3639

C# WEB怎么实现大文件上传

昨天晚上一个网友给我发私信问了这个问题,这个网友是个大三的学生,也是计算机专业,是准备做毕业设计,然后刚好选的这个题目,希望能够一起探讨一下技术问题,平时对技术这块也是自己专研比较多,上学期间自学了asp.net,也自己做过一些项目,他们系的网站就是他负责开发的,可以说也是非常有能力的一个网友。ASP.NET WEB API实现简单的文件下载与上传,ASP.NET大文件分片上传,24小时技术支持服务,提供文档教程,视频教程,远程技术指导,1对1技术支持服务,提供手机,微信,QQ,邮箱,企业微信等联系方式。

alisky119的博客 903

从零到一:ASTER L2数据获取的实战避坑指南

本文提供了一份详细的ASTER L2数据获取实战指南,涵盖账号注册、环境配置、数据检索、下载故障排除及后处理等关键步骤。特别针对NASA EarthData平台的隐形门槛和常见陷阱,给出了实用解决方案,帮助科研新手高效获取地表温度数据,适用于环境监测和城市热岛效应分析等领域。

weixin_29061425的博客 516

Nginx实现浏览器端大文件分片上传

需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制。 PC端全平台支持,要求支持Windows,Mac,Linux 支持所有浏览器。 支持文件批量上传 支持文件夹上传,且要求在服务端保留层级结构。文件夹数量要求支持到10W。 支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传。文件大小要求能够支持到20个G。 支持自动加载本地文件,要求能够自动加载指定的本地文件。

weixin_45525177的博客 1018

c#视觉应用开发中如何使用Emgu CV在C#中进行图像处理?

Emgu CV 是 OpenCV 的 .NET 包装器,可以让开发者在 .NET 语言(如 C#)中使用 OpenCV 的功能进行图像处理。在进行图像处理时,Emgu CV 提供了丰富的 API 可以使用。PictureBoxImageBox下面是一个详细的示例,演示如何使用 Emgu CV 在 C# 中进行基本的图像处理,包括加载图像、转换为灰度图像、进行边缘检测,然后显示结果。byte在这个示例中,我们使用了三个PictureBox控件来显示原始图像、灰度图像和边缘检测后的图像。

zhangzhechun的专栏 666

【C++】DDS:FastDDS环境配置与使用示例

FastDDS环境配置与使用示例

DevFrank的博客 6505

.net core 视频操作类(VideoTranscoding)

using Microsoft.AspNetCore.Mvc;namespace EMD_Net6_School.AJ { public class VideoTranscoding { /// /// 上传分片文件 /// /// /// publ

qq_20382175的博客 793

RK3568平台(内存篇)DDR定频修改

如果需要DDR定频,则还需要注释掉其他多余的DDR频率,保留一个即可,例如注释掉opp-528000000、opp-1068000000、opp-1560000000,保留opp-2750000000则是定频最大频率。如果回退必须将 dmc_opp_table节点 的其他频率打开,否则系统无法选择到其他频率运行。ddr频点不对,先把ddr变频关掉,关闭后系统就不会一直重启了,以下是修改DDR频点的。rk3588修改定频节点在rk3588s.dtsi 的 dmc: dmc。

weixin_49303682的博客 1619

SpringMVC大文件分片上传/多线程上传

需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制。 PC端全平台支持,要求支持Windows,Mac,Linux 支持所有浏览器。 支持文件批量上传 支持文件夹上传,且要求在服务端保留层级结构。文件夹数量要求支持到10W。 支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传。文件大小要求能够支持到20个G。 支持自动加载本地文件,要求能够自动加载指定的本地文件。

weixin_45525177的博客 521

【嵌入式Linux驱动开发】二十四、Linux I2C 驱动上手尝试

  人的前程关于眼界、关乎格局。   志之所趋,无远弗届,穷山复海不能限也;   志之所向,无坚不入,锐兵精甲不能御也。 一、I2C驱动框架简介   Linux内核将 I2C 驱动分为两部分: ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。 1....

悟已往之不谏 知来者之可追 1068

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

HTTP大文件(百M以上)的上传下载实现技术

需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制。PC端全平台支持,要求支持Windows,Mac,Linux支持所有浏览器。支持文件批量上传支持文件夹上传,且要求在服务端保留层级结构。文件夹数量要求支持到10W。支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传。文件大小要求能够支持到20个G。支持自动加载本地文件,要求能够自动加载指定的本地文件。

weixin_45525177的博客 1408

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Go语言文件管理接口实战:上传下载删除的完整实现与避坑指南

文件管理是业务系统中最常见的基础能力之一,无论是用户头像、报表导出还是附件管理,都离不开文件的上传、查询、下载和删除。在工程实践中,如何通过HTTP接口安全高效地封装这些操作,是后端开发者经常面对的挑战。本文从文件存储技术原理出发,讨论使用Go标准库net/http实现轻量级文件管理服务的核心思路,重点解决文件名冲突、目录穿越、上传大小限制和并发删除等关键问题。该方法适用于内部运营系统、个人项目及微服务初始版本,也可为后续扩展对象存储预留设计空间。通过实际代码示例与踩坑实录,帮助读者快速掌握可复用的文件接口

weixin_34174105的博客 246

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

558款开源Android应用合集:从记录到影音一次挑到位

在应用商店翻遍同名工具,广告一堆还下载缓慢,隐私数据更没保障。open-source-android-apps 把 558 款开源Android应用按 17 个分类整理成表,帮你直接挑到能装、能用的好 app。 ### 读完你能拿到什么 - 掌握 17 个分类的浏览路径 - 了解 558 款应用的筛选方式 - 上手本地 clone 与浏览步骤 - 判断哪款 app 最适合自己的场景 ## 为

gitblog_00843的博客 253

Sunshine 串流主机 5 步上手:装完到电视上第一帧

周五晚上,游戏 PC 在书房跑,你窝在沙发上的平板里接着打,声音从电视外放——这是 Sunshine 干的事:一个自托管游戏串流主机,把 Windows 或 Linux 主机上的游戏画面和声音送进局域网里任意装了 Moonlight 的设备。Windows 和 Linux 完整支持,NVIDIA、AMD、Intel 显卡都有硬件编码通路,没有独显也能用 CPU 软编码兜底,全部配置在浏览器 Web

gitblog_00965的博客 211

用iPhone管理Proxmox:WebSSH家庭实验室虚拟化运维完全教程

本文介绍如何用iPhone管理Proxmox:借助WebSSH这款iOS/iPadOS/macOS SSH客户端,通过SSH直接连接Proxmox VE服务器,在家也能启停虚拟机、进入LXC容器、检查集群状态,甚至不暴露任何端口就能安全打开8006 Web管理界面。全程不需要在服务器上安装任何东西——因为Proxmox默认就开启了SSH。 [![WebSSH在iPad上连接Proxmox节点的终

gitblog_00021的博客 324

AI-Scientist:让大模型独立完成从想法到论文的全流程怎么做

AI-Scientist 是一个开源的自动化科研系统:给它一个实验模板和模型 API Key,它会自动生成研究想法、改代码跑实验、画结果图、撰写 LaTeX 论文草稿,并自动完成一轮评审。整个"自动实验 + 论文生成 + 自动审稿"的链条由 `launch_scientist.py` 一条命令串起来,人只负责准备模板和基线。 ## 📌 适合哪些研究场景:它解决什么问题 ### 现有代码助手停

gitblog_00966的博客 716
上一篇: jQuery Validate教程
下一篇: asp.net 获取网站根目录总结
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值