如何连接Youtube视频(Flash Player?)以减慢播放速度?

我所知道的唯一一款可以在任何浏览器中减速和加速播放YouTube视频的好软件,无需先下载(因为这很麻烦),是Enounce MySpeed。 不幸的是,这个软件不是免费的,我的试用版用完了。我正在玩它的注册表设置并注意到几个键:
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制作这样的软件! 提前致谢。     
已邀请:
我不能为您提供准确的解释,因为我不知道API调用或功能,但它是这样的: 你的应用程序寻找iexplore.exe,它拦截对某些模块的调用。该模块主要是flash播放器。 Flash支持播放视频较慢,因此您可以从iexplore.exe(网页上的JavaScript播放按钮)修改调用,或者进行额外调用以设置播放速度。 你需要做什么: 使用此工具检查实际发生的情况:http://www.nektra.com/products/deviare-api-hook-windows/ 了解如何让Flash Player减慢视频速度(可能在Flash API文档中)。一种简单的方法可能是使用Deviare API钩子工具查看MySpeed实际上在做什么。 编写一个复制此过程的程序。它涉及拦截从一个句柄(iexplore.exe)发送到另一个句柄(flash .dll)的消息。这不能在外部完成,必须在内部完成,所以这可能有所帮助:http://www.codeproject.com/KB/threads/winspy.aspx 挂钩:http://msdn.microsoft.com/en-gb/library/ms644960.aspx 我不认为很多人在C#中做过这个,所以它可以提供一个挑战。如果你有博客或其他东西可以分享血腥细节,我会对进展(障碍)感兴趣。 :) 编辑:Deviare API Hook软件似乎不仅可以监视调用,还可以拦截它们。所以它是一个一体化的包,满足您的需求。 :) EDIT2:相关问题:如何拦截发送到窗口的消息?     
Youtube现在有一个带回放速度控制的html5播放器。 您所要做的就是在http://www.youtube.com/html5上启用html5 但是,只有部分视频支持html5播放器。 希望这可以帮助。     
加速或减慢视频速度的关键是让多媒体播放器相信您的计算机比实际更慢或更快。这可以通过挂钩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挂钩引擎执行此操作。示例代码仅适用于视频部分(不是音频),可在此处获取。     
加速或减慢视频速度的关键是让多媒体播放器相信您的计算机比实际更慢或更快 操纵系统时间将是一件非常危险和愚蠢的事情 - 不仅会破坏用户模式的线程,从而对系统性能产生严重影响,而且还会破坏许多日志记录功能甚至是用户模式反射器控制KM驱动程序......这可能会导致系统崩溃和物理损坏(!),因为现代硬件是可编程的,给定正确的(当然是专有的)func-calls等集合。我强烈建议不要重现这一点,即使是一些AV应用程序也会因为它的危险性而拦截它。 但是你有点幸运:内核使用自己的时间,与硬件同步,因此Windows本身可以在有限的时间内保持稳定。 我认为你应该回到绘图板,操纵操作系统的基本结构当然不是实现目标的正确方法。     

要回复问题请先登录注册