mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2025-12-04 06:35:58 -05:00
backend support for live stream (#59)
This is so far completely untested, for use by a new UI prototype. It creates a new URL endpoint which sends one video/mp4 media segment per key frame, with the dependent frames included. This means there will be about one key frame interval of latency (typically about a second). This seems hard to avoid, as mentioned in issue #59.
This commit is contained in:
@@ -338,6 +338,77 @@ recording segment for several reasons:
|
||||
A GET returns a `text/plain` debugging string for the `.mp4` generated by the
|
||||
same URL minus the `.txt` suffix.
|
||||
|
||||
### `/api/cameras/<uuid>/<stream>/live.m4s`
|
||||
|
||||
A GET returns a `multipart/mixed` sequence of parts. An extra top-level
|
||||
header, `X-Open-Id`, contains the `openId` which is assigned to all recordings
|
||||
in this live stream.
|
||||
|
||||
Each part is a `.mp4` media segment that starts with a key frame and contains
|
||||
all other frames which depend on that key frame. The following part headers
|
||||
will be included:
|
||||
|
||||
* `Content-Length`: as defined by HTTP
|
||||
* `Content-Type`: the MIME type, including `codecs` parameter.
|
||||
* `X-Recording-Id`: the ID of the recording these frames are contained in.
|
||||
* `X-Time-Range`: the relative start and end times of these frames within
|
||||
the recording, in the same format as `REL_START_TIME` and `REL_END_TIME`
|
||||
above.
|
||||
|
||||
Cameras are typically configured to have about one key frame per second, so
|
||||
there will be one part per second when the stream is working. If the stream is
|
||||
not connected, the HTTP GET request will wait until the stream is established,
|
||||
possibly forever.
|
||||
|
||||
Example request URI:
|
||||
|
||||
```
|
||||
/api/cameras/fd20f7a2-9d69-4cb3-94ed-d51a20c3edfe/main/live.m4s
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```
|
||||
Content-Type: multipart/mixed; boundary=B
|
||||
X-Open-Id: 42
|
||||
|
||||
--B
|
||||
Content-Length: 536445
|
||||
Content-Type: video/mp4; codecs="avc1.640028"
|
||||
X-Recording-Id: 5680
|
||||
X-Time-Range: 5220058-5400061
|
||||
X-Video-Sample-Entry-Sha1: 25fad1b92c344dadc0473a783dff957b0d7d56bb
|
||||
|
||||
binary mp4 data
|
||||
|
||||
--B
|
||||
Content-Length: 541118
|
||||
Content-Type: video/mp4; codecs="avc1.640028"
|
||||
X-Recording-Id: 5681
|
||||
X-Time-Range: 0-180002
|
||||
X-Video-Sample-Entry-Sha1: 25fad1b92c344dadc0473a783dff957b0d7d56bb
|
||||
|
||||
binary mp4 data
|
||||
|
||||
--B
|
||||
Content-Length: 539195
|
||||
Content-Type: video/mp4; codecs="avc1.640028"
|
||||
X-Recording-Id: 5681
|
||||
X-Time-Range: 180002-360004
|
||||
X-Video-Sample-Entry-Sha1: 25fad1b92c344dadc0473a783dff957b0d7d56bb
|
||||
|
||||
binary mp4 data
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
These segments are exactly the same as ones that can be retrieved at the
|
||||
following URLs, respectively:
|
||||
|
||||
* `/api/cameras/fd20f7a2-9d69-4cb3-94ed-d51a20c3edfe/main/view.m4s?s=5680@42.5220058-5400061`
|
||||
* `/api/cameras/fd20f7a2-9d69-4cb3-94ed-d51a20c3edfe/main/view.m4s?s=5681@42.0-180002`
|
||||
* `/api/cameras/fd20f7a2-9d69-4cb3-94ed-d51a20c3edfe/main/view.m4s?s=5681@42.180002-360004`
|
||||
|
||||
### `/api/init/<sha1>.mp4`
|
||||
|
||||
A GET returns a `.mp4` suitable for use as a [HTML5 Media Source Extensions
|
||||
|
||||
Reference in New Issue
Block a user