Как подключить видео с YouTube (Flash Player?) Для замедления воспроизведения? - PullRequest
16 голосов
/ 30 января 2011

Единственное известное мне хорошее программное обеспечение, которое может замедлять и ускорять воспроизведение видео 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!

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 04 февраля 2011

Я не могу дать вам точное объяснение, поскольку я не знаю вызовов API или возможностей, но это выглядит примерно так: Ваше приложение ищет iexplore.exe, где оно перехватывает вызовы определенных модулей. Модуль в основном флеш плеер. Flash поддерживает более медленное воспроизведение видео, поэтому вы изменяете вызов iexplore.exe (кнопка воспроизведения JavaScript на веб-странице) или делаете дополнительный вызов для установки скорости воспроизведения.

Что нужно сделать:

  • Используйте этот инструмент, чтобы проверить, что на самом деле происходит: http://www.nektra.com/products/deviare-api-hook-windows/
  • Узнайте, как попросить Flash Player замедлить видео (возможно, в документах по Flash API). Одним из простых подходов было бы посмотреть, что MySpeed ​​на самом деле делает, используя инструмент подключения Deviare API.
  • Напишите программу, которая копирует эту процедуру. Он включает перехват сообщений, отправляемых с одного дескриптора (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: Соответствующий вопрос: Как перехватить сообщения, отправляемые в окно?

2 голосов
/ 14 июня 2012

Ключ к ускорению или замедлению видео - убедить мультимедийные проигрыватели в том, что ваш компьютер работает медленнее или быстрее, чем он есть на самом деле.Это может быть выполнено, перехватывая 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 подсел двигатель.Пример кода работает только с видео (не аудио) и доступен здесь .

2 голосов
/ 12 февраля 2011

Youtube теперь имеет html5-плеер с контролем скорости воспроизведения.

Все, что вам нужно сделать, это включить html5 здесь http://www.youtube.com/html5 Однако, только некоторые видео поддерживают проигрыватель html5.

Надеюсь, это поможет.

0 голосов
/ 17 июня 2012

Ключ к ускорению или замедлению видео - убедить мультимедийные проигрыватели, что ваш компьютер работает медленнее или быстрее, чем на самом деле

манипулирование системным временем будет ОЧЕНЬ опасными идиотская вещь, которую нужно сделать - вы не только сломаете потоки в пользовательском режиме и, следовательно, окажете серьезное влияние на производительность системы, но вы также нарушите многие функции ведения журналов и даже отражатели пользовательского режима, которые управляют драйверами KM ... это можети сбой, и физический вред (!) вашей системы, потому что современное оборудование программируемо, учитывая правильный (и, разумеется, проприетарный) набор func-вызовов и тому подобное.Я настоятельно рекомендую НЕ воспроизводить это, даже несколько AV-приложений перехватят это из-за его опасного характера.

Но вам несколько повезло: ядро ​​использует свое время, синхронизированное с оборудованием, поэтому Windowsсам МОЖЕТ оставаться стабильным в течение ограниченного периода времени.

Я думаю, вам следует вернуться к чертежной доске, поскольку манипулирование основными структурами вашей операционной системы, безусловно, не является правильным способом достижения вашей цели.

...