Проблема
Мне нужно заменить компонент mx: VideoDisplay в существующем проекте Flex на компонент, выполненный на заказ.
КомуДля этого я должен соответствовать его текущему интерфейсу, поэтому мой компонент получает URL-адреса видео (через параметр источника) в виде:
- / data / myflvfile.flv (если файл воспроизводится локально)
- rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv (если файл транслируется из Cloudfront)
Мой новый компонент основан на NetConnection и NetStream.Для любой из перечисленных выше записей мне нужно разделить входные данные на две строки: одну для метода NetConnection.connect (NetConnectionStr), а другую для метода NetStream.play (NetStreamStr).Например:
- Дано / data / myflvfile.flv затем:
- NetConnectionStr = null
- NetStreamStr = "/ data / myflvfile"
- Учитывая rtmp: //streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flvзатем:
- NetConnectionStr = "rtmp: //streamcloud.myserver.com/cfx/st"
- NetStreamStr = "somedirectory / myflvfile"
- С учетом 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?)?
Заранее благодарен за любую помощь и / или комментарии по этому вопросу:)