C#开发合集
用C#轻松搞定m3u8视频下载与合并
嘿,程序员们!今天咱们来聊聊如何用C#写个小程序,轻松下载和合并m3u8视频文件。没错,就是那种分段的流媒体视频。准备好了吗?让我们开始吧!
准备工作
在动手之前,先确保你有以下工具:
- Visual Studio(或者你喜欢的任何C# IDE)
- FFmpeg(这个工具可别少了,确保它在你指定的路径下)
代码实现
下面的代码将帮助你完成这个任务。它的逻辑很简单:从数据库读取视频信息,下载视频分段,然后用FFmpeg合并成一个完整的mp4文件。
// 将以下代码粘贴到你的C#项目中
using System.Diagnostics;
namespace ConsoleApp1
{public class Demo{string RootPath = $"D:/Test/Demo";public async Task Main(){await InitFun();async Task InitFun(){// 从数据库读取数据List<dynamic> items = new List<dynamic>{new{FlagName = "A",Name="计时器 m3u8 ",Url="http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8"}};using (HttpClient client = new HttpClient()){foreach (var item in items){try{string flagName = item.FlagName; // 顶层目录string name = item.Name; // 子目录string m3u8Url = item.Url;// 创建文件夹结构var date = DateTime.Now;string rootPath = $"{RootPath}/{date.Year}/{date.Month}/{flagName}/";// 创建顶层目录if (!Directory.Exists(rootPath)){Directory.CreateDirectory(rootPath);}// 创建子目录string subFolderPath = Path.Combine(rootPath, name);string outputDirectory = Path.Combine(subFolderPath, "ts"); // "ts" 文件夹string outputFilePath = Path.Combine(subFolderPath, $"{name}.mp4");if (!Directory.Exists(outputDirectory)){Directory.CreateDirectory(outputDirectory);}// 检查 URL 是否为 MP4 文件if (m3u8Url.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase)){// 直接下载 MP4 文件Console.WriteLine($"Downloading MP4 directly from {m3u8Url}...");byte[] mp4Data = await client.GetByteArrayAsync(m3u8Url);await File.WriteAllBytesAsync(outputFilePath, mp4Data);Console.WriteLine($"Downloaded MP4 file to {outputFilePath}.");}else{string m3u8Content = await client.GetStringAsync(m3u8Url);string[] lines = m3u8Content.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);var downloadTasks = new List<Task>();// 下载每个分段视频foreach (var line in lines){if (line.EndsWith(".ts")){string segmentUrl = line.StartsWith("http") ? line : new Uri(new Uri(m3u8Url), line).ToString();string segmentFilePath = Path.Combine(outputDirectory, Path.GetFileName(segmentUrl));// 启动下载任务downloadTasks.Add(Task.Run(async () =>{try{Console.WriteLine($"Downloading {segmentUrl}...");byte[] segmentData = await client.GetByteArrayAsync(segmentUrl);await File.WriteAllBytesAsync(segmentFilePath, segmentData);}catch{}}));}}// 等待所有下载任务完成await Task.WhenAll(downloadTasks);//合并await MergeVideosWithFFmpeg(outputDirectory, outputFilePath);}}catch{Console.WriteLine($"Downloading Fail");}finally{}}}}return;}private async Task MergeVideosWithFFmpeg(string outputDirectory, string outputFilePath){try{string ffmpegPath = @"D:\Bin\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe"; // 确保FFmpeg在此路径下string concatFilePath = Path.Combine(outputDirectory, "concat.txt");// 创建合并文件using (StreamWriter writer = new StreamWriter(concatFilePath)){foreach (var tsFile in Directory.GetFiles(outputDirectory, "*.ts")){writer.WriteLine($"file '{tsFile}'");}}// 执行FFmpeg合并命令var ffmpegArgs = $"-f concat -safe 0 -i \"{concatFilePath}\" -c copy \"{outputFilePath}\"";var processStartInfo = new System.Diagnostics.ProcessStartInfo{FileName = ffmpegPath,Arguments = ffmpegArgs,RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false,CreateNoWindow = true};using (var process = new Process { StartInfo = processStartInfo }){try{process.Start();// 异步读取输出和错误信息var outputTask = process.StandardOutput.ReadToEndAsync();var errorTask = process.StandardError.ReadToEndAsync();// 等待进程退出,并设置超时if (process.WaitForExit(60000 * 2)) // 设置超时为 60*2 秒{// 输出读取结果string output = await outputTask;string error = await errorTask;if (process.ExitCode == 0){Console.WriteLine($"Merge completed for {outputFilePath}.");}else{Console.WriteLine($"FFmpeg exited with code {process.ExitCode}. Error: {error}");}}else{Console.WriteLine("FFmpeg process timed out.");}process.Kill(); // 杀死进程}finally{// 删除文件夹if (Directory.Exists(outputDirectory)){Directory.Delete(outputDirectory, true);Console.WriteLine($"Deleted directory {outputDirectory}.");}}}}catch{}}}}// 代码内容请参见上方给出的代码
步骤解析
- 创建C#控制台项目:打开Visual Studio,创建一个新的控制台应用程序。
- 粘贴代码:把上面的代码粘贴到
Program.cs
文件里。 - 配置路径:根据你的实际情况修改
RootPath
和ffmpegPath
变量的值。 - 编译运行:编译并运行程序,看看效果!
注意事项
- 确保引用了必要的命名空间,比如
System.Net.Http
、System.IO
和System.Diagnostics
。 - FFmpeg的路径一定要正确,确保工具安装无误。
– FFmpeg教程(超级详细版)
运行结果
总结
通过这个小程序,你不仅能下载m3u8视频,还能把它们合并成一个完整的mp4文件。是不是很简单?
用C#获取“掌上高考”学校信息
嘿,大家好!今天我们来聊聊如何用C#编写一个程序,从“掌上高考”平台获取学校信息。这个程序不仅能获取学校的基本信息,还能提取特色专业、校园设施、就业政策等信息。准备好了吗?让我们开始吧!
准备工作
在开始之前,请确保你已经安装了以下工具:
- Visual Studio(或者你喜欢的任何C# IDE)
- Newtonsoft.Json库(用于处理JSON数据)
你可以在NuGet包管理器中安装Newtonsoft.Json:
Install-Package Newtonsoft.Json
代码实现
下面是程序的主要代码。它会从指定的API获取学校信息,并将其输出到控制台。
// 将以下代码粘贴到你的C#项目中using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Text.RegularExpressions;namespace ConsoleApp1
{public class Main4{private readonly static string Root = "https://static-data.gaokao.cn";public async Task Main(){string[] strings = { "31" }; // 这里可以替换成需要查询的学校编码foreach (string item in strings){await GetSchoolInfo(item);}}static async Task GetSchoolInfo(string schoolCode){try{using (HttpClient client = new HttpClient()){string url = $"{Root}/www/2.0/school/{schoolCode}/info.json";HttpResponseMessage response = await client.GetAsync(url);if (response.IsSuccessStatusCode){string json = await response.Content.ReadAsStringAsync();JObject data = JObject.Parse(Regex.Unescape(json));if (data != null){var schoolInfo = JsonConvert.DeserializeObject<dynamic>(data["data"].ToString());Console.WriteLine("高校名称: " + schoolInfo?.name);Console.WriteLine("高校地址: " + schoolInfo?.address);Console.WriteLine("校园面积: " + schoolInfo?.area + "亩");Console.WriteLine("招办电话: " + schoolInfo?.phone);Console.WriteLine("招生官网: " + schoolInfo?.site);Console.WriteLine("校园官网: " + schoolInfo?.school_site);var tag = $"{schoolInfo?.level_name},{schoolInfo?.school_nature_name},{schoolInfo?.dual_class_name},{(schoolInfo?.f985 == "1" ? "985工程" : "")},{(schoolInfo?.f211 == "1" ? "211工程" : "")}";Console.WriteLine("学校等级特色标签: " + tag);var specialName = await GetNationFeature(schoolCode);Console.WriteLine("优势专业(特色专业): " + specialName);var dormitoryInfo = await GetDormitory(schoolCode);Console.WriteLine("住宿: " + dormitoryInfo.dormitory);Console.WriteLine("食堂: " + dormitoryInfo.canteen);Console.WriteLine("校园风光: " + dormitoryInfo.schoolImg);var reportInfo = await GetReportName(schoolCode);Console.WriteLine("就业报告: " + string.Join(',', reportInfo));var gradeLine = await GetGradeLine(schoolCode);Console.WriteLine("上一年 内蒙古本科一批分数: " + string.Join(',', gradeLine));Console.WriteLine("========================\n");}}else{Console.WriteLine("获取数据失败,状态码: " + response.StatusCode);}}}catch (Exception ex){Console.WriteLine("发生异常: " + ex.Message);}}// 其他方法(GetNationFeature, GetDormitory, GetReportName, GetGradeLine)请按需粘贴}
}
其他方法
在上面的代码中,我们定义了一些辅助方法来获取特色专业、校园设施、就业政策和分数线。这些方法的实现逻辑与 GetSchoolInfo
类似,都是通过HTTP请求获取JSON数据并进行解析。
注意事项
- 请确保你在项目中引用了
System.Net.Http
和Newtonsoft.Json
命名空间。 - 根据需要替换学校编码(如
"31"
)以获取不同学校的信息。
总结
通过这个小程序,你可以轻松获取高校的详细信息,包括地址、面积、特色专业等。这对于想要了解学校的同学们来说,简直是一大利器!
明白了,感谢你的澄清!在这个上下文中,channel
是指通道代码,通常用于标识特定的商品或服务。接下来我会更新教程中的相关内容,以确保读者能够理解这一点。
使用C#抓取布宫票务小程序售票信息
大家好!今天我们将深入探讨如何使用C#编写一个程序,从布宫票务系统抓取可预订的票务信息。这个程序能够获取指定商品的售票信息,并检查明天是否可以预订票。准备好了吗?让我们开始吧!
准备工作
在开始之前,请确保你已经安装了以下工具:
- Visual Studio(或你喜欢的任何C# IDE)
- Newtonsoft.Json库(用于处理JSON数据)
你可以在NuGet包管理器中安装Newtonsoft.Json:
Install-Package Newtonsoft.Json
代码实现
下面是程序的主要代码。它会向指定API发送请求,获取票务信息,并将结果输出到控制台。
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;namespace ConsoleApp1
{public class Main3{static string token = "********"; // 请使用Fiddler抓取你的tokenstatic string channel = "2"; // 通道代码,替换为你需要查询的通道代码public async Task Main(){await GetSalesList(channel, token);}static async Task GetSalesList(string commodity_id, string token){using (HttpClient client = new HttpClient()){client.DefaultRequestHeaders.Add("token", token);var _postData = new{commodity_id};var postData = JsonConvert.SerializeObject(_postData);var _data = new StringContent(postData, Encoding.UTF8, "application/json");HttpResponseMessage response = await client.PostAsync($"https://yjtxcx.potalapalace.cn/addons/shopro/sales/make_date", _data);response.EnsureSuccessStatusCode();if (response.IsSuccessStatusCode){string responseContent = await response.Content.ReadAsStringAsync();Console.WriteLine(Regex.Unescape(responseContent));// 解析 JSON 数据var jsonDataObject = JsonConvert.DeserializeObject<RootObject>(responseContent);CheckForAvailableTickets(jsonDataObject);}}}static void CheckForAvailableTickets(RootObject jsonDataObject){// 获取当前日期和明天的日期DateTime currentDate = DateTime.Now.Date;DateTime tomorrowDate = currentDate.AddDays(1);// 查找明天是否可预订foreach (var item in jsonDataObject.data){DateTime date = DateTime.Parse(item.date);// 检查明天是否可以订票if (date == tomorrowDate && item.type == 1){Console.WriteLine($"明天可预订的日期是:{date}");// 在这里添加消息推送逻辑,例如发送通知break;}if (date >= currentDate && item.type == 1){string status = item.info == "售罄" ? "售罄" : "可预订";Console.WriteLine($"日期:{date:yyyy-MM-dd},状态:{status}");// 在这里添加消息推送逻辑,例如发送通知}}}public class Datum{public string date { get; set; }public int type { get; set; }public string info { get; set; }}public class RootObject{public int code { get; set; }public string msg { get; set; }public string time { get; set; }public List<Datum> data { get; set; }}}
}
代码解析
-
Token 和 Channel:在代码中,
token
是需要根据实际情况进行设置的,使用Fiddler抓取你的token。channel
是通道代码,代表你要查询的特定商品或服务。 -
HttpClient:我们使用
HttpClient
类来发送POST请求,并将结果解析为JSON格式。 -
数据解析:通过
JsonConvert.DeserializeObject
方法将返回的JSON数据转换为C#对象,并检查可预订的票务信息。 -
日期检查:程序会检查明天的票是否可预订,并输出相关信息。
注意事项
- 请确保你在项目中引用了
System.Net.Http
和Newtonsoft.Json
命名空间。 - 使用Fiddler抓取token时,请确保你已正确配置代理,并能够捕获HTTP请求。
-Fiddler 抓取 https 设置详解
总结
通过这个小程序,你可以轻松获取布宫的票务信息,并检查明天是否可预订。这对于想要参观布宫的朋友们来说,绝对是个好帮手!
如果你在实现过程中遇到问题,或者对token的抓取有疑问,随时欢迎在下方留言讨论。希望这篇教程对你有所帮助!
相关文章:

C#开发合集
用C#轻松搞定m3u8视频下载与合并 嘿,程序员们!今天咱们来聊聊如何用C#写个小程序,轻松下载和合并m3u8视频文件。没错,就是那种分段的流媒体视频。准备好了吗?让我们开始吧! 准备工作 在动手之前…...

鸿蒙面试 --- 性能优化
性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,…...
React的基础知识:Context
1. Context 在 React 中,Context 提供了一种通过组件树传递数据的方式,无需手动在每个层级传递 props。这在处理一些全局应用状态时非常有用,比如用户认证、主题、语言偏好等。 如何使用 Context 创建 Context:首先,…...

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)
通过bdf号查看 -s (bus) lspci -s 03:00.0通过vendor id或者device id等设备查看 -d (device) lspci -d 15b3: #这里是vendor号,所以在前面 lspci -d :1021 #这里是设备号,所以要:在前vendorid和deviceid…...
【Kubernetes 集群核心概念:Pod】pod生命周期介绍【五】
5.1 Pod生命周期 Pod的生命周期指的是从Pod创建到终止的整个过程。它分为以下两种常见情况: 长期运行Pod: 例如运行HTTP服务的Pod,它在正常情况下会一直运行,但可以手动删除或终止。短期运行Pod: 例如执行计算任务的…...
c++的虚继承说明、案例、代码
虚继承的基本概念 在 C 中,虚继承主要用于解决多继承时可能出现的菱形继承问题。菱形继承是指一个类有两个(或更多)子类,而这两个子类又同时继承自一个共同的基类,当这些子类又被另一个类继承时,就形成了菱…...

小米PC电脑手机互联互通,小米妙享,小米电脑管家,老款小米笔记本怎么使用,其他品牌笔记本怎么使用,一分钟教会你
说在前面 之前我们体验过妙享中心,里面就有互联互通的全部能力,现在有了小米电脑管家,老款的笔记本竟然用不了,也可以理解,毕竟老款笔记本做系统研发的时候没有预留适配的文件补丁,至于其他品牌的winPC小米…...
介绍SSD硬盘
SSD硬盘(固态硬盘,Solid State Drive)是一种利用闪存技术存储数据的存储设备,与传统的机械硬盘(HDD)不同,SSD没有任何活动部件,因此其性能和耐用性较为优越。以下是SSD硬盘的一些主要…...
CMAKE常用命令详解
NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...

Vue3的通灵之术Teleport
前言 近期Vue3更新了一些新的内容,我都还没有一个一个仔细去看,但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是:<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传…...

ue5第三人称闯关游戏学习(一)
视频资料38 - Compilers and Editors_哔哩哔哩_bilibili 上一个第一人称射击项目做完 接下来要更深入学习。 引入资产与C来创建第三人称闯关游戏 这次要引入的资产有两个分别是 Unreal Learning Kit:Game和stylized character kit: casual 01 不过有个比较麻…...

IIC 随机写+多次写 可以控制写几次
verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…...

controller中的参数注解@Param @RequestParam和@RequestBody的不同
现在controller中有个方法:(LoginUserRequest是一个用户类对象) PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…...
手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程
“Men pass away, but their deeds abide.” 人终有一死,但是他们的业绩将永存。 ——奥古斯坦-路易柯西 目录 前言 简单函数求极值 复杂函数梯度法求极值 泰勒展开 梯度,Nabla算子 Cauchy-Schwarz不等式 梯度下降算法 算法流程 梯度下降法…...

多目标优化算法——多目标粒子群优化算法(MOPSO)
Handling Multiple Objectives With Particle Swarm Optimization(多目标粒子群优化算法) 一、摘要: 本文提出了一种将帕累托优势引入粒子群优化算法的方法,使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...

Swift——自动引用计数ARC
ARC ARC是swift使用的一种管理应用程序内存的机制,对于C语言我们知道,当我们申请一块空间,通常需要手动释放,不然会造成空间浪费,而有了ARC机制,你无需考虑内存的管理,因为ARC会在类的实例不再…...
【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)
Quarkus 基于CDI和拦截器实现AOP功能(进阶版) 拦截器的属性成员拦截器的重复使用基于属性成员和重复使用的拦截器的发消息案例 本节来了解一下拦截器高级特性(拦截器的重复使用和属性成员),官网说明:https:…...
【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
前言 在日常开发和运维中,为了提高服务器登录的安全性,我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而,在配置 SSH 公钥登录的过程中,可能会遇到各种坑和 Bug。本文将从零开始,手把手教你如何在 Ubuntu…...

insmod一个ko提供基础函数供后insmod的ko使用的方法
一、背景 在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些…...

七、传统循环神经网络(RNN)
传统循环神经网络 RNN 前言一、RNN 是什么?1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...