Аналог record_filename_template для WebRTC-стримов

alexanderY

Member
Существует ли настройка, аналогичная record_filename_template?
Требуется в имени файла указывать таймштамп - когда начался стрим.
 

Max

Administrator
Staff member
Для имени файла записи есть только такая настройка:
Code:
stream_record_policy=streamName
Если ее включить, то имя файла будет совпадать с именем стрима.
Например
Для стрима stream1 будет stream1.mp4
При этом нужно следить за уникальностью имён, т.к. иначе будут коллизии.
Таймпстампы в имени не проставляются.
Требуется в имени файла указывать таймштамп - когда начался стрим.
Пока не понятно для чего это требуется и что считать началом стрима.
Можно считать началом, когда прошел сигналинг и статус переключился в PUBLISHING.
Можно считать началом первый байт видео, полученный сервером для этого стрима.
Можно считать первый полученный K-frame.
Т.е. зависит от целей и требуемой точности.
Проверьте дату / время записываемого файла. Время, когда файл открыли на запись и является началом стрима (один из вариантов).
 

alexanderY

Member
Пока не понятно для чего это требуется и что считать началом стрима.
Понимаю. Задача скорее всего не самая распространенная. Требуется вырезать из записи отрезок, зная дату и время начала и длительность. Т.е. отсечь лишнее. Грубо говоря, юзеры зашли в комнату, не одновременно. Прошло некоторое время, все подключились, протестировали (все друг друга видят и слышат). Нажали кнопку, и вот с этого момента нам потом нужно будет выделить запись. Т.е. дата-время в момент нажатия кнопки сохраняется. И уже после, во время постпроцессинга, нужно взять эту дату и отсечь всё, что было раньше.
Проверьте дату / время записываемого файла. Время, когда файл открыли на запись и является началом стрима (один из вариантов).
Насколько я знаю, в большинстве файловых систем не хранится дата создания файла. Да и вообще, если файл перемещается в другую директорию хуком on_record_hook.sh, вывод команды stat (к примеру) будет вот таким:
Code:
Access: 2017-03-09 08:00:42.529948900 +0000
Modify: 2017-03-09 08:00:42.534453600 +0000
Change: 2017-03-09 08:00:42.534453600 +0000
Это дата, когда файл был перемещен. Формально, можно отнять от этой даты длительность файла и получить дату старта записи. Но это если пренебречь временем, требуемым на перемещение файла. А если файл большой, то пренебрегать этим временем уже не очень здорово. Точность до миллисекунд не нужна, но мы хотим, чтобы в записи стримы юзеров были синхронизированы.

Я также рассматривал inotify-tools для отслеживания именно времени появления новых файлов в директории /usr/local/FlashphonerWebCallServer-5.0.2086/records, но, честно говоря, это решение мне кажется излишним нагромождением и дополнительной зависимостью, которой можно избежать.
 

alexanderY

Member
Дополнение. Даже если файл не перемещать хуком, после окончания записи всё равно stat выведет нечто подобное:
Code:
Access: 2017-03-09 10:24:04.968755845 +0000
Modify: 2017-03-09 10:24:04.964755832 +0000
Change: 2017-03-09 10:24:04.964755832 +0000
10:24:04 это время завершения записи, к сожалению. Команда stat корректно показывала дату создания файла, пока стрим шёл (в строке Access). Но как только стрим завершился, дата там обновилась.
 

Max

Administrator
Staff member
Посмотрим, что можно сделать. Скорее всего добавим templates для названий файлов. О прогрессе постараюсь сообщить на следующей неделе.
 

Max

Administrator
Staff member
Добавили настройки в сборке 2131
Чтобы настроить имена записываемых файлов, нужно добавить следующие настройки в flashphoner.properties
Code:
stream_record_policy=template
stream_record_policy_template={streamName}_{startTime}_{mediaSessionId}_{sessionId}_{audioCodec}_{videoCodec}_{login}
Билд собран, но не верифицирован QA.
 

alexanderY

