Как я могу захватить видео 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-приложений перехватят это из-за его опасного характера.
Но вам повезло: ядро использует свое время, синхронизированное с оборудованием, поэтому сами окна МОГУТ оставаться стабильными в течение ограниченного времени.
Я думаю, вы должны вернуться к чертежной доске, манипулируя важными структурами вашей операционной системы, конечно, это не правильный путь для достижения вашей цели.