Сервер нескольких файлов FLV с пользовательского веб-сервера при сохранении открытых сокетов останавливается после 6-го подключения - PullRequest
1 голос
/ 28 июня 2010

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

Сценарий

Я написал крошечный HTTP-сервер, который обслуживает файлы .flv; эти файлы FLV кодируются на месте. FLV-файлы кодируются с помощью экранного кодека Adobe (я начал с libflv, но это было слишком глючно, поэтому я в итоге реализовал свой собственный FLV-кодировщик). Для описанной ниже проблемы не имеет значения, какой кодек я использую или я использую простые файлы FLV вместо тех, которые генерируются на месте (проблема также возникает, если я просто отправляю 12 файлов в кодировке h264). У меня также есть SWF, который я закодировал в as3. As3 открывает 12 подключений к моему серверу и запрашивает 12 разных потоков и просто отображает их как 12 разных видео на странице. Я протестировал установку с Firefox и Chrome и использую последнюю версию Flash-клиента (версия 10). HTTP-сервер осуществляет потоковую передачу этих файлов; например он сообщает клиенту, что файл имеет тип mime video / x-flv, сообщает, что размер файла составляет 2 ГБ, и только начинает потоковую передачу. Для полноты вот заголовок, который он генерирует:

HTTP/1.1 200 OK
Content-Type: video/x-flv
Accept-Ranges: bytes
Content-Length: 2147483647
Date: Mon, 28 Jun 2010 12:53:09 GMT
Host: localhost
Keep-Alive: timeout=100000, max=100
Connection: Keep-Alive
Server: Foobar

Так что получается, что swf запрашивает flv, сервер получает запрос, начинает кодировать flv и начинает посылать этот поток через открытое соединение tcp. И клиент (браузер), и сервер работают на локальном хосте. Сервер также будет обслуживать содержимое crossdomain.xml (как для порта 843, как это нужно Adobe), так и для порта 80. Flash действительно запрашивает файл междомена, а в файле я разрешаю все. В flash / CS4 я включил все настройки, которые позволяют swf выполнять свои сетевые функции.

Это все работает нормально, за исключением того, что вспышка останавливается после 6-го flv Если я закрою сокет после того, как отправлю пару кадров, то SWF-файл с радостью отобразит все 12. Но если я оставлю сокет открытым (и в этом весь смысл, если я хочу продолжать обслуживание), он просто закроется после шести соединений Netstream. Ergo, он отправит 6 запросов на сервер и затем остановится. На стороне as3 я пробовал все виды вещей (используя один NetConnection, настраивая время буферизации), но, похоже, ничто не помогло.

Код as3 выглядит следующим образом:

var connection = new NetConnection();
connection.connect(null); 
var stream = new NetStream(connection);
var listener:Object = new Object();
listener.onMetaData = onMetaData;
listener.onCuePoint = onCuePoint;
// stream.checkPolicyFile=true;
stream.client = listener;
stream.bufferTime = 0; 
var video = new Video(640,480);
video.attachNetStream(stream);
// connection.maxPeerConnections = 32;
stream.play("http://localhost:80/" + n +".flv"); 

И я повторяю этот код 12 раз для генерации запросов.

Так что же дает; почему вспышка останавливается после 6-го подключения. Я целую неделю гуглял, пытаясь выяснить, есть ли у flash какой-либо максимум в сокетах, в NetConnections или NetStreams, но ни Adobe, ни кто-либо другой, кажется, нигде об этом не упоминают.

Еще одна странная вещь, которую я обнаружил, заключается в том, что 6 открытых соединений существуют только для каждого порта, поэтому я могу открыть 6 потоков на порт 80 и еще 6 на порт 81 ... Я мог бы переписать свою реализацию на обслуживать на разных портах, но это будет проблемой (особенно если учесть, что у людей есть брандмауэры), и это просто не имеет смысла.

Либо я делаю что-то не так в as3, либо у flash есть некоторые ограничения, о которых я не знаю, и это не задокументировано, или, возможно, в моих заголовках HTTP есть какая-то проблема.

Кто-нибудь понял, в чем может быть проблема? У меня действительно заканчиваются варианты, я возился с этим уже неделю, и это сводит меня с ума!

1 Ответ

1 голос
/ 29 июня 2010

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

Вы можете проверить эту теорию, увеличив максимальное количество подключений в Firefox, перейдя по URL-адресу конфигурации about:config и применив фильтр к файлу "network.http".Там должны быть некоторые настройки, такие как «network.http.max-persistent-connections-per-server», которые вы можете настроить.

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

...