完成基本u3m8解析、下载切片并拼接视频功能(待续)
This commit is contained in:
parent
56daae0709
commit
73ed54c4f0
@ -10,17 +10,26 @@
|
|||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="皓月流媒体下载器(m3u8版) Ver 0.0.1 alpha" Height="450" Width="645">
|
Title="皓月流媒体下载器(m3u8版) Ver 0.0.1 alpha" Height="450" Width="645">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Label Content="m3u8流媒体URL地址:" HorizontalAlignment="Left" Margin="10,11,0,0" VerticalAlignment="Top" Width="133"/>
|
<Label Content="m3u8流媒体URL地址:" HorizontalAlignment="Left" Margin="10,32,0,0" VerticalAlignment="Top" Width="133"/>
|
||||||
<TextBox HorizontalAlignment="Left" x:Name="TextUrl" Height="23" Margin="148,10,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="399"/>
|
<TextBox HorizontalAlignment="Left" x:Name="TextUrl" Height="23" Margin="148,31,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="399"
|
||||||
|
|
||||||
<Button x:Name="BtnDoStart" Content="开 始 解 析" HorizontalAlignment="Left" Margin="552,11,0,0" VerticalAlignment="Top" Width="75" Click="DoStart"/>
|
/>
|
||||||
|
|
||||||
<Label Content="处理日志:" HorizontalAlignment="Left" Margin="10,32,0,0" VerticalAlignment="Top"/>
|
<Button x:Name="BtnDoStart" Content="开 始 解 析" HorizontalAlignment="Left" Margin="552,32,0,0" VerticalAlignment="Top" Width="75" Click="DoStart"/>
|
||||||
<ListBox x:Name="ListLog" HorizontalAlignment="Left" Height="137" Margin="10,62,0,0" VerticalAlignment="Top" Width="617" IsSynchronizedWithCurrentItem="True"
|
|
||||||
|
<Label Content="处理日志:" HorizontalAlignment="Left" Margin="9,109,0,0" VerticalAlignment="Top"/>
|
||||||
|
<ListBox x:Name="ListLog" HorizontalAlignment="Left" Height="248" Margin="10,139,0,0" VerticalAlignment="Top" Width="617" IsSynchronizedWithCurrentItem="True"
|
||||||
Background="#888888"
|
Background="#888888"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Label Content="下载进度:" HorizontalAlignment="Left" Margin="10,392,0,0" VerticalAlignment="Top"/>
|
<Label Content="下载进度:" HorizontalAlignment="Left" Margin="9,390,0,0" VerticalAlignment="Top"/>
|
||||||
<ProgressBar HorizontalAlignment="Left" Height="4" Margin="84,402,0,0" VerticalAlignment="Top" Width="543"/>
|
<ProgressBar x:Name="MyProgressBar" HorizontalAlignment="Left" Height="20" Margin="84,392,0,0" VerticalAlignment="Top" Width="543"/>
|
||||||
|
<Label Content="线程数(暂未实现):" HorizontalAlignment="Left" Margin="403,66,0,0" VerticalAlignment="Top"/>
|
||||||
|
<Slider HorizontalAlignment="Left" IsEnabled="False" Margin="524,71,0,0" VerticalAlignment="Top" Width="95"/>
|
||||||
|
<Button Content="..." HorizontalAlignment="Left" Margin="368,65,0,0" VerticalAlignment="Top" Width="20"/>
|
||||||
|
<Label Content="视频存储路径:" HorizontalAlignment="Left" Margin="10,66,0,0" VerticalAlignment="Top"/>
|
||||||
|
<TextBox x:Name="TextVideoPath" IsEnabled="False" HorizontalAlignment="Left" Height="23" Margin="148,65,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="202"/>
|
||||||
|
<RadioButton Content="通用模式" IsChecked="True" HorizontalAlignment="Left" Margin="14,5,0,0" VerticalAlignment="Top"/>
|
||||||
|
<RadioButton Content="重庆电视台视频解析" IsEnabled="False" HorizontalAlignment="Left" Margin="115,5,0,0" VerticalAlignment="Top"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</controls:MetroWindow>
|
</controls:MetroWindow>
|
||||||
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
@ -25,8 +26,16 @@ namespace HaoYue.MediaDownloader
|
|||||||
/// [0] 视频格式 [1]m3u8文件
|
/// [0] 视频格式 [1]m3u8文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int filetype { get; set; }
|
public int filetype { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// [0]未处理[1]在下中[2]已下载[3]处理失败
|
||||||
|
/// </summary>
|
||||||
|
public int State { get; set; }
|
||||||
|
|
||||||
|
public int Index { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// MainWindow.xaml 的交互逻辑
|
/// MainWindow.xaml 的交互逻辑
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -35,12 +44,26 @@ namespace HaoYue.MediaDownloader
|
|||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
this.TextVideoPath.Text = Environment.CurrentDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 任务列表
|
||||||
|
/// </summary>
|
||||||
|
public static List<ModelOfM3u8> TaskList;
|
||||||
|
|
||||||
string mypath = Environment.CurrentDirectory;
|
string mypath = Environment.CurrentDirectory;
|
||||||
|
|
||||||
private void DoStart(object sender, RoutedEventArgs e)
|
private void DoStart(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
|
MyRun();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MyRun()
|
||||||
|
{
|
||||||
|
//禁止UI在处理过程中操作
|
||||||
|
this.TextUrl.IsEnabled = false;
|
||||||
|
this.BtnDoStart.IsEnabled = false;
|
||||||
AddLog("处理");
|
AddLog("处理");
|
||||||
if (this.TextUrl.Text == "")
|
if (this.TextUrl.Text == "")
|
||||||
{
|
{
|
||||||
@ -48,33 +71,46 @@ namespace HaoYue.MediaDownloader
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.TextUrl.IsEnabled = false;
|
string M3u8FileUrl = this.TextUrl.Text;
|
||||||
this.BtnDoStart.IsEnabled = false;
|
string SiteDir = this.TextUrl.Text.Substring(0, this.TextUrl.Text.LastIndexOf('/')) + "/";
|
||||||
string ThisTaskDir = mypath + "\\Download\\" + DateTime.Now.ToString("yyyyMMdd-hhmmss.FFF") + "\\";
|
string M3u8FileName = this.TextUrl.Text.Substring(this.TextUrl.Text.LastIndexOf('/') + 1);
|
||||||
|
|
||||||
if (!Directory.Exists(ThisTaskDir))
|
ThreadPool.QueueUserWorkItem((obj) =>
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(ThisTaskDir);
|
|
||||||
AddLog("创建媒体任务目录 "+ThisTaskDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
string FileName = this.TextUrl.Text.Substring(this.TextUrl.Text.LastIndexOf('/')+1);
|
string ThisTaskDir = mypath + "\\Download\\" + DateTime.Now.ToString("yyyyMMdd-hhmmss.FFF") + "\\";
|
||||||
string SiteDir = this.TextUrl.Text.Substring(0,this.TextUrl.Text.LastIndexOf('/'));
|
|
||||||
|
|
||||||
AddLog("开始下载m3u8文件 " + FileName);
|
|
||||||
HttpHelper.Download(this.TextUrl.Text,ThisTaskDir + FileName);
|
|
||||||
AddLog("下载完毕");
|
|
||||||
|
|
||||||
CheckM3u8File(ThisTaskDir + FileName);
|
if (!Directory.Exists(ThisTaskDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(ThisTaskDir);
|
||||||
|
AddLog("创建媒体任务目录 " + ThisTaskDir);
|
||||||
|
}
|
||||||
|
|
||||||
AddLog("处理完毕");
|
AddLog("开始下载m3u8文件 " + M3u8FileName);
|
||||||
|
HttpHelper.Download(M3u8FileUrl, ThisTaskDir + M3u8FileName);
|
||||||
|
AddLog("下载完毕");
|
||||||
|
|
||||||
|
TaskList = CheckM3u8File(ThisTaskDir + M3u8FileName);
|
||||||
|
|
||||||
|
AddLog("开始下载流程");
|
||||||
|
StartDownLoad(SiteDir,ThisTaskDir);
|
||||||
|
AddLog("开始拼接视频分片");
|
||||||
|
//AddLog("处理完毕");
|
||||||
|
////恢复UI可操作
|
||||||
|
//this.TextUrl.IsEnabled = true;
|
||||||
|
//this.BtnDoStart.IsEnabled = true;
|
||||||
|
}, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<ModelOfM3u8> CheckM3u8File(string FilePath)
|
private List<ModelOfM3u8> CheckM3u8File(string FilePath)
|
||||||
{
|
{
|
||||||
AddLog("开始解析m3u8文件");
|
AddLog("开始解析m3u8文件");
|
||||||
var ALLList = new List<ModelOfM3u8>();
|
var ALLList = new List<ModelOfM3u8>();
|
||||||
string FileText = File.ReadAllText(FilePath);
|
string FileText = File.ReadAllText(FilePath);
|
||||||
|
int i = 0;
|
||||||
foreach (string s in FileText.Split('\n'))
|
foreach (string s in FileText.Split('\n'))
|
||||||
{
|
{
|
||||||
if (s.Trim().Length > 0 && s.Trim().Substring(0, 1) != "#")//去空格后长度不为1 且不是注释
|
if (s.Trim().Length > 0 && s.Trim().Substring(0, 1) != "#")//去空格后长度不为1 且不是注释
|
||||||
@ -86,21 +122,113 @@ namespace HaoYue.MediaDownloader
|
|||||||
{
|
{
|
||||||
filetype = 1;
|
filetype = 1;
|
||||||
}
|
}
|
||||||
ALLList.Add(new ModelOfM3u8() { Path = s ,filetype = filetype});
|
ALLList.Add(new ModelOfM3u8() { Path = s ,filetype = filetype,State = 0,Index = ++i });
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AddLog("解析完毕,共"+ALLList.Where(w => w.filetype == 0 ).Count()+"个ts视频切片");
|
AddLog("解析完毕,共"+ALLList.Where(w => w.filetype == 0 ).Count()+"个ts视频切片,共"+ALLList.Where(w => w.filetype == 1 ).Count()+"个m3u8配置文件");
|
||||||
return ALLList;
|
return ALLList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StartDownLoad(string SiteDir,string ThisTaskDir)
|
||||||
|
{
|
||||||
|
//如果队列中还有未进行的任务则进行
|
||||||
|
while (TaskList.Where(w => w.State == 0).Count() > 0){
|
||||||
|
var taskinfo = TaskList.Where(w => w.State == 0).FirstOrDefault();
|
||||||
|
if (taskinfo != null)
|
||||||
|
{
|
||||||
|
TaskList[TaskList.IndexOf(taskinfo)].State = 1;
|
||||||
|
AddLog("开始下载文件" + taskinfo.Path);
|
||||||
|
HttpHelper.Download(SiteDir + taskinfo.Path, ThisTaskDir + taskinfo.Index.ToString("000000")+".ts");
|
||||||
|
//更新进度条
|
||||||
|
this.MyProgressBar.Dispatcher.BeginInvoke(new mydoublesetter(SetProgressBar),
|
||||||
|
((double)TaskList.Where(w => w.State != 0).Count() / (double)TaskList.Count()) * 100.0f
|
||||||
|
);
|
||||||
|
AddLog("" + taskinfo.Path + " 下载完毕");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AddLog("进程结束");
|
||||||
|
|
||||||
|
CommanderStr(ThisTaskDir);
|
||||||
|
|
||||||
|
if (File.Exists(ThisTaskDir + "\\final.ts"))
|
||||||
|
{
|
||||||
|
//移动文件到上一层
|
||||||
|
AddLog("移动文件到上一层");
|
||||||
|
string newfilapath = (ThisTaskDir + "\\..\\" + "\\" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + ".ts");
|
||||||
|
File.Move((ThisTaskDir + "\\final.ts"), newfilapath);
|
||||||
|
|
||||||
|
//删除视频切片
|
||||||
|
AddLog("删除视频切片");
|
||||||
|
Directory.Delete(ThisTaskDir);
|
||||||
|
System.Diagnostics.Process.Start("Explorer.exe", ThisTaskDir + "\\..\\");
|
||||||
|
AddLog("处理完成");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddLog("合并处理失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void CommanderStr(string FileItemDir)
|
||||||
|
{
|
||||||
|
string c = @"copy /b "+ FileItemDir + "\\*.ts " + FileItemDir + "\\final.ts";
|
||||||
|
Cmd(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行Cmd命令
|
||||||
|
/// </summary>
|
||||||
|
private void Cmd(string c)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.Diagnostics.Process process = new System.Diagnostics.Process();
|
||||||
|
process.StartInfo.FileName = "cmd.exe";
|
||||||
|
process.StartInfo.UseShellExecute = false;
|
||||||
|
process.StartInfo.CreateNoWindow = true;
|
||||||
|
process.StartInfo.RedirectStandardOutput = true;
|
||||||
|
process.StartInfo.RedirectStandardInput = true;
|
||||||
|
process.Start();
|
||||||
|
process.StandardInput.WriteLine(c);
|
||||||
|
process.StandardInput.AutoFlush = true;
|
||||||
|
process.StandardInput.WriteLine("exit");
|
||||||
|
|
||||||
|
StreamReader reader = process.StandardOutput;//截取输出流
|
||||||
|
process.WaitForExit();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{ }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void AddLog(string str)
|
public void AddLog(string str)
|
||||||
{
|
{
|
||||||
this.ListLog.Items.Add(DateTime.Now.ToString("hh:mm:ss >") + str);
|
this.ListLog.Dispatcher.BeginInvoke(new mystringsetter(Set_myLog), DateTime.Now.ToString("hh:mm:ss >") + str);
|
||||||
//要使用显示最后一行
|
//this.ListLog.Items.Add(DateTime.Now.ToString("hh:mm:ss >") + str);
|
||||||
this.ListLog.SelectedIndex = this.ListLog.Items.Count - 1;
|
////要使用显示最后一行
|
||||||
this.ListLog.ScrollIntoView(this.ListLog.SelectedIndex);
|
//this.ListLog.SelectedIndex = this.ListLog.Items.Count - 1;
|
||||||
//待续...
|
//this.ListLog.ScrollIntoView(this.ListLog.SelectedIndex);
|
||||||
|
////待续...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//一些类型委托
|
||||||
|
public delegate void mydoublesetter(double value);
|
||||||
|
public delegate void mystringsetter(string value);
|
||||||
|
|
||||||
|
|
||||||
|
public void Set_myLog(string value)
|
||||||
|
{
|
||||||
|
this.ListLog.Items.Add(value);
|
||||||
|
this.ListLog.ScrollIntoView(ListLog.Items[ListLog.Items.Count - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetProgressBar(double value)
|
||||||
|
{
|
||||||
|
this.MyProgressBar.Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user