【问题标题】:How Can I Hook a Youtube Video (Flash Player?) To Slow Down Playback?如何连接 Youtube 视频(Flash 播放器?)以减慢播放速度?
【发布时间】:2011-06-17 22:01:42
【问题描述】:

我所知道的唯一一个可以在任何浏览器中减速和加速播放 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 中选择一个函数,然后在您想要的一个进程中拦截该函数(也称为钩子)。如果您想在多个进程中挂钩 DLL,您只需为每个进程重复该过程即可。

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

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

提前致谢。

【问题讨论】:

  • +1 - 好问题;这对于可用性目的(第二语言,难以看/听)以及从音乐视频中学习乐器部分非常有用。
  • 是的。令人惊讶的是,除了 Enounce 的 MySpeed,实际上没有其他软件可以减慢或加速 YouTube 视频播放。

标签: c# windows dll hook flash


【解决方案1】:

加快或减慢视频速度的关键是让多媒体播放器相信您的计算机比实际速度慢或快

操纵系统时间将是一件非常危险和愚蠢的事情——你不仅会破坏用户模式线程片,从而对系统性能产生严重影响,而且还会破坏许多日志记录功能甚至用户——控制 KM 驱动程序的模式反射器......这可能会崩溃和物理伤害(!)您的系统,因为现代硬件是可编程的,给定正确的(当然是专有的)函数调用集等。我强烈建议不要复制它,因为它的危险性,即使是一些 AV 应用程序也会拦截它。

但你有点幸运:内核使用自己的时间,同步到硬件,因此 Windows 本身可以在有限的时间内保持稳定。

我认为你应该回到绘图板上,操纵操作系统的基本结构肯定不是实现目标的正确方法。

【讨论】:

  • 他提到了 Enounce MySpeed 并且他们这样做了,所以在这个问题的上下文中是一个正确的答案。您会惊讶于在 Windows 上运行的软件正在完成多少“愚蠢”的事情来完成某项任务。他们甚至被称为黑客!
  • 不可能没有帐户和大约 999999999999 internet-pointZ
  • 这根本没有任何意义。
【解决方案2】:

加快或减慢视频速度的关键是让多媒体播放器相信您的计算机比实际速度慢或快。这可以通过 hook 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 获取。

【讨论】:

  • 我只是从 github 编译代码,但我的应用程序崩溃了。我无法从 deviare 包中找到清单文件。也许这就是原因?
  • 请发送崩溃的详细信息。主要可能发生两件事:您需要下载 latsst deviare 版本,因为它非常更新,而且代码现在无法正常工作,因为 Flash 或 YouTube 的工作方式发生了一些变化。
  • 应用程序在开始时崩溃并显示消息“Deviare 测试已停止工作”。我注意到该指南需要一个名为 Devcom.x.manifest 的文件。我在我认为是最新版本的 DeviareV2 文件夹中找不到它。
  • 我运行了 speedtube 应用程序,但它根本不影响视频速度。也许 Flash 播放器已将 timeGetTime 的用法更改为其他内容?只是好奇,您是如何计算 Flash 播放器使用 timeGetTime 的?是通过反复试验吗?
  • @Mark 是的,我们认为 YouTube/Flash 改变了内部行为。解决方案是基于我们的直觉。如果将来有时间,我们会考虑为新版本做同样的事情。
【解决方案3】:

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

您所要做的就是在此处启用 html5 http://www.youtube.com/html5 不过,目前只有部分视频支持 html5 播放器。

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    我无法为您提供准确的解释,因为我不知道 API 调用或功能,但它是这样的: 您的应用程序会查找 iexplore.exe,它会在其中拦截对某些模块的调用。该模块主要是flash player。 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 software 似乎不仅可以监视呼叫,还可以让您拦截它们。因此,它是满足您需求的多合一包。 :)
    EDIT2: 相关问题:How do I intercept messages being sent to a window?

    【讨论】:

    • 感谢 Deviare,也许它是 EasyHook 的一个有趣的替代品。第二个链接对于快速进入新的学习海洋很有用。非常感谢您为回答这个老问题所做的努力,因此我将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    相关资源
    最近更新 更多