Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Заголовок (moov) должен всегда располагаться перед данными (mdat). Примерная структура файла должна быть такой:

Code Block
collapse
languageyml
themeRDarktrue
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
languagebash
themeRDark
AtomicParsley file.mp4 -T 1

При необходимости, структуру файла можно исправить при помощи ffmpeg без перекодирования

Code Block
languagebash
themeRDark
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

Code Block
languagejs
themeRDark
{
 "uri":"vod-live://sample.mp4",
 "localStreamName": "test"
}

409 - Conflict

500 - Internal error


Захватить поток из указанного файла


/vod/find
Code Block
languagejs
themeRDark
{
 "localStreamName": "test"
}
Code Block
languagejs
themeRDark
[
    {
        "localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
        "localStreamName": "test",
        "uri": "vod-live://sample.mp4",
        

...

"status": "PROCESSED_LOCAL",
   

...

 

...

 

...

 

...

 

...

 

...

"hasAudio": 

...

true,
        "hasVideo": true,
    

...

 

...

 

...

 

...

 

...

"record": 

...

false
  

...

 

...

 }
]

200 – потоки найдены

404 – потоки не найдены

Найти VOD-потоки по указанному критерию

/vod/find_all


Code Block
languagejs
themeRDark
[
    {
        "localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
    

...

 

...

 

...

 

...

 "localStreamName": 

...

"test",
        "uri": "vod-live://sample.mp4",
        "status": "PROCESSED_LOCAL",
   

...

 

...

 

...

 

...

 

...

 

...

"hasAudio": 

...

true,
 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

"hasVideo": 

...

true,
 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

Управление 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
languagejs
themeRDark
{
 "uri":"vod://sample.mp4"
 "localStreamName": "test"
}

409 - Conflict

500 - Internal error

Захватить поток из указанного файла

...

Code Block
languagejs
themeRDark
{
 "localStreamName": "test"

}

...

Code Block
languagejs
themeRDark
[
    {
        "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
languagejs
themeRDark
[
    {
        "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
languagejs
themeRDark
{
 "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 не поддерживаются декодером и будут игнорироваться при воспроизведении захваченного потока

...

"record": false
    }
]

200 – потоки найдены

404 – потоки не найдены

Найти все VOD-потоки

/vod/terminate

Code Block
languagejs
themeRDark
{
 "uri":"vod://sample.mp4",
 "localStreamName": "test"
}

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
themeRDark
vod_stream_timeout=60000

В этом случае, VOD поток останется опубликованным в течение 60 секунд.

Известные проблемы

1. AAC фреймы типа 0 не поддерживаются декодером на базе ffmpeg и будут игнорироваться при воспроизведении захваченного потока

Симптомы: предупреждения в клиентском логе:

Code Block
languagebash
themeRDark
10:13:06,815 WARN AAC - AudioProcessor-c6c22de8-a129-43b2-bf67-1f433a814ba9 Dropping AAC frame that starts with 0, 119056e500

Решение: переключиться на использование FDK AAC декодера

Code Block
themeRDark
use_fdk_aac=true

2. Файлы, содержащие B-фреймы, могут проигрываться неплавно, с фризами или артефактами

Симптомы: периодические фризы, артефакты при проигрывании файла через VOD, предупреждения в клиентском логе

Code Block
themeRDark
09:32:31,238 WARN 4BitstreamNormalizer - RTMP-pool-10-thread-5 It is B-frame!

Решение:  перекодировать файл таким образом, чтобы исключить B-фреймы, например

Code Block
languagebash
themeRDark
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
themeRDark
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
themeRDark
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
languagebash
themeRDark
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