AS3, NetConnection / NetStream: есть ли умный способ разделить исходный URL? - PullRequest
7 голосов
/ 22 ноября 2011

Проблема

Мне нужно заменить компонент mx: VideoDisplay в существующем проекте Flex на компонент, выполненный на заказ.

КомуДля этого я должен соответствовать его текущему интерфейсу, поэтому мой компонент получает URL-адреса видео (через параметр источника) в виде:

  1. / data / myflvfile.flv (если файл воспроизводится локально)
  2. rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv (если файл транслируется из Cloudfront)

Мой новый компонент основан на NetConnection и NetStream.Для любой из перечисленных выше записей мне нужно разделить входные данные на две строки: одну для метода NetConnection.connect (NetConnectionStr), а другую для метода NetStream.play (NetStreamStr).Например:

  1. Дано / data / myflvfile.flv затем:
    • NetConnectionStr = null
    • NetStreamStr = "/ data / myflvfile"
  2. Учитывая rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flvзатем:
    • NetConnectionStr = "rtmp: //streamcloud.myserver.com/cfx/st"
    • NetStreamStr = "somedirectory / myflvfile"
  3. С учетом rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv затем:
    • NetConnectionStr = "rtmp: //streamcloud.myserver.com/cfx/st"
    • NetStreamStr = "somedirectory / subdirectory / myflvfile"

Построение двух строк очень очевидно для случая «локальных файлов», но в других это становится сложнее.Проблема в том, что у меня нет умного способа угадать, какая часть ввода представляет собой URL-адрес сервера, а какая - имя потока + структура каталогов.

В некоторых примерах, найденных в Интернете, люди просто предполагают, чтопоследняя часть источника (то, что находится после последней найденной "/") - это имя NetStream.В моем случае это не всегда так, потому что потоки могут находиться в подкаталогах на сервере.Это еще хуже, потому что имена серверов могут содержать символы "/"!

Стратегии для ее решения

Подключение к серверу, получение его реального URL, поиск имени потока

As NetConnectionкажется достаточно «умным», моей первой попыткой было вызвать метод connect с полным URL-адресом источника.Например, для rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv

NetConnection успешно работает с:

  • connection.connect ( rtmp: //streamcloud.myserver.com/cfx/st/)
  • connection.connect ( rtmp: //streamcloud.myserver.com/cfx / st / somedirectory / )
  • ...
  • connection.connect ( rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv )

Тогда я надеялся как-то получить "реальный" URL-адрес сервера ( rtmp: //streamcloud.myserver.com/cfx/st) поэтому я смогу угадать часть потока ( somedirectory / subdirectory / myflvfile ).

К сожалению, я не нашел способа получить реальный адрес сервера из объекта NetConnection (connection.uri возвращает точные данные).Так что, похоже, это тупик.

Подключение к серверу, итеративное получение потоков

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

Дано rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv:

  • Попробуйте 1: stream.play ( myflvfile ) FAIL
  • Попробуйте 2: stream.play ( подкаталог)/ myflvfile ) FAIL
  • Попробуйте 3: stream.play ( somedirectory / subdirectory / myflvfile ) SUCCESS

Но это очень уродливый путь, и я ищу лучшее решение.

Лучшее решение?

Есть ли какой-нибудь хороший метод для решения этой проблемы?Кто-нибудь знает, как они это делают в оригинальном компоненте VideoDisplay (если он основан на объектах NetConnection / NetStream?)?

Заранее благодарен за любую помощь и / или комментарии по этому вопросу:)

Ответы [ 3 ]

0 голосов
/ 14 декабря 2011

Не протестировав решение с запущенным сервисом rtmp, трудно это доказать абсолютно, но рассмотрим следующее уточнение вашей второй, менее желательной стратегии:

  • создать NetConnection как обычно

  • в первый раз connect () успешен, переберите возможные комбинации службы и ресурса ("rtmp: //streamcloud.myserver.com/cfx/" & "/st/somedirectory/subdirectory/myflvfile.flv "и т. д.) и создайте параллельные NetStream для каждого из них - таким образом, вам не нужно ждать последовательного обнаружения

  • если один из NetStreams отправляет событие об успешном завершении, прикрепите его к дисплею и бросьте все остальные на пол (они, вероятно, все равно выйдут из строя)

  • при желании вы можете сохранить успешную пару сервис / актив, чтобы ускорить процесс повторного использования соединения

Кажется, это неприятная проблема!

0 голосов
/ 25 июля 2013

Я смущен вашим вопросом. Нет ли части вашего соединения с rtmp, которая бы соответствовала? Вы регулярно меняете потоковых провайдеров? Если это соответствует, то выигрывается, по крайней мере, половина сражения. То, как я подключаюсь к rtmp, всегда одинаково. Последняя часть является более динамичной, которая передается таким же образом; [пространство папок] / [название видео]. Я буду выполнять весь мой анализ только на том, что передано, но тогда у меня будет один поставщик rtmp.

0 голосов
/ 28 ноября 2011
var match:Array = path.match('rtmp://(.*/.*/.*/)');
var server:String = match[0];
var file:String = removeExtension(path.replace(match[1], ''));
var channel:String = removeExtension(path.replace(match[2], ''));

ref: http://onyx -vj.googlecode.com / svn / trunk / Onyx-VJ% 203.0.0 / OnyxCore / onyx / core / ProtocolRTMP.as

...