NetStream.publish Веб-камера для FMS работает в автономном плеере, но не в браузере

Я пытаюсь опубликовать видео с веб-камеры на Flash Media Server 2. Мой код работает в автономном проигрывателе Flash (проверено с 10.0 и 10.2), но не в плагине браузера (проверено с 10.2, как в IE, так и в Opera). Соединение с моей FMS работает успешно, но после публикации ничего не происходит, я никогда не получаю событие NetStream.Publish.Start.На сервере я вижу соединение в консоли управления, даже поток во вкладке потоков. Но я не могу подключиться к этому потоку.

Кто-нибудь знает, что может пойти не так?

NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0; // needed to get correct connection to FMS2

private function netStatusHandler(event:NetStatusEvent):void {
        output.appendText("\n" + event.info.code);
        switch (event.info.code) {
            case "NetConnection.Connect.Success":
                output.text = ("Connection successful, streaming camera...");
                connectCamera();
                break;
            case "NetConnection.Connect.Failed":

                break;
            case "NetStream.Play.StreamNotFound":
                break;

            case "NetStream.Publish.Start":
                output.appendText("\nPublishing video!");
                break;

        }
    }

    private function connectCamera(ev:Event = null):void {
        var stream:NetStream = new NetStream(connection);
        stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
        stream.attachCamera(camera);
        videoURL = createGUID();
        stream.publish(videoURL, "live");
        output.text = "publish stream...";
    }

person Malyngo    schedule 24.03.2011    source источник
comment
вы получаете какие-либо события состояния NetStream?   -  person www0z0k    schedule 24.03.2011
comment
Вы развертываете свое приложение на каком-то веб-сервере перед его тестированием или запускаете его прямо с диска?   -  person bmleite    schedule 25.03.2011
comment
Я попробовал это локально (открыв swf, встроенный в html-страницу, непосредственно из файловой системы), а также поместил его на веб-сервер. С того же веб-сервера я мог прекрасно подключаться к медиасерверу в предыдущих проектах, но это первый раз, когда я использую as3 для подключения к FMS2. При попытке из браузера, непосредственно с диска или с веб-сервера я не получаю никаких событий состояния NetStream, но я получаю их, как и ожидалось, в автономном проигрывателе.   -  person Malyngo    schedule 25.03.2011
comment
@Malyngo, я пытаюсь создать swf-издатель видео с веб-камеры во flash cs6, который будет выводить URL-адрес прямой трансляции, как в издателе red5, за исключением случаев, когда я могу лучше контролировать качество. Вы обрабатываете кодек, частоту кадров и т. д. во флэш-памяти или используете ffmpeg?   -  person cea    schedule 30.03.2014
comment
@cea, я думаю, тебе стоит начать с другого вопроса. При потоковой передаче на сервер Flash Media с веб-камеры это просто поток Flash Player на сервер Media Server, никаких других вещей (я даже не знаю, как это сделать). Для качества потоковой передачи есть несколько параметров, которые вы можете установить на своей веб-камере, не в последнюю очередь это убедиться, что вы используете кодек h264 для кодирования потока с веб-камеры (я думаю, он доступен с FP11). Все это можно сделать только с помощью Flash.   -  person Malyngo    schedule 31.03.2014
comment
Да, кодек важен - я стримлю на red5, потому что не использую на рабочем столе. Я не могу задать вопрос здесь, потому что меня навсегда забанили на форуме, потому что они не считают мои вопросы достаточно качественными.   -  person cea    schedule 31.03.2014


Ответы (1)


Хорошо, я нашел, в чем моя проблема: я объявляю ссылку на переменную stream внутри функции connectCamera:

private function connectCamera(ev:Event = null):void {
    var stream:NetStream = new NetStream(connection);
}

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

var stream:NetStream;
private function connectCamera(ev:Event = null):void {
    stream = new NetStream(connection);
}

Вы всегда должны объявлять вещи, которые вам понадобятся позже, как поле вашего класса, а не внутри функции. Вы просто никогда не знаете, когда GC может очистить этот материал.

person Malyngo    schedule 25.03.2011