在播放本地媒体文件时,VLC会对文件路径进行编码,将中文字符编码为utf-8。在程序中也需要如此,否则不能正常播放。
C#中可以用 System.Web.HttpUtility.UrlEncode(string, System.Text.Encoding.UTF8)对字符串进行编码(wpf中需要在项目→引用中手工添加),但是直接编码后Vlc.DotNet,还不能播放。
针对这个问题,通过与VLC播放器本地文件路径的对比,发现原因是UrlEncode将所有字符串除了英文字字母外,都进行了编码,包括“/”、“:”。
此外,vlc对于打开本都文件的路径有如下要求:
1、与互联网地址格式一致,引导协议必须是file:///
2、路径分割符号需为“/”
3、所有英文(含字母、符号)不编码,只编码汉字部分
为此,编写了一个方法:
private static string VLCFileEncode(string FileName)
{
if (!File.Exists(FileName))
{
return "";
}
FileName = "file:///" + FileName.Replace("\\", "/");
FileName = System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8);
FileName = FileName.Replace("%2f", "/");
FileName = FileName.Replace("%3a", ":");
return FileName;
}
调用后,问题解决。
string file = AppDomain.CurrentDomain.BaseDirectory + "NoSignal.png";
file = VLCFileEncode(file);//文件名需要特殊的utf-8编码(只编码中文部分)
sourceProvider.MediaPlayer.Play(file);