Как я могу захватить видео Youtube (Flash Player?), Чтобы замедлить воспроизведение?

Единственное хорошее программное обеспечение, которое я знаю, которое может замедлить и ускорить воспроизведение видео YouTube в любом браузере без его первой загрузки (потому что это было бы громоздким), Включить 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?..) и делает это для каждого процесса, указанного в ProgramToHook. Это то, чего я не понимаю. Какова концепция программного обеспечения MySpeed. Очевидно, что это что-то зацепило, но я не слишком разбираюсь в тонкостях Windows-крючков, поэтому я пришел спросить вас, эксперты. Я думаю, что если я смогу понять, как работает этот процесс hook, я могу сделать свою собственную версию программного обеспечения с помощью EasyHook, которая является фантастической библиотекой .NET для выполнения пользовательских режимов и режимов ядра.

Я подумал, что подключение к пользовательскому режиму Windows происходит примерно так. Вы выбираете одну функцию в одной DLL, и вы перехватываете эту функцию (a.k.a hook) за один процесс, который вы хотите. Если вы хотите подключить DLL к нескольким процессам, вам просто нужно повторить процедуру для каждого процесса.

И затем переключение режима ядра просто выбирает одну функцию в одной DLL и перехватывает эту функцию в каждом процессе, который ее вызывает (следовательно, в режиме ядра). Но, конечно, есть тонны способов зацепить; Я не слишком уверен в том, какая разница между этими двумя крючками и DLL-инъекцией.

Итак, я хочу знать, как работает MySpeed. Какова их концепция подключения? Если я могу это знать, я могу сделать такое программное обеспечение в .NET!

Спасибо заранее.

Ответы

Ответ 1

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

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

  • Используйте этот инструмент, чтобы проверить, что на самом деле происходит: http://www.nektra.com/products/deviare-api-hook-windows/
  • Узнайте, как спросить Flash Player о замедлении видео (возможно, в документах Flash API). Один простой подход может состоять в том, чтобы увидеть, что делает MySpeed ​​на самом деле с помощью инструмента API API Deviare.
  • Напишите программу, которая реплицирует эту процедуру. Он включает перехват сообщений, отправленных из одного дескриптора (iexplore.exe) в другой (flash.dll). Это не может быть сделано извне, это нужно сделать внутренне, поэтому это может помочь: http://www.codeproject.com/KB/threads/winspy.aspx

На крючках: http://msdn.microsoft.com/en-gb/library/ms644960.aspx

Я не думаю, что многие люди сделали это на С#, чтобы он мог предложить вызов. Я бы хотя бы интересовался прогрессом (препятствиями), если у вас есть блог или что-то, чтобы поделиться подробностями.:)

РЕДАКТИРОВАТЬ: программное обеспечение API API Deviare, похоже, не только отслеживает вызовы, но также позволяет вам перехватите их. Таким образом, это пакет "все-в-одном" для ваших нужд.:)
EDIT2: Релевантный вопрос: Как перехватить сообщения, отправляемые в окно?

Ответ 2

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

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

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

Ответ 3

Ключом к ускорению или замедлению видео является убеждение мультимедийных проигрывателей в том, что ваш компьютер работает медленнее или быстрее, чем есть на самом деле. Это может быть выполнено зацепление timeGetTime().

Это очень простой код С# для его выполнения:

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. Пример кода работает только с частью видео (не аудио), и он доступен здесь.

Ответ 4

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

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

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

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