如果你在使用C#中AxWindowsMediaPlayer控件进行视频播放,但是却与暴风影音软件造成冲突,下面的代码也许能给你带来帮助。
使用AxWindowsMediaPlayer进行播放时在某些情况下与暴风影音有冲突,当安装了暴风影音播放则正常;卸载了暴风影音后播放时只有声音没有图片。那么此时需要注册暴风影音用到的几个文件,分别是:ffmpeg.dll、ffdshow.ax、ffmpeg.dll、libmpeg2_ff.dll这几个文件要放在一起注册至注册表中。下面的代码中注册的值是通过手动测试而得的,测试方法是安装暴风影音和卸载暴风影音后注册表值的差别而得出的必须要注册的值。不一定能使用所有场合,请大家参考使用。
直接看代码:
public class RegFFDShow
{
[DllImport("DLL\\ffdshow.ax")]//ffdshow.ax放的路径,当前代码放的是运行目录下DLL文件下
public static extern int DllRegisterServer();
public static void RegFFDSHOW()
{
if (Regffdshow_ax() != -1)
{
Regffdshow();
}
}
private static int Regffdshow_ax()
{
RegistryKey registryKey = Registry.ClassesRoot.OpenSubKey(@"CLSID\{4DB2B5D9-4556-4340-B189-AD20110D953F}");
if (registryKey == null)
{
int i = DllRegisterServer();
if (i >= 0)//注册成功!
{
return 0;
}
else//注册失败
{
return -1;
}
}
else
{
return 1;
}
}
private static bool Regffdshow()
{
string strS1521 = string.Empty;
RegistryKey RegLocalmachine;
RegistryKey regKeySoftware;
RegistryKey regKeyffdshowGNU;
RegistryKey regKeyffdshow;
RegistryKey ffdshowDefault;
RegLocalmachine = Registry.LocalMachine;
regKeySoftware = RegLocalmachine.CreateSubKey("Software");
regKeyffdshowGNU = regKeySoftware.CreateSubKey("GNU");
regKeyffdshow = regKeyffdshowGNU.CreateSubKey("ffdshow");
//所有的要用到的暴风影音组件所在的文件夹
regKeyffdshow.SetValue("pth", Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"\DLL"));
string[] strSubKeyNames = Registry.Users.GetSubKeyNames();
foreach (string strSubKeyName in strSubKeyNames)
{
if (strSubKeyName.StartsWith("S-1-5-21-") && strSubKeyName.EndsWith("_Classes"))
{
strS1521 = strSubKeyName;
break;
}
}
RegistryKey registryKey = Registry.Users.OpenSubKey(strS1521.Replace("_Classes", "") + @"\SOFTWARE\GNU\ffdshow");
//if (registryKey != null)
//{
// return true;
//}
try
{
RegistryKey regKeyS1521 = Registry.Users.CreateSubKey(strS1521.Replace("_Classes", ""));
regKeySoftware = regKeyS1521.CreateSubKey("Software");
regKeyffdshowGNU = regKeySoftware.CreateSubKey("GNU");
regKeyffdshow = regKeyffdshowGNU.CreateSubKey("ffdshow");
string[] strffdshow = new string[40] {
"fastH264",
"subTextpin",
"subTextpinSSA",
"isBlacklist",
"isWhitelist",
"cscd",
"div3",
"duck",
"dx50",
"ffv1",
"flv1",
"fvfw",
"h261",
"h263",
"h264",
"hfyu",
"iv32",
"mjpg",
"mp41",
"mp42",
"mp43",
"mp4v",
"mszh",
"png1",
"qtrle",
"qtrpza",
"raw_rawv",
"rt21",
"svq1",
"svq3",
"theo",
"vp3",
"vp5",
"vp6",
"vp6f",
"xvid",
"zlib",
"supDVDdec",
"mpg2",
"trayIcon"
};
int[] nffdshow = new int[40] {
0x00,
0x01,
0x01,
0x01,
0x00,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x015,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x01,
0x00
};
for (int i = 0; i < strffdshow.Length; i++)
{
regKeyffdshow.SetValue(strffdshow[i], nffdshow[i]);
}
ffdshowDefault = regKeyffdshow.CreateSubKey("default");
string[] strffdshow_default = new string[6]{
"postprocH264mode",
"resizeMethod",
"subIsExpand",
"isSubtitles",
"isOSD",
"threadsnum"
};
int[] nffdshow_default = new int[6]{
0x00,
0x09,
0x00,
0x00,
0x00,
0x02
};
for (int i = 0; i < strffdshow_default.Length; i++)
{
ffdshowDefault.SetValue(strffdshow_default[i], nffdshow_default[i]);
}
ffdshowDefault.Close();
RegistryKey regKeyffdshow_audio = regKeyffdshowGNU.CreateSubKey("ffdshow_audio");
RegistryKey regKeyffdshow_audio_default = regKeyffdshow_audio.CreateSubKey("default");
string[] strffdshow_audio = new string[18]{
"isBlacklist",
"isWhitelist",
"aac",
"ac3",
"amr",
"dts",
"eac3",
"flac",
"lpcm",
"mace",
"truehd",
"mlp",
"mp2",
"mp3",
"qdm2",
"tta",
"vorbis",
"trayIcon"};
int[] nffdshow_audio = new int[18]{
0x01,
0x00,
0x08,
0x0f,
0x01,
0x01,
0x01,
0x01,
0x04,
0x01,
0x01,
0x01,
0x07,
0x07,
0x01,
0x01,
0x01,
0x00};
for (int i = 0; i < strffdshow_audio.Length; i++)
{
regKeyffdshow_audio.SetValue(strffdshow_audio[i], nffdshow_audio[i]);
}
string[] strffdshow_audio_default = new string[8]{
"mixerNormalizeMatrix",
"volNormalize",
"ismixer",
"mixerOut",
"passthroughAC3",
"passthroughDTS",
"decoderDRC",
"isOSD"
};
int[] nffdshow_audio_default = new int[8]{
0x00,
0x00,
0x01,
0x00,
0x00,
0x00,
0x00,
0x00
};
for (int i = 0; i < strffdshow_audio_default.Length; i++)
{
regKeyffdshow_audio.SetValue(strffdshow_audio_default[i], nffdshow_audio_default[i]);
}
regKeyffdshow_audio_default.Close();
RegistryKey regKeyffdshow_DXVA = regKeyffdshowGNU.CreateSubKey("ffdshow_DXVA");
string[] strffdshow_DXVA = new string[3]{
"isCompMgr",
"isBlacklist",
"isWhitelist"};
int[] nffdshow_DXVA = new int[3]{
0x00,
0x00,
0x01};
for (int i = 0; i < strffdshow_DXVA.Length; i++)
{
regKeyffdshow_DXVA.SetValue(strffdshow_DXVA[i], nffdshow_DXVA[i]);
}
regKeyffdshow_DXVA.SetValue("Whitelist", "bsplayer.exe;coreplayer.exe;ehshell.exe;" +
"gom.exe;graphedit.exe;graphedt.exe;graphstudio.exe;" +
"graphstudio64.exe;kmplayer.exe;mpc-hc.exe;mpc-hc64.exe;" +
"mplayerc.exe;wmplayer.exe;zplayer.exe;");
regKeyffdshow_DXVA.Close();
regKeyffdshowGNU.Close();
regKeySoftware.Close();
regKeyS1521.Close();
Registry.Users.Close();
RegLocalmachine.Close();
return true;
}
catch
{
return false;
}
}
}
调用:
RegFFDShow.RegFFDSHOW();
就可以完成注册所有组件,播放也就没有问题了。
ffdshow组件及本章代码下载:http://download.csdn.net/detail/yysyangyangyangshan/4914610