前言

Microsoft Virtual Academy提供了学习ASP.NET的大量视频材料。(注1)

由于视频服务器位于海外,国内浏览速度并不理想,幸好官方提供了视频的下载地址以及英文字幕文件。

然而其提供下载的字幕文件仅为不带时间戳的文本文档,而页面上提供的带时间戳的字幕文件并非标准格式字幕文件,因此用C#制作了一个简单字幕制作程序。

需求

1.在提供的文本中提取字幕开始与结束时间戳。由于官方字幕文档只有开始时间,需要截取下一条字幕开始时间作为结束时间并进行微调;

2.将提取的时间戳扩展为srt标准时间戳格式。官方字幕的时间格式并不符合srt字幕需求的格式;

3.输出标准格式的srt字幕文件。

输出结果如下,依次为原始的字幕文档、准确的srt文件、字幕添加到视频中的效果(注2)

00:00:04	We are back.
00:00:04 And we are almost to the MVC partof ASP.NET Core introduction,
00:00:09 not quite, but almost.
00:00:11 What we're gonna do here is we'regonna give you a little bit...

  

1
00:00:03.00 --> 00:00:04.50
We are back.
2
00:00:04.55 --> 00:00:09.50
And we are almost to the MVC partof ASP.NET Core introduction,
3
00:00:09.55 --> 00:00:11.50
not quite, but almost.
4
00:00:11.55 --> 00:00:13.50
What we're gonna do here is we'regonna give you a little bit...

  

  

  

实现

using System.IO;

namespace TxtToSrtForVideoOnASP.NET
{
class Program
{
static void Main(string[] args)
{
//读取与输出文件
string path = @"D:\transcript.txt";
string subPath = @"D:\sub.srt"; using (StreamWriter sw=new StreamWriter(subPath))
{
string[] allLine = File.ReadAllLines(path);
string startTime="";
string endTime = "";
for (int i = ; i < allLine.Count(); i++)
{
//读取每行前8个字符作为每条字幕开始时间
startTime = AdjustTime(allLine[i].Substring(, ), true); //读取下一行前8个字符作为每条字幕结束时间
if (i == (allLine.Count()-))
//视频结束时间
endTime = "00:19:24,00";
else
endTime= AdjustTime(allLine[i+].Substring(, ), false); //输出标准srt格式字幕
sw.WriteLine((i + ) + "\r\n" + startTime + " --> " + endTime + "\r\n" + allLine[i].Substring());
}
}
Console.WriteLine("输出完毕");
Console.ReadKey();
} /// <summary>
/// 为srt文件提供完整的时间戳格式,加入少量延迟使字幕时间更准确
/// </summary>
/// <param name="Time">从transcript.txt中读取的时间戳</param>
/// <param name="start">Time是否为开始时间</param>
/// <returns></returns>
public static string AdjustTime(string Time,bool start)
{
if (start)
return (TimeSpan.Parse(Time) + TimeSpan.FromSeconds(0.55)).ToString().Substring(,);
else
return (TimeSpan.Parse(Time) + TimeSpan.FromSeconds(0.5)).ToString().Substring(,);
}
}
}

注:

1.https://mva.microsoft.com/en-US/training-courses/introduction-to-asp-net-core-1-0-16841?l=yiobVeE6C_3506218965

2.第一条字幕由于时间较短以及官方时间戳的不完整与第二字幕开始时间一致,需要经过手动微调。可以增加逻辑进行处理,然而只有一条字幕所以在本例没有实现。

