【VB.NET】使用 VlcLib(VlcDotNet)播放在内存中的视频流

在WPF程序中,我们可以使用 MediaElement 控件播放视频,只要我们的系统中拥有相应的解码器即可。
即便Windows系统中没有相关的解码器,我们也可以通过安装一些解码器补丁程序(如 K-Lite Basic ),来增强和补完系统的媒体解码器。

虽然播放格式的问题可以通过第三方插件解决,然而 MediaElement 有一个致命的缺点,那就是它仅支持从本地或是网络地址来加载媒体文件,并不能通过数据流加载媒体,因此在使用时有许多的限制。

好在我们可以通过使用第三方的媒体库 VlcLib 来解决这个问题,让我们的 WPF 或是 WinForm 程序实现从文件流、内存流中加载媒体文件,并且其自身就拥有丰富的解码器插件,因此并不需要第三方或是系统解码器的支持,即可播放绝大部分的视频格式!

- 阅读全文 -

System.Net.Sockets.SocketException: 无法加载或初始化请求的服务提供程序

今天发现我的系统盘只剩下6GB的空间,吓了一跳,赶紧想办法删除一些C盘里的垃圾文件和不用的程序、系统组件。
等我删得差不多的时候,才发现原来是wamp的临时文件吃掉了我大部分的硬盘空间……(开启DEBUG模式后)

删除文件、重启电脑之后,突然所有使用 .net sockets 库的程序都引发了“无法加载或初始化请求的服务提供程序”的错误。
刚开始我还以为自己误删了 System.Net.Sockets.dll ,又赶忙去网上找了一个最新版的 sockets.dll 放到程序目录下,然而还是无法顺利启动程序。
之后Bing了一下,才发现根本不是丢失文件的问题,而是因为 winsock 的系统服务似乎被关闭了。

解决方法很简单,开始-运行-CMD,使用下面的代码即可:

netsh winsock reset  
网上的文章说需要重启电脑,但是我测试发现并不需要,只要开启 winsock 的服务就可以立刻使用发生错误的程序了。
留个笔记,防止今后再发生这种事情……

- 阅读全文 -

vb.net 中的三元运算符

在C系语言中,可以通过 表达式 ? 返回结果 : 替代方案 来定义一个三元运算符,而VB.NET则只能 IIf 这个表达式来代替三元运算符的功能。

那么 VB.NET 中有能代替 IIf 的三元运算符吗?

- 阅读全文 -

.NET使用HttpWebRequest连接https时 “基础链接已关闭”的解决方法

今天修改了一下自己以前写的程序,然而在POST数据时却发生了“基础链接已关闭”的奇怪BUG,调试了半天也没有发现原因。

Dim request As HttpWebRequest = WebRequest.Create("https://xxxxxxx/api")
request.Proxy = Nothing    '关闭代理,否则速度巨慢无比
request.Method = "POST"

Dim postdata As String = "POST数据..."
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postdata)
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = byteArray.Length
Dim dataStream As Stream = request.GetRequestStream() '在这里发生错误
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()

Dim response As HttpWebResponse = request.GetResponse()    
' ...
后来Google了半天,发现可能是默认的安全协议类型 SecurityProtocolType 错误,
因为我这个程序使用的是.net 2.0的环境,其默认的 SecurityProtocolTypessl3+tls1.0协议。
然而这两个协议早已经不安全,所以目前大部分的网站都已不支持这两个协议!
然而.net 2.0的 SecurityProtocolType 的枚举类型中并没有其他协议的参数,只好由我自己查询枚举值,再手动设置到 ServicePointManager.SecurityProtocolType 的全局属性之中了!
' 因为此属性乃是全局属性,只需在使用WebRequest前执行此代码即可
Net.ServicePointManager.SecurityProtocol = 48 Or 192 Or 768 Or 3072 'Ssl3 Tls Tls1.1 Tls1.2

' 貌似用这个参数可以使用系统内最新的安全协议?
Net.ServicePointManager.SecurityProtocol = 2147483647
' .net 4.7以上采用的是系统默认,似乎也是最新的安全协议?
Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault
如果还是发生错误,或者用户的机器显示无效的安全协议,表明该机器需要更新.NET框架补丁:
https://support.microsoft.com/zh-cn/help/3154518/support-for-tls-system-default-versions-included-in-the-net-framework

- 阅读全文 -

.NET 中的可空值类型

在 .NET 中,有引用类型与值类型两种对象类型,而其中值类型是“不可空”的类型,比如你设定一个int i = null,那么它会使用默认值0来为自己赋值。
然而有些时候,我们需要一个可空的值类型(比如数据库中的可空字段),那么该怎么办呢?

- 阅读全文 -

.NET 中的联合体

在C++中,有一种类型名为联合体(亦称共用体),关键字为union,它与结构十分类似,但是它所有的数值全都指向同一个指针。也就是说,当你修改联合体内的某一个数据时,其他数据也会同时改变。
这个类型的好处,在于可以存储某种不确定的数据对象,等到稍后再来分析出该对象的用途。

union MyUnion
{
    char b; //单字节整数,在c语言中用char类型来表示单字节整数
    short s; //双字节整数
    int i; //四字节整数
}
而在 .NET 中,却并没有 union 这个关键字,是不是 .NET 就无法使用联合体呢?
当然不是,否则我干嘛写这篇文章?!

- 阅读全文 -

.NET 4.0框架下的Base64字符转换存在BUG

如果有一个双等号结尾的非法BASE64编码作为参数(如abc==),.NET的 Convert.FromBase64String 函数不仅不会报错,反而还会产生一个意料之外的返回值,对后续程序的执行是一个隐患。
详细资料请参考 https://detunized.net/posts/2019-03-06-base64-decoding-bug-that-is-present-in-all-version-of-.net/

经过我个人的测试,我发现这个BUG仅影响 4.0 以上的版本,反而 2.0~3.5 可以正确发现参数异常,并予以报错。
另外据说最新的 .NET Core 也已经修复了这个BUG,所以请使用 4.0 作为开发框架的童鞋们“注意安全”。

原文给出了一个 .NET 4.7.2 的内部解决方法

// This only works for base64 without spaces or linebreaks.
string Repad(string base64)
{
    var l = base64.Length;
    return l % 4 == 1 && base64[l - 1] == '='
        ? base64.Substring(0, l - 1)
        : base64;
}
不过总觉得哪里有一点不对劲,哈哈~

- 阅读全文 -

公告

欢迎您光临鄙人的小站,虽然没什么太专业的东西,不过如果本站的文章能让您有所收获、或者仅仅是博您一笑,那么也不枉费我建站的辛苦了!

有任何问题,可以在『关于页面』内留言或寻找我的联系方式!

本站所有内容禁止转载到大陆的商业网站(如CSDN、博客园、简书、微信公众号、豆瓣、B站、知乎等),但不限制您的个人站点,只需添加转载链接即可。

瞎哔哔

    站点已恢复直连,访问速度应该比之前快了。

    若再度出现不稳定的情况,可能会重新启用 cloudflare 托管。

  • 查看更多...

最新文章

随机文章

最近回复

分类

标签

归档

其它