Проксирование видео локально с помощью сокета TCP - PullRequest
3 голосов
/ 05 апреля 2009

Мне очень интересно добавить поддержку видеоподкастов в Media Browser.

Я бы хотел, чтобы пользователи могли перемещаться по доступным видеоподкастам и транслировать их из интернета. Это действительно легко, потому что медиаплеер и т. Д. С удовольствием воспроизведет файл, который живет в облаке.

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

Итак ... Я подумал, почему бы не разместить HttpListener и, когда медиаплеер запрашивает биты файла, загрузить HttpListener и сохранить его локально. В следующий раз, когда пользователь воспроизводит файл, у нас уже будут локальные части файла.

Кто-нибудь знает пример кода, который использует HttpListener для прокси?

EDIT

Идея заключалась бы в том, чтобы проксировать простой потоковый контент, такой как MP3 или Mov. Щедрость перейдет к фактической реализации.

Вот API, который я хотел бы:

// will proxy a uri on the local port, if cacheFile exists it will resume the 
// download from cacheFile.
// while the file is downloading it will be name cacheFile.partial, after the 
// download is complete the file will be renamed to cacheFile.
// Example usage: ProxyFile("http://media.railscasts.com/videos/176_searchlogic.mov", 8000, @"c:\downloads\railscasts\176_searchlogic.mov")
//
// Directly after this call http://localhost:8000 will be the proxy stream, it will be playable locally. 
void ProxyUri(Uri uri, int port, string cacheFile) 

Редактировать 2

HttpListener выглядит довольно бесперспективно. Возможно, мне потребуется выполнить работу на уровне сокета TCP, поскольку HttpListener s, похоже, требует, чтобы программа запускалась от имени администратора, что будет очень сложно.

Ответы [ 3 ]

3 голосов
/ 28 августа 2009

Раньше я ничего не делал с HttpListener, поэтому я подумал, что это будет хорошее маленькое упражнение, чтобы быстро освоиться с ним - и это доказало. Я реализовал его как отдельный класс ProxyListener, конструктор которого принимает параметры указанной вами функции ProxyUri. Получив экземпляр, вы запускаете его прослушивание (и, возможно, загрузку), вызывая его метод Start. Когда вы закончите с этим, позвоните Cleanup.

Есть один или два грубых края, но в основном это работает согласно вашему вопросу. Чтобы проверить это, я создал его как консольное приложение с классом Program, который принимает входные строки, состоящие из (uri, port, filename), разделенных пробелами, создает экземпляры ProxyListener и запускает их. Вы можете запустить это консольное приложение, ввести подходящую строку, и загрузчик запустится (распечатка хода выполнения на консоль). Одновременно вы можете, например, запустите IE и загрузите файл с указанного порта, и вы сможете загрузить его, пока загрузчик все еще работает. Ход «загрузки» также будет выводиться на консоль.

У меня возникли некоторые проблемы с вставкой этого кода сюда, возможно, из-за размера (он не такой большой, но больше, чем фрагменты, которые вы обычно видите здесь - класс ProxyListener немного меньше 200 строк). Звучит интересно? Если это так, я отправлю его на страницу и добавлю ссылку.

Обновление: Опубликовано как gist .

Обратите внимание, что для запуска программы вам потребуются права администратора, поскольку HttpListener требует этого.

Обновление 2: При определенных обстоятельствах необязательно иметь права администратора для запуска HttpListener. См. эту ссылку и эту . Идея состоит в том, что если вы можете зарезервировать пространство имен URL во время установки, то пользователю не нужно иметь права администратора, если он прослушивает это пространство имен.

0 голосов
/ 24 августа 2009

Рассматривали ли вы использование HTTP-прокси с функциями кэширования?

Как:

См. Также Веб-кэш @ wikipedia

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

0 голосов
/ 05 апреля 2009

Потоковая передача не была предназначена для сохранения, а также эти протоколы очень индивидуальны и очень сложны для реализации, потоковые сеансы выполняют много проверок и синхронизаций, которые будет чрезвычайно трудно имитировать. Конечно, это не невыполнимая задача, но ее довольно большая задача. Только другой способ - прочитать и сохранить его как локальный файл мультимедиа и использовать его в качестве ссылки. Поскольку вы можете использовать кодировщик Windows Media для чтения потока и записи данных потока в качестве локального файла, но он все равно может не позволить вам делать данные, защищенные от копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...