Данная тема является, в некотором роде, продолжением другой (http://pctuner.ru/forums-m-posts-p-60881.html#60881).
Я попытался написать фильтр, который стримит любой поток по HTTP. За основу я выбрал Dump фильтр из примера (DSNetwork не подошел, так как он мультикастовый, а мне нужен юникаст). Суть такая: каждый раз, когда вызывается метод входного пина Receive, данные из этого Receive-а я посылаю в специальную функцию, в которой использую WinSock API. Происходит следующее: запускаю граф и ввожу адрес его стрима в Internet Explorer, после чего, в браузере виден нескончаемый поток символов, то есть, поток благополучно течет по HTTP. Но когда я открываю адрес стрима в каком-нибудь плеере(например, WMP), плеер не может этот поток показать.
Я предполагаю, что дело в том, что я реализовал push модель передачи данных(данные после единичного запроса с клиента текут непрерывным потоком), а плееры пользуются pull моделью.
Подскажите, где можно взять исходники pull HTTP-сервера на WinSock API, или порекомендуйте иные возможные варианты.
Anton83,
Я думаю, что дело в том, что вы не передаёте информацию о типах потоков. Откуда плеер знает, что там идёт? Можно например при подключении к серверу сначала отдать клиенту информацию о потоках и формате каждого потока, после чего уже передавать данные. Или с каждым куском данных передавать заголовок с параметрами. Как это сделано в том же WMP - я не знаю, можно написать свой прокси и посмотреть, что там передаётся.
Или с каждым куском данных передавать заголовок с параметрами.:[/quote]
Я пробовал передавать MPEG TS а у него, вроде, все пакеты с хидерами.
[quote=Можно например при подключении к серверу сначала отдать клиенту информацию о потоках и формате каждого потока, после чего уже передавать данные.]
Вы имеете ввиду MIME Type, что то вроде video/x-ms-avi? Если можно, этот момент, пожалуйста, по подробнее. Какая информация о потоках, в каком виде, и т.д?
Anton83,
Не знаю, в каком виде нужна информация о потоках для WMP. Но нужно как-то сообщить плееру хотя бы media subtype, чтобы он мог подбирать декодеры для этого потока. Кроме того, для того чтобы декодер заработал, надо сообщить и другие параметры, который в direct show сидят в структуре AM_MEDIA_TYPE.
Чтобы работал mpeg2 ts надо всё-таки заранее договориться, что будет передаваться именно mpeg2 ts. Т.е. всё равно какая-то процедура передачи плееру информации о потоках нужна.
Я заметил такую вещь, что многим плеерам(VLC, например) достаточно перед, непосредственно, потоком отправить HTTP/1.0 200 OK, и все, и поток они будут понимать. Правда, есть "привередливые" плееры(WMP, например), которым этой строчки мало.
Еще такой общий вопрос: а где на ваш взгляд(Vlafy) можно почитать про структуру MPEG TS. Я понимаю, ресурсов много, но часто кажется, будто автор сам еле ориентируется в теме. Подскажите, пожалуйста, на ваш взгляд, наиболее понятный и полный ресурс.
Не могу точно сказать, где можно почитать, но найти можно.
Кстати, есть много разных мультимедиа программ для линукса, которые доступны в исходниках, можно там подсмотреть что именно хочет плеер на вход из сети. Исходники VLC для винды тоже доступны.