C#开发合集

用C#轻松搞定m3u8视频下载与合并

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

准备工作

在动手之前,先确保你有以下工具:

  1. Visual Studio(或者你喜欢的任何C# IDE)
  2. 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{}}}}// 代码内容请参见上方给出的代码

步骤解析

  1. 创建C#控制台项目:打开Visual Studio,创建一个新的控制台应用程序。
  2. 粘贴代码:把上面的代码粘贴到 Program.cs 文件里。
  3. 配置路径:根据你的实际情况修改 RootPathffmpegPath 变量的值。
  4. 编译运行:编译并运行程序,看看效果!

注意事项

  • 确保引用了必要的命名空间,比如 System.Net.HttpSystem.IOSystem.Diagnostics
  • FFmpeg的路径一定要正确,确保工具安装无误。
    – FFmpeg教程(超级详细版)

运行结果

在这里插入图片描述

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

总结

通过这个小程序,你不仅能下载m3u8视频,还能把它们合并成一个完整的mp4文件。是不是很简单?

用C#获取“掌上高考”学校信息

嘿,大家好!今天我们来聊聊如何用C#编写一个程序,从“掌上高考”平台获取学校信息。这个程序不仅能获取学校的基本信息,还能提取特色专业、校园设施、就业政策等信息。准备好了吗?让我们开始吧!

准备工作

在开始之前,请确保你已经安装了以下工具:

  1. Visual Studio(或者你喜欢的任何C# IDE)
  2. 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.HttpNewtonsoft.Json 命名空间。
  • 根据需要替换学校编码(如 "31")以获取不同学校的信息。

总结

通过这个小程序,你可以轻松获取高校的详细信息,包括地址、面积、特色专业等。这对于想要了解学校的同学们来说,简直是一大利器!

明白了,感谢你的澄清!在这个上下文中,channel 是指通道代码,通常用于标识特定的商品或服务。接下来我会更新教程中的相关内容,以确保读者能够理解这一点。

使用C#抓取布宫票务小程序售票信息

大家好!今天我们将深入探讨如何使用C#编写一个程序,从布宫票务系统抓取可预订的票务信息。这个程序能够获取指定商品的售票信息,并检查明天是否可以预订票。准备好了吗?让我们开始吧!

准备工作

在开始之前,请确保你已经安装了以下工具:

  1. Visual Studio(或你喜欢的任何C# IDE)
  2. 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; }}}
}

代码解析

  1. Token 和 Channel:在代码中,token 是需要根据实际情况进行设置的,使用Fiddler抓取你的token。channel 是通道代码,代表你要查询的特定商品或服务。

  2. HttpClient:我们使用 HttpClient 类来发送POST请求,并将结果解析为JSON格式。

  3. 数据解析:通过 JsonConvert.DeserializeObject 方法将返回的JSON数据转换为C#对象,并检查可预订的票务信息。

  4. 日期检查:程序会检查明天的票是否可预订,并输出相关信息。

注意事项

  • 请确保你在项目中引用了 System.Net.HttpNewtonsoft.Json 命名空间。
  • 使用Fiddler抓取token时,请确保你已正确配置代理,并能够捕获HTTP请求。
    -Fiddler 抓取 https 设置详解

总结

通过这个小程序,你可以轻松获取布宫的票务信息,并检查明天是否可预订。这对于想要参观布宫的朋友们来说,绝对是个好帮手!

如果你在实现过程中遇到问题,或者对token的抓取有疑问,随时欢迎在下方留言讨论。希望这篇教程对你有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)

文章目录 1、属性动画图解2、案例实现-小鱼移动游戏1、代码实现2、代码解释3、资源图片4、实现效果3、显示动画4、案例修改-显示动画5、总结1、属性动画图解 这里我们用一张完整的图来汇整属性动画的用法格式和使用的主要属性范围,如下所示: 2、案例实现-小鱼移动游戏 1、代…

【rustdesk】客户端和服务端的安装和部署(自建服务器,docker,远程控制开源软件rustdesk)

【rustdesk】客户端和服务端的安装和部署&#xff08;自建服务器&#xff0c;docker&#xff09; 一、官方部署教程 https://rustdesk.com/docs/zh-cn/client/mac/ 官方服务端下载地址 https://github.com/rustdesk/rustdesk-server/releases 我用的docker感觉非常方便&am…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序后&#xff0c;再使子序列段间有序 若将两个有序表合并成一个有序表&#xff0c;称为二路归并 归并排序步骤示意图&#x…

Springboot项目搭建(6)-前端登录跳转与Pinia实用

1.添加响应错误拦截 文件地址&#xff1a;src\utils\request.js import axios from axios import { ElMessage } from element-plus const baseURL /api const instance axios.create({baseURL}) //添加拦截器 instance.interceptors.response.use(result>{&#x1f447…

多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现…

C++网络编程:select IO多路复用及TCP服务器开发

C网络编程&#xff1a;使用select实现IO多路复用 一、什么是 IO 多路复用&#xff1f;二、IO多路复用器 select三、相关接口3.1、fd_set 结构体3.2、宏和函数 四、select 实现 TCP 服务器五、总结 一、什么是 IO 多路复用&#xff1f; 在网络编程中&#xff0c;最容易想到的并…

HDU Go Running(最小点覆盖 + 网络流优化)

题目大意&#xff1a;有一条无限长跑道&#xff0c;每个人可以规定自己跑步的方向&#xff0c;起点&#xff0c;跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告&#xff0c;每个报告给出了某人在某一时候所在的位置&#xff0c;问跑步的最少可能人数…

28.UE5实现对话系统

目录 1.对话结构的设计&#xff08;重点&#xff09; 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图&#xff0c;也就是下图中的…

Reachy 2,专为AI与机器人实验室打造的卓越开源双臂移动操作平台!

近期&#xff0c;花粉机器人&#xff08;POLLEN ROBOTICS&#xff09;隆重推出Reachy 2仿生机器人——下一代开源操作平台&#xff0c;为AI与机器人实验室带来理想的双臂移动操作科研平台&#xff01; Reachy 2的仿生性&#xff1a; 》拥有两个基于Maxon无刷电机的仿生7自由度…

python的openpyxl库设置表格样式:字体/边框/对齐/颜色等

学习目录 1. 安装和使用openpyxl库设置表格样式 2 设置字体font 3 设置边框 4 设置对齐方式 5 设置单元格数据格式 6 设置行高和列宽 7 填充单元格颜色 附录-关于颜色说明 本章节主要介绍如何使用openpyxl库设置表格中的一些样式&#xff0c;比如字体&#xff0c;边框…

Git旧文件覆盖引发思考

一天&#xff0c;我的同事过来找到我&#xff0c;和我讲&#xff1a;张叫兽&#xff0c;大事不好&#xff0c;我的文件被人覆盖了。git是真的不好用啊 git不好用&#xff1f;文件被覆盖&#xff1b;瞬间我似乎知道了什么&#xff0c;让我想到了某位男明星的语法&#xff1a;他…

QSqlTableModel的使用

实例功能 这边使用一个实例显示数据库 demodb 中 employee 数据表的内容&#xff0c;实现编辑、插入、删除的操作&#xff0c;实现数据的排序和记录过滤&#xff0c;还实现 BLOB 类型字段 Photo 中存储照片的显示、导入等操作&#xff0c;运行界面如下图&#xff1a; 在上图中…

什么是代理,nodenginx前端代理详解

一. 什么是代理&#xff1f; 代理就是通过一个特殊的网络服务去访问另一网络服务的一种间接访问方式。像我们不能直接访问国外的网站&#xff0c;只能使用VPN&#xff0c;就是使用了代理 二. 前端为什么要用代理&#xff1f; 首先明确以下两个概念 &#xff08;1&#xff09…

java脚手架系列16-AI大模型集成

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据&#xff0c;这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难&#xff0c;常常导致疏忽。以前&#xff0c;公司依靠 FUD 方法&#xff08;恐惧、不确定性和怀疑&#xff09;来识别潜在攻击。然而&#xff0c;将数据科学集成到网络安全中…

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜…

open-instruct框架使用记录:只使用huggingface数据集的小部分进行训练,如何修改dataset_info.json文件

open-instruct框架 这篇笔记主要记录以下问题&#xff1a;只使用huggingface下载的数据集中的一小部分数据进行数据训练。而且我不想修改open-instruct的加载数据集的代码&#xff0c;以及脚本中的--dataset_mixer_list参数的指定等。下面是我的思路历程。 if args.dataset_na…

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…