我所知道的唯一一款可以在任何浏览器中减速和加速播放YouTube视频的好软件,而不是首先下载它(因为这很麻烦),是Enounce MySpeed。< / p>
不幸的是,这个软件不是免费的,我的试用版用完了。我正在玩它的注册表设置并注意到几个键:
ProgramsToHook: iexplore.exe;firefox.exe;plugin-container.exe;chrome.exe;safari.exe;opera.exe;maxthon.exe;feeddemon.exe;realplay.exe;flvplayer.exe;flv player.exe;flock.exe;adobe media player.exe
UseFlashAdapter: 1
LLModules: ole32.dll;nspr4.dll;chrome.exe;realplay.exe;objb3201.dll;oleaut32.dll;rpflashplayer.dll
ModulesToIntercept: flash10*;flash9*;npswf32.dll;gcswf32.dll;fldbg10*;flashplayer.3.1.1k.ocx;adobe media player.exe
基于这些注册表项的名称和值,我猜测MySpeed软件会挂钩列出的模块中的某些函数(但模块是否与DLL相同?)并且这样做对于ProgramsToHook中列出的每个进程。这是我不明白的。 MySpeed软件的概念是什么?显然这是挂钩的东西,但我不太熟悉Windows钩子的错综复杂,所以我来问你专家。我想如果我能理解这个钩子进程是如何工作的,我可以使用EasyHook制作我自己的软件版本,这是一个非常出色的.NET库来执行用户模式和内核模式钩子。
我认为Windows用户模式挂钩就是这样的。您在一个DLL中选择一个函数,并在一个进程中拦截该函数(a.k.a钩子)。如果要在多个进程中挂钩DLL,则只需重复每个进程的过程。
然后内核模式挂钩只是在一个DLL中选择一个函数并在每个调用它的进程中拦截该函数(因此是内核模式)。但肯定有很多方法可以勾选;我不太清楚这两个钩子和DLL注入之间的区别是什么。
重点是,我想知道MySpeed的工作原理。他们的挂钩概念是什么?如果我能知道这一点,那么我可以用.NET制作这样的软件!
提前致谢。
答案 0 :(得分:3)
我无法向您提供准确的解释,因为我不知道API调用或功能,但它是这样的: 你的应用程序寻找iexplore.exe,它拦截对某些模块的调用。该模块主要是flash播放器。 Flash支持播放视频较慢,因此您可以从iexplore.exe(网页上的JavaScript播放按钮)修改呼叫,或者另外调用以设置播放速度。
您需要做什么:
挂钩:http://msdn.microsoft.com/en-gb/library/ms644960.aspx
我认为很多人都没有在C#中做到这一点,所以它可以提供一个挑战。如果你有博客或其他东西可以分享血腥细节,我会对进展(障碍)感兴趣。 :)
编辑: Deviare API Hook software似乎不仅可以监视来电,还可以拦截它们。所以它是一个一体化的包,满足您的需求。 :)
EDIT2:相关问题:How do I intercept messages being sent to a window?
答案 1 :(得分:2)
Youtube现在有一个带有播放速度控制的html5播放器。
您只需在此处启用html5 http://www.youtube.com/html5 但是,只有部分视频支持html5播放器。
希望这有帮助。
答案 2 :(得分:2)
加速或减慢视频的关键是让多媒体播放器相信您的计算机比实际更慢或更快。这可以通过挂钩timeGetTime()来实现。
这是一个非常简单的C#代码来实现它:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Nektra.Deviare2;
namespace DeviareTest
{
public partial class Form1 : Form
{
private int nSpeed;
private uint nTime;
private NktSpyMgr _spyMgr;
public Form1()
{
InitializeComponent();
_spyMgr = new NktSpyMgr();
_spyMgr.Initialize();
_spyMgr.OnFunctionCalled += new DNktSpyMgrEvents_OnFunctionCalledEventHandler(OnFunctionCalled);
}
private void Form1_Load(object sender, EventArgs e)
{
NktHook hook = _spyMgr.CreateHook("WINMM.dll!timeGetTime", (int)(eNktHookFlags.flgOnlyPostCall));
hook.Hook(true);
bool bProcessFound = false;
NktProcessesEnum enumProcess = _spyMgr.Processes();
NktProcess tempProcess = enumProcess.First();
while (tempProcess != null)
{
if (tempProcess.Name.Equals("iexplore.exe", StringComparison.InvariantCultureIgnoreCase) && tempProcess.PlatformBits == 32)
{
hook.Attach(tempProcess, true);
bProcessFound = true;
}
tempProcess = enumProcess.Next();
}
if(!bProcessFound)
{
MessageBox.Show("Please run \"iexplore.exe\" before!", "Error");
Environment.Exit(0);
}
}
private void OnFunctionCalled(NktHook hook, NktProcess process, NktHookCallInfo hookCallInfo)
{
nTime++;
if (nSpeed==-2)
hookCallInfo.Result().LongVal = hookCallInfo.Result().LongVal - (int)(nTime * 0.2);
else if(nSpeed==2)
hookCallInfo.Result().LongVal = hookCallInfo.Result().LongVal + (int)(nTime * 3);
}
private void SlowButton_CheckedChanged(object sender, EventArgs e)
{
nSpeed = -2;
}
private void FastButton_CheckedChanged(object sender, EventArgs e)
{
nSpeed = 2;
}
}
}
我刚刚发布了一篇文章,其中的代码示例显示了如何使用Deviare挂钩引擎执行此操作。示例代码仅适用于视频部分(不是音频),并且可用here。
答案 3 :(得分:0)
操作系统时间将是一件非常危险和愚蠢的事情 - 不仅会破坏用户模式的线程,从而对系统性能产生严重影响,而且还会破坏许多日志功能,甚至用户 - 控制KM驱动程序的模式反射器...这可能会导致系统崩溃和物理损害(!),因为现代硬件是可编程的,给定正确的(当然是专有的)一组函数调用等。我强烈建议不要重现这一点,即使是一些AV应用程序也会因为它的危险性而拦截它。加快或减慢视频速度的关键是让多媒体播放器相信您的电脑比实际更慢或更快
但是你有点幸运:内核使用自己的时间,与硬件同步,因此Windows本身可以在有限的时间内保持稳定。
我认为你应该回到绘图板,操纵操作系统的基本结构肯定不是实现目标的正确方法。