...
Заголовок (moov) должен всегда располагаться перед данными (mdat). Примерная структура файла должна быть такой:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
Atom ftyp @ 0 of size: 32, ends @ 32 Atom moov @ 32 of size: 357961, ends @ 357993 ... Atom mvhdfree @ 40357993 of size: 1088, ends @ 148358001 Atom trakmdat @ 148358001 of size: 127708212741950, ends @ 127856 Atom tkhd @ 156 of size: 92, ends @ 248 Atom edts @ 248 of size: 48, ends @ 296 Atom elst @ 256 of size: 40, ends @ 296 Atom mdia @ 296 of size: 127560, ends @ 127856 Atom mdhd @ 304 of size: 32, ends @ 336 Atom hdlr @ 336 of size: 45, ends @ 381 Atom minf @ 381 of size: 127475, ends @ 127856 Atom vmhd @ 389 of size: 20, ends @ 409 Atom dinf @ 409 of size: 36, ends @ 445 Atom dref @ 417 of size: 28, ends @ 445 Atom url @ 433 of size: 12, ends @ 445 Atom stbl @ 445 of size: 127411, ends @ 127856 Atom stsd @ 453 of size: 171, ends @ 624 Atom avc1 @ 469 of size: 155, ends @ 624 Atom avcC @ 555 of size: 53, ends @ 608 Atom pasp @ 608 of size: 16, ends @ 624 ~ Atom stts @ 624 of size: 24, ends @ 648 Atom stss @ 648 of size: 568, ends @ 1216 Atom stsc @ 1216 of size: 28, ends @ 1244 Atom stsz @ 1244 of size: 63308, ends @ 64552 Atom stco @ 64552 of size: 63304, ends @ 127856 Atom trak @ 127856 of size: 230039, ends @ 357895 Atom tkhd @ 127864 of size: 92, ends @ 127956 Atom edts @ 127956 of size: 36, ends @ 127992 Atom elst @ 127964 of size: 28, ends @ 127992 Atom mdia @ 127992 of size: 229903, ends @ 357895 Atom mdhd @ 128000 of size: 32, ends @ 128032 Atom hdlr @ 128032 of size: 45, ends @ 128077 Atom minf @ 128077 of size: 229818, ends @ 357895 Atom smhd @ 128085 of size: 16, ends @ 128101 Atom dinf @ 128101 of size: 36, ends @ 128137 Atom dref @ 128109 of size: 28, ends @ 128137 Atom url @ 128125 of size: 12, ends @ 128137 Atom stbl @ 128137 of size: 229758, ends @ 357895 Atom stsd @ 128145 of size: 106, ends @ 128251 Atom mp4a @ 128161 of size: 90, ends @ 128251 Atom esds @ 128197 of size: 54, ends @ 128251 Atom stts @ 128251 of size: 32, ends @ 128283 Atom stsc @ 128283 of size: 47500, ends @ 175783 Atom stsz @ 175783 of size: 118804, ends @ 294587 Atom stco @ 294587 of size: 63308, ends @ 357895 Atom udta @ 357895 of size: 98, ends @ 357993 Atom meta @ 357903 of size: 90, ends @ 357993213099951 |
Проверить структуру файла можно при помощи утилиты AtomicParsley
Code Block | ||||
---|---|---|---|---|
| ||||
AtomicParsley file.mp4 -T 1 |
При необходимости, структуру файла можно исправить при помощи ffmpeg без перекодирования
Code Block | ||||
---|---|---|---|---|
| ||||
ffmpeg -i bad.mp4 -acodec copy -vcodec copy -movflags +faststart good.mp4 |
Управление VOD при помощи REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://test.flashphoner.com:8081/rest-api/vod/startup
- HTTPS: https://test.flashphoner.com:8444/rest-api/vod/startup
Здесь:
- test.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /vod/startup - используемый REST-метод
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/vod/startup |
| 409 - Conflict 500 - Internal error | Захватить поток из указанного файла | |||||||||||||
/vod/find |
|
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
| 200 – потоки найдены 404 – потоки не найдены | Найти VOD-потоки по указанному критерию | |||||||
/vod/find_all |
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
Управление VOD при помощи REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://test.flashphoner.com:8081/rest-api/vod/startup
- HTTPS: https://test.flashphoner.com:8444/rest-api/vod/startup
Здесь:
- test.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /vod/startup - используемый REST-метод
REST-методы и статусы ответа
...
REST-метод
...
Пример тела REST-запроса
...
Пример тела REST-ответа
...
Статусы ответа
...
Описание
...
/vod/startup
...
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri":"vod://sample.mp4"
"localStreamName": "test"
} |
409 - Conflict
500 - Internal error
Захватить поток из указанного файла
...
Code Block | ||||
---|---|---|---|---|
| ||||
{
"localStreamName": "test"
} |
...
Code Block | ||||
---|---|---|---|---|
| ||||
[
{
"localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
"localStreamName": "test",
"uri": "vod://sample.mp4",
"status": "PROCESSED_LOCAL",
"hasAudio": true,
"hasVideo": true,
"record": false
}
] |
...
200 – потоки найдены
404 – потоки не найдены
...
Найти VOD-потоки по указанному критерию
...
/vod/find_all
...
Code Block | ||||
---|---|---|---|---|
| ||||
[
{
"localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
"localStreamName": "test",
"uri": "vod://sample.mp4",
"status": "PROCESSED_LOCAL",
"hasAudio": true,
"hasVideo": true,
"record": false
}
] |
...
200 – потоки найдены
404 – потоки не найдены
...
Найти все VOD-потоки
...
/vod/terminate
...
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri":"vod://sample.mp4"
"localStreamName": "test"
} |
...
200 - поток завершен
404 - поток не найден
...
Завершить VOD-поток
Параметры
...
Имя параметра
...
Описание
...
Пример
...
uri
...
Имя файла для захвата потока
...
vod://sample.mp4
...
test
...
status
...
Текущий статус потока
...
PROCESSED_LOCAL
...
29ec3236-1093-42bb-88d6-d4ac37af3ac0
...
true
...
true
...
false
Известные проблемы
1) AAC фреймы типа 0 не поддерживаются декодером и будут игнорироваться при воспроизведении захваченного потока
...
| 200 – потоки найдены 404 – потоки не найдены | Найти все VOD-потоки | |||||||||
/vod/terminate |
| 200 - поток завершен 404 - поток не найден | Завершить VOD-поток |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
uri | Имя файла для захвата потока | vod://sample.mp4 |
localStreamName | Имя создаваемого потока | test |
status | Текущий статус потока | PROCESSED_LOCAL |
localMediaSessionId | Идентификатор медиасессии | 29ec3236-1093-42bb-88d6-d4ac37af3ac0 |
hasAudio | В потоке есть аудио | true |
hasVideo | В потоке есть видео | true |
record | Поток записывается | false |
Ограничения
Запрос /rest-api/vod/startup может применяться только для создания VOD live трансляций. При этом, запросы find, find_all и terminate могут быть применены как к VOD, так и к VOD live трансляциям.
Настройка продолжительности публикации VOD потока после отключения подписчиков
По умолчанию, VOD поток остается опубликованным на сервере в течение 30 секунд после отключения последнего подписчика, при условии, что продолжительность файла превышает этот интервал. Данное время может быть изменено при помощи настройки
Code Block | ||
---|---|---|
| ||
vod_stream_timeout=60000 |
В этом случае, VOD поток останется опубликованным в течение 60 секунд.
Известные проблемы
1. AAC фреймы типа 0 не поддерживаются декодером на базе ffmpeg и будут игнорироваться при воспроизведении захваченного потока
Симптомы: предупреждения в клиентском логе:
Code Block | ||||
---|---|---|---|---|
| ||||
10:13:06,815 WARN AAC - AudioProcessor-c6c22de8-a129-43b2-bf67-1f433a814ba9 Dropping AAC frame that starts with 0, 119056e500 |
Решение: переключиться на использование FDK AAC декодера
Code Block | ||
---|---|---|
| ||
use_fdk_aac=true |
2. Файлы, содержащие B-фреймы, могут проигрываться неплавно, с фризами или артефактами
Симптомы: периодические фризы, артефакты при проигрывании файла через VOD, предупреждения в клиентском логе
Code Block | ||
---|---|---|
| ||
09:32:31,238 WARN 4BitstreamNormalizer - RTMP-pool-10-thread-5 It is B-frame! |
Решение: перекодировать файл таким образом, чтобы исключить B-фреймы, например
Code Block | ||||
---|---|---|---|---|
| ||||
ffmpeg -i bad.mp4 -preset ultrafast -acodec copy -vcodec h264 -g 24 -bf 0 good.mp4 |
3. При захвате VOD из продолжительного файла процесс сервера может завершиться с Out of memory при превышении максимального числа областей виртуальной памяти (vm.max_map_count)
Симптомы: процесс сервера завершается; "Map failed" в серверном логе и в error*.log
Code Block | ||
---|---|---|
| ||
19:30:53,277 ERROR DefaultMp4SampleList - Thread-34 java.io.IOException: Map failed
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:940)
at com.googlecode.mp4parser.FileDataSourceImpl.map(FileDataSourceImpl.java:62)
at com.googlecode.mp4parser.BasicContainer.getByteBuffer(BasicContainer.java:223)
at com.googlecode.mp4parser.authoring.samples.DefaultMp4SampleList$SampleImpl.asByteBuffer(DefaultMp4SampleList.java:204)
at com.flashphoner.media.F.A.A.A$1.A(Unknown Source)
at com.flashphoner.media.M.B.C.D(Unknown Source)
at com.flashphoner.server.C.A.B.A(Unknown Source)
at com.flashphoner.server.C.A.B.C(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.OutOfMemoryError: Map failed
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:937)
... 8 more
|
Code Block | ||
---|---|---|
| ||
Event: 1743.157 Thread 0x00007fc480375000 Exception <a 'java/lang/OutOfMemoryError': Map failed> (0x00000000a1d750b0) thrown at [/HUDSON/workspace/8-2-build-linux-amd64/jdk8u161/10277/hotspot/src/share/vm/prims/jni.cpp, line 735] |
Решение: увеличить максимальное число областей виртуальной памяти
Code Block | ||||
---|---|---|---|---|
| ||||
10:13:06,815 WARN AAC - AudioProcessor-c6c22de8-a129-43b2-bf67-1f433a814ba9 Dropping AAC frame that starts with 0, 119056e500sysctl -w vm.max_map_count=262144 |