Серверная передача нескольких файлов flv с пользовательского веб-сервера при сохранении открытых сокетов останавливается после 6-го подключения

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

Сценарий

Я написал крошечный HTTP-сервер, обслуживающий файлы .flv; эти файлы FLV кодируются на месте. Файлы flv кодируются с помощью кодека экрана Adobe (я начал с libflv, но он был слишком глючным, поэтому в итоге я реализовал свой собственный кодировщик flv). Для проблемы, представленной ниже, не имеет значения, какой кодек я использую или использую ли я простые файлы flv вместо сгенерированных на месте (проблема также возникает, если я просто отправляю 12 файлов в кодировке h264). У меня также есть swf, который я закодировал в as3. As3 открывает 12 подключений к моему серверу, запрашивает 12 разных файлов FLV и просто отображает их как 12 разных видео на странице. Я протестировал настройку с помощью Firefox и Chrome и использую последнюю версию флеш-клиента (версия 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 действительно запрашивает файл crossdomain.xml, и в этом файле я все разрешаю. Во flash / CS4 я включил все настройки, которые позволяют swf выполнять свои сетевые функции.

Все работает нормально, за исключением того, что вспышка останавливается после 6-го flv. Если я закрою сокет после того, как отправлю пару кадров, тогда swf с радостью отобразит все 12. Но если я оставлю сокет открытым (в этом весь смысл, если я хочу продолжать обслуживание), он просто завершится после шести подключений к Netstream. Следовательно, он отправит на сервер 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 flv на порту 80 и еще 6 на порту 81 ... Я, вероятно, мог бы переписать свою реализацию, чтобы обслуживать разные портов, но это было бы проблемой (особенно учитывая, что у людей есть брандмауэры), и это просто не имеет смысла.

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

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


person Woporo    schedule 28.06.2010    source источник


Ответы (1)


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

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

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

person Marc Novakowski    schedule 29.06.2010