[C#]为微软ASP.NET官方教学视频增加字幕的更多相关文章

  1. B站英文教学视频的字幕获取 学习必看!

    前言 最近在B站看一些纯英文的课程,视频课程有的是纯中文字幕的,有的是纯英文字幕的.由于英文的重要性,一份字幕的文档在我们观看后,留着日后粗略再读是很有益处的.但是为了得到这个英文字幕走了许多弯路.最 ...

  2. Unity3D大风暴之入门篇(海量教学视频版)

    智画互动开发团队 编   ISBN 978-7-121-22242-9 2014年2月出版 定价:79.00元 328页 16开 编辑推荐 长达800分钟的高清教学视频,手把手教会初学者 数个开发案例 ...

  3. 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...

  4. 微软ASP.NET技术“乱谈”

    微软ASP.NET技术“乱谈” 2014新年了,顺手写的一点文字,主要谈谈我对当前微软ASP.NET技术的看法,比较随意,大伙儿随便看看吧. 1 当前微软Web平台技术全貌 从2002年发布.NET ...

  5. 微软ASP.NET MVC 学习地址

    微软ASP.NET MVC4.0学习地址:http://www.asp.net/mvc

  6. Cocos2d-x官方在线视频-Cocos2d-x3.2《2048》手游开发揭秘

    Cocoachina 官方在线视频 http://cn.cocos2d-x.org/tutorial/lists?id=58 一.游戏介绍 2048游戏是一款风靡全球的休闲类游戏,通过控制4X4范围内 ...

  7. 微软发布Win10开发者指南视频

    假设你是一个开发者,推荐你看看微软今天推出了一系列视频,标题是Win10开发人员指南,总体长度6时,多达22章内容,介绍很广泛.其实,即使你是编程新手或仅有兴趣,也值得一看. 开发人员Jerry Ni ...

  8. 重温吕鑫MFC教学视频(一)

    重温吕鑫MFC教学视频(一)1. picture控件的使用,可以显示icon和bitmap2. WM_Create窗口的创建3. 创建的销毁消息及区别WM_SYSCOMMAND WM_CLOSE WM ...

  9. vue教学视频(小程序教学视频)

    写在前面 最近通过了解众多面试者的面试情况 总结出以下几点: 对框架的要求越来越高特别是vue和小程序 不会vue和小程序连面试机会都没有 会vue的比不会vue的薪资高4-5k 小程序有发展的趋势 ...

随机推荐

  1. ecos新命令

    创建myapp,在myapp里创建lib/command目录 新建一个文件hello.php <?php /** * myapp_command_hello(myapp->app名称,co ...

  2. 17.4.3 使用MulticastSocket实现多点广播(2)

    // 让该类实现Runnable接口,该类的实例可作为线程的target public class MulticastSocketTest implements Runnable { // 使用常量作 ...

  3. Tomcat 静态部署 二步特别注意

    一.修改server.xml 在Host 节点添加如下配置 <!-- path 为请求url地址 docBase 为项目文件绝对地址制定到WebContent根目录下 --> <Co ...

  4. Linux系统目录

    [root@localhost ~]# ls /bin dev home lost+found misc opt root selinux sys usrboot etc lib media net ...

  5. function $(id){ return document.getElementById(id); }导致所有的js不能用解决办法。。。。

    function $(id){ return document.getElementById(id); } document.getElementById(id) 是获得id这个元素的. 相当于定义了 ...

  6. R语言实战(四)回归

    本文对应<R语言实战>第8章:回归 回归是一个广义的概念,通指那些用一个或多个预测变量(也称自变量或解释变量)来预测响应变量(也称因变量.效标变量或结果变量)的方法.通常,回归分析可以用来 ...

  7. Online Schema Change for MySQL

    It is great to be able to build small utilities on top of an excellent RDBMS. Thank you MySQL. This ...

  8. eclipse控制台中文乱码解决

    Eclipse控制台中的中文输出乱码问题 博客分类: MySql EclipseTomcatXMLWeb  今天做S2SH集成的例子,所有该设置的地方都设置成了UTF-8,包括tomcat的配置文件s ...

  9. java线程 — 创建和启动线程

    创建和启动线程,传统有两种方式: 方式1:继承Thread类: 方式2:实现Runnable接口: 线程类(java.lang.Thread):Thread类和Thread的子类才能称之为线程类.阅读 ...

  10. BootStrap TreeView使用示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...