Member
Дошли руки до этого функционала наконец. Пока что багов не заметил. Скоро мероприятие на ~десяток участников, там и проверим точнее.
 

Maksym

Member
Подскажите, если файл stream1.mp4 существует, то он будет перезаписан, если появится стрим с именем stream1.
Как указать WCS, что бы он его не перезаписывал, а создавал новый файл с префиксом?
Вариант
Code:
stream_record_policy=template
stream_record_policy_template={streamName}_{startTime}
пока подходит, так что это не критично
PS: Вариант дозаписи конечно шикарен, но думаю реализовать его будет довольно накладно
 
Last edited:

Max

Administrator
Staff member
Если файл существует, то он будет перезаписан.
Но если вы задали template, который позволяет делать ротацию и использовать уникальные имена стримов, то перезаписи не будет.
Вариант дозаписи конечно шикарен, но думаю реализовать его будет довольно накладно
Да, в реализации сейчас проще склеить позже, чем дозаписать.
 

Maksym

Member
Добрый день.
Небольшая трабла у нас.
В настройках стоит
Code:
stream_record_policy=template
stream_record_policy_template={streamName}**{startTime}
Но вот название файла, куда записывается стрим, не соответствует тому, что выводится по REST
Code:
{
    "nodeId": "DbnxXOHLUpHEaG895Za1A@127.0.0.1",
    "appKey": "defaultApp",
    "sessionId": "/xxx.xxx.xxx.xxx:19930/yyy.yyy.yyy.yyy4:8443",
    "mediaSessionId": "DDCFBAE2-B242-489C-9518-73BDBBA9C01E",
    "name": "-LD75XMaVJ6VE5eEWf_B",
    "published": true,
    "hasVideo": true,
    "hasAudio": true,
    "status": "PUBLISHING",
    "audioCodec": "opus",
    "videoCodec": "H264",
    "record": true,
    "recordName": "-LD75XMaVJ6VE5eEWf_B**1526996806584.mp4",
    "width": 0,
    "height": 0,
    "bitrate": 0,
    "minBitrate": 0,
    "maxBitrate": 0,
    "quality": 0,
    "createDate": 1526996806165,
    "mediaProvider": "WebRTC",
    "history": false,
    "custom": {
        "streamStatus": "publish",
        "authToken": "ios-test-token"
    },
    "origin": "https://my.site:8443/"
}
А вот файл, куда идет запись в ФС называется
-LD75XMaVJ6VE5eEWf_B**1526996806579.mp4

В чем может быть проблема?
 

Max

Administrator
Staff member
В чем несоответствие?
{streamName} = -LD75XMaVJ6VE5eEWf_B
{startTime} = 1526996806579
Шаблон {streamName}**{startTime}
Результат
Code:
-LD75XMaVJ6VE5eEWf_B**1526996806579.mp4
Выглядит все корректно.
Как должно быть правильно, на ваш взгляд?
 

Maksym

Member
В чем несоответствие?
{streamName} = -LD75XMaVJ6VE5eEWf_B
{startTime} = 1526996806579
Шаблон {streamName}**{startTime}
Результат
Code:
-LD75XMaVJ6VE5eEWf_B**1526996806579.mp4
Выглядит все корректно.
Как должно быть правильно, на ваш взгляд?
А где вы увидели что начало
Code:
{startTime} = 1526996806579
Я беру данные из поля
Code:
 "recordName": "-LD75XMaVJ6VE5eEWf_B**1526996806584.mp4",
а в ФС имя другое
-LD75XMaVJ6VE5eEWf_B**1526996806579.mp4
 

Max

Administrator
Staff member
Да, сейчас видно. Спасибо.
Разница в составляющей времени в миллисекундах.
 

Maksym

Member
Да, сейчас видно. Спасибо.
Разница в составляющей времени в миллисекундах.
Я заметил, что в 99% разница в 5 mc. Но это все равно много, так как если стрим начался записываться за 4 мс. до начала новой секунды, то в итоге, имя файла будет другоим
 
Top