Мне не удалось найти материалы о действительно RESTful streaming - кажется, что результаты в основном касаются делегирования потоковой передачи на другую услугу (что не является плохим решением). Поэтому я сделаю все возможное, чтобы справиться с этим сам - обратите внимание, что потоковая передача - это не мой домен, но я постараюсь добавить свои 2 цента.
В аспекте потоковой передачи, я думаю, что нам нужно разделить задачу на две независимые части:
- доступ к медиа-ресурсам (мета-данные)
- доступа к среде/Ручей себя (двоичные данные)
1.) Доступ к медиа-ресурсам
Это довольно просто и может быть обработано в чистых и RESTful образом. В качестве примера, давайте предположим, что мы будем иметь API XML на основе, что позволяет нам получить доступ к списку потоков:
GET /media/
<?xml version="1.0" encoding="UTF-8" ?>
<media-list uri="/media">
<media uri="/media/1" />
<media uri="/media/2" />
...
</media-list>
... а также отдельные потоки:
GET /media/1
<?xml version="1.0" encoding="UTF-8" ?>
<media uri="/media/1">
<id>1</id>
<title>Some video</title>
<stream>rtsp://example.com/media/1.3gp</stream>
</media>
2 .) Доступ к самому средству/потоку
Это более проблематичный бит. Вы уже указали один из вариантов в своем вопросе, и это означает, что доступ к кадрам осуществляется индивидуально через API RESTful. Хотя это может сработать, я согласен с вами в том, что это не жизнеспособный вариант.
Я думаю, что есть выбор должны быть заключено между:
- делегирования потоковой к выделенной службе по протоколу специализированных течений (например, RTSP)
- используя опции, доступные в HTTP
Я считаю, что первым был более эффективный выбор, хотя для него требуется выделенный потоковый сервис (и/или аппаратное обеспечение). Это может быть немного на грани того, что считается RESTful, однако обратите внимание, что наш API RESTful во всех аспектах и даже несмотря на то, что специализированная служба потоковой передачи не придерживается единого интерфейса (GET/POST/PUT/DELETE), наш API делает. Наш API позволяет нам правильно контролировать ресурсы и их метаданные через GET/POST/PUT/DELETE, и мы предоставляем ссылки на потоковое обслуживание (таким образом, придерживаясь аспекта связности REST).
Последний вариант - Потоковая передача по HTTP - возможно, не так эффективна, как указано выше, но это определенно возможно. Технически это не так уж и важно, чем предоставление доступа к любой форме двоичного контента через HTTP. В этом случае наш API будет предоставлять ссылку на двоичный ресурс доступным через HTTP, а также советует нам о размере ресурса:
GET /media/1
<?xml version="1.0" encoding="UTF-8" ?>
<media uri="/media/1">
<id>1</id>
<title>Some video</title>
<bytes>1048576</bytes>
<stream>/media/1.3gp</stream>
</media>
Клиент может получить доступ к ресурсу через HTTP с помощью GET /media/1.3gp
. Один из вариантов заключается в том, чтобы клиент загрузил весь ресурс - HTTP progressive download. Более простой альтернативой было бы для клиента получить доступ к ресурсу в кусках, используя HTTP Range headers. Для извлечения второго 256KB куска файла, который 1MB большой, запрос клиента будет выглядеть следующим образом:
GET /media/1.3gp
...
Range: bytes=131072-262143
...
Сервер, который поддерживает диапазоны затем реагировать с Content-Range header, с последующим частичным представлением ресурса :
HTTP/1.1 206 Partial content
...
Content-Range: bytes 131072-262143/1048576
Content-Length: 1048576
...
Обратите внимание, что наш API уже сообщил клиенту точный размер файла в байтах (1 МБ). В случае, когда клиент не знает размер ресурса, он должен сначала позвонить HEAD /media/1.3gp
, чтобы определить размер, иначе он рискует ответом сервера с 416 Requested Range Not Satisfiable
.
Вау ... это отличная информация. Вы обратили мое внимание на пару новых способов подумать об этом. Я также не знал о потоковом протоколе реального времени. – JnBrymn
Не проблема, я рада, что смогу помочь. Обратите внимание, однако, что у меня не было возможности работать с потоковыми протоколами лично (за исключением прогрессивной потоковой передачи по HTTP). Я выбрал RTSP как пример, я не могу сказать, может ли он быть полезным в вашем конкретном сценарии. Возможно, вы захотите задать другой вопрос о потоковых протоколах. Википедия также предлагает хорошую отправную точку для других протоколов - см. Разделы «Протоколы» и «См. Также» здесь: http://en.wikipedia.org/wiki/Streaming_Media – MicE