首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能钩一个Youtube视频(Flash播放器?)来减缓播放速度?

我怎样才能钩一个Youtube视频(Flash播放器?)来减缓播放速度?
EN

Stack Overflow用户
提问于 2011-01-29 22:48:30
回答 4查看 3.9K关注 0票数 17

我所知道的唯一好的软件是恩厄斯MySpeed,它可以在任何浏览器中减速和加速YouTube视频的播放,而无需首先下载它(因为这会很麻烦)。

不幸的是,这个软件不是免费的,我的试用版也用完了。我在玩它的注册表设置,注意到有几个键:

代码语言:javascript
运行
复制
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中选择一个函数,然后在所需的进程中拦截该函数(即钩子)。如果要将DLL挂接在多个进程中,则只需对每个进程重复该过程。

然后,内核模式挂钩就是在一个DLL中选择一个函数,并在调用它的每个进程(因此是内核模式)中拦截该函数。但是,当然有很多方法可以挂钩;我也不太确定这两个钩子和DLL注入之间有什么区别。

所以重点是,我想知道MySpeed是如何工作的。他们的挂钩概念是什么?如果我能知道这一点,那么我就可以在.NET中制作这样一个软件!

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-04 10:33:46

我无法为您提供一个准确的解释,因为我不知道API调用或能力,但是它是这样的:您的应用程序查找iexplore.exe,它在其中拦截对某些模块的调用。该模块主要是flash播放器。Flash支持更慢地播放视频,所以您可以修改来自iexplore.exe (网页上的JavaScript播放按钮)的调用,或者进行额外的调用来设置播放速度。

你需要做的是:

  • 使用此工具检查实际发生的情况:http://www.nektra.com/products/deviare-api-hook-windows/
  • 了解如何让Flash减慢视频速度(可能在Flash文档中)。一种简单的方法可以是查看MySpeed使用Deviare钩子工具实际上在做什么。
  • 编写一个复制此过程的程序。它涉及到拦截从一个句柄(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:相关问题:如何拦截发送到窗口的邮件?

票数 3
EN

Stack Overflow用户

发布于 2012-06-13 20:35:20

加快或减慢视频速度的关键是让多媒体播放器相信你的计算机比它的实际速度更慢或更快。这可以通过挂钩timeGetTime()来完成。

这是一个非常容易实现的C#代码:

代码语言:javascript
运行
复制
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挂钩引擎来实现这一点。示例代码仅适用于视频部分(而不是音频部分),并且它是可用的这里

票数 3
EN

Stack Overflow用户

发布于 2011-02-12 01:49:53

Youtube现在有一个带有播放速度控制的html5播放器。

不过,您所要做的就是在这里启用html5,http://www.youtube.com/html5中只有一些视频支持html5播放器。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4839940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档