C#/.Net 多线程下载m3u8视频

news/2024/5/19 23:24:25 标签: c#, .net, .netcore

C#/.Net 多线程下载m3u8视频

  • 下载网络文件方法
  • 下载m3u8

.HttpGet() 是我自己封装的HTTP请求方法

下载网络文件方法

/// <summary>
/// 下载网络文件
/// </summary>
/// <param name="url">文件地址</param>
/// <param name="savePath">保存路径</param>
public static void DownloadFile(this string url, string savePath)
{
    
    WebClient wc = new WebClient();
	//从路径中取得文件名称
    var name = Path.GetFileName(url);
    if (name.Contains("?"))
    {
        name = name.Split("?")[0];
    }
    if (savePath.Last() != '/')
    {
        savePath += "/";
    }
	// 创建文件夹
    Directory.CreateDirectory(savePath);

    if(string.IsNullOrEmpty(name)) {
        return;
    }

    wc.DownloadFile(url, savePath + name);
}

下载m3u8

//ts保存路径
string tspath = "C:/Users/Administrator/Desktop/ts/";
//mp4保存路径
string mp4path = "C:/Users/Administrator/Desktop/mp4/";

// m3u8链接
string m3u8url = "https://v6.nfm3u8.com/20220802/dg9qcubn/hls/index.m3u8";

// 获取清单
string m3u8_content = m3u8url.HttpGet();

// 按换行符转换成数组,筛选掉空行和不是链接的行
List<string> m3u8_list = m3u8_content.Split("\n").Where(x => !x.StartsWith("#") && !string.IsNullOrEmpty(x.Trim())).ToList();

//下载线程数,多线程下载必须做限制,不然太夸张会导致崩溃
//10个线程刚刚好
int s = 0;
int progress = 0;//下载进度


foreach (string ts_url in m3u8_list) {
    //多线程下载
    Task.Run(() =>
    {
        s++;
        ts_url.DownloadFile(tspath);
        progress++;
        s--;
    });


    //等待空闲线程
    while (true)
    {
        //每0.1秒创建1个新的线程
        Task.Delay(100).Wait();
        //如果当前线程数量小于10个,跳出等待,开始下载下一条
        if (s < 10)
        {
            break;
        }
    }

}


//等待全部ts下载完成
while (true)
{
    if (progress < m3u8_list.Count)
    {
        Task.Delay(300).Wait();
    }
    else
    {
        break;
    }
}



//按顺序将ts合并成mp4
using (FileStream fs = new FileStream($"{mp4path}video.mp4", FileMode.Create))
{
    foreach (var _u in m3u8_list)
    {
        var name = Path.GetFileName(_u);
        using (FileStream fs1 = new FileStream(tspath+name, FileMode.Open))
        {
            fs1.CopyTo(fs);
        }
    }
}

//删除ts缓存
Task.Delay(500).Wait();
foreach (string filePath in Directory.GetFiles(tspath))
{
    File.Delete(filePath);
}

Console.WriteLine("下载完成:"+ $"{mp4path}video.mp4");

Console.ReadLine();

http://www.niftyadmin.cn/n/5423508.html

相关文章

uniapp列表滑动操作(删除、编辑)

本篇文章结合了下拉刷新、上拉加载&#xff0c;以及每一条列表的左滑删除&#xff0c;这里的header和footer盒子样式我就不写了&#xff0c;光写了main。是上中下布局&#xff0c;中间是内容&#xff0c;废话不说了&#xff0c;直接上代码&#xff01; <template><vi…

Kafka的监控与管理

主题日常管理 创建topic&#xff0c;版本2.2 bin/kafka-topics.sh --bootstrap-server broker_host:port --create --topic my_topic_name --partitions 1 --replication-factor 1 从2.2版本&#xff0c;使用--bootstrap-server 参数替换 --zookeeper 参数 原因&#xff1a…

自学软件测试真的能找到工作吗?“我“的测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自学软件测试当然…

算法之滑动窗口

题目1:209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 解法⼀(暴力求解): 思路&#xff1a; 从前往后, 枚举数组中的任意⼀个元素, 把它当成起始位置, 然后从这个起始位置开始, 然 后寻找⼀段最短的区间, 使得这段区间的和「⼤于等于」⽬标值. 将所有元素作为…

STM32的启动流程分析 和 一些底层控制的原理

阅读引言&#xff1a; 阅读本文之后&#xff0c; 你将对单片机&#xff0c; 甚至是嵌入式系统&#xff0c; 或者是传统的PC机系统的启动流程有一个大致的了解&#xff0c; 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器&#xff08;mcu&…

【IVA】人工智能领域常用的术语(1)

在人工智能和机器学习领域&#xff0c;"检测"、"识别"和"分类"是常用的术语&#xff0c;它们在问题解决中有着不同的含义&#xff1a; 检测&#xff08;Detection&#xff09;&#xff1a;检测是指在图像或视频中定位和识别特定目标的过程。目标…

[linux]AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue’

安装opencv sudo apt-get install opencv-python sudo apt-get install opencv-contrib-python报错 File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) ImportError…

Hive安装教程-Hadoop集成Hive

文章目录 前言一、安装准备1. 安装条件2. 安装jdk3. 安装MySQL4. 安装Hadoop 二、安装Hive1. 下载并解压Hive2. 设置环境变量3. 修改配置文件3. 创建hive数据库4. 下载MySQL驱动5. 初始化hive数据库6. 进入Hive命令行界面7. 设置允许远程访问 总结 前言 本文将介绍安装和配置H…