Как воспроизводить видео с заданного времени

Serg

New Member
Прошу прощения, я не верно сформулировал вопрос. реалтайм видеопоток конечно же нельзя. Мне необходимо транслировать уже записанный mp4 файл с, определенным метками, отрезком времени без кеширования полностью видеофайла в браузере. Nginx так умеет с этим модулем https://nginx.org/ru/docs/http/ngx_http_mp4_module.html (выше описывал проблему почему перестало подходить это решение). Вы писали пару лет назад, что планируете добавить такой функционал.

Добрый день.
В текущей реализации все сделано в основном для real-time видеопотоков.
Работа с воспроизведением записе - VOD, реализована в базовом варианте для просмотра.
Т.е. начать с определенного момента не получится.
Варианты:
1. Переместить записанный mp4 файл в каталог web-сервера, например apache или nginx и далее использовать плеер и прогрессивную загрузку чтобы проиграть файл с определенного места.
2. Использовать другой медиасервер для воспроизведения записанных файлов.
Мы планируем добавить функцию просмотра заданного места, но в первых приоритетах ее нет.
 
Last edited:

Max

Administrator
Staff member
Мы создали тикет WCS-3054, о результатах сообщим здесь
В качестве альтернативы модулю nginx посмотрите модуль https://github.com/kaltura/nginx-vod-module, он поддерживает проигрывание фрагмента по меткам, но отдает HLS или DASH.
 

Max

Administrator
Staff member
Добрый день.
В сборке 5.2.894 добавлена возможность загрузки и воспроизведения указанного фрагмента файла. Для этого необходимо запросить файл с указанием начали и конца фрагмента в секундах
Code:
https://test.flashphoner.com:8444/client/records/stream.mp4?start=11&end=60
Подробнее читайте здесь
 

Serg

New Member
Коллеги, сервер обновил. Возможно нужно что-то включить в настройках, но в описании не нашел что именно. При попытке прослушивать с указанием метки времени происходит ошибка и в логах следующее:

версия java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)



PHP:
17:33:27,957 WARN                     A - HTTPS-pool-5-thread-2 Failed to cut /usr/local/FlashphonerWebCallServer/records//stream-00ff70d0-c4eb-11e9-a2ce-e349c2da1d4c-3iuhl9blrctgc2p3e5m7fbqbqu.mp4 in range from 5 to 10
java.lang.NullPointerException
 

Attachments

Last edited:

Max

Administrator
Staff member
Из документации

Ограничения
1. Загрузка и воспроизведение фрагментов поддерживается только для MP4 контейнера. При запросе webm файла запись всегда загружается полностью.
2. Загрузка и воспроизведение фрагментов не поддерживается для потоков только с аудио. Такие записи всегда загружаются полностью.
3. При указании времени начала фрагмента, воспроизведение может начаться чуть раньше, в зависимости от расположения ключевого фрейма в файле.
У вас в mp4 - только аудио. Поэтому нарезка работать не будет.
Но и ошибок не должно при этом быть. Проверим.

Попробуйте аудио+видео mp4 файл.
 

Serg

New Member
Жаль, что не будет. У меня на текущем проекте видео нет или в редких случаях, но проверю обязательно.

Возможно проблема в двойном слеше в пути (в логах)? ..../records//stream.....
 

Max

Administrator
Staff member
Жаль, что не будет. У меня на текущем проекте видео нет или в редких случаях, но проверю обязательно.
Создали тикет WCS-3069 по нарезке audio only записей.
Также проверили поведение сервера при попытке запросить фрагмент audio only потока. В наших тестах в логе выводится исключение
Code:
09:39:39,655 ERROR            MP4Parser - HTTPS-pool-5-thread-63 Failed to create MP4Cutter
java.lang.NullPointerException
...
но файл при этом загружается полностью и играет в браузере.
Если у вас в лог выводится другая ошибка и/или файл не загружается, предоставьте, пожалуйста, ссылки на примеры таких записей через эту форму (в разделе Comment), мы посмотрим, что с ними не так.
 

Serg

New Member
Создали тикет WCS-3069 по нарезке audio only записей.
Спасибо. Это очень пригодится. Однако это не совсем решает проблему и потребуется всё равно использовать сторонний модуль, чтобы проиграть файл у посетителя бес полного предварительного скачивания. Вот несколько моих пожеланий/хотелок:
1. фрагменты файлов mp4 хранить в отдельной папке. По сути это временные файлы, которые дублируют полный файл. Ими, если что, не жалко пожертвовать, т.к. по запросу они заново создадутся, соответственно для них другой план бэкапа. Когда все в одной папке - это раздувает её размер минимум в два раза.

2. добавить проигрывание файлов потоком без предварительного скачивания в кеш браузера.
 

Max

Administrator
Staff member
Мы проверили предоставленный пример файла. Похоже, в этом файле MP4 атом moov расположен не в начале. Установите на WCS настройку
Code:
mp4_container_moov_first=true
В этом случае при записи атом moov будет размещаться в начале файла.
Те файлы, которые записаны до изменения настройки, необходимо исправить при помощи ffmpeg
Code:
ffmpeg -i bad.mp4 -acodec copy -vcodec copy -movflags +faststart good.mp4
Для таких файлов нарезка фрагментов будет работать (а для audio only после выпуска WCS-3069).
Однако это не совсем решает проблему и потребуется всё равно использовать сторонний модуль, чтобы проиграть файл у посетителя бес полного предварительного скачивания.
Браузер никогда не играет файлы потоком, он всегда скачивает проигрываемые фрагменты (или HLS чанки). Наша реализация позволяет скачать только запрошенный фрагмент, но браузер будет его скачивать целиком.
Модуль nginx, который Вы использовали ранее, также под капотом использовал нарезку.
1. фрагменты файлов mp4 хранить в отдельной папке.
Создали тикет WCS-3071
2. добавить проигрывание файлов потоком без предварительного скачивания в кеш браузера
Это невозможно, см выше. Потоком можно играть только WebRTC, но в этом случае ни перемотка в браузере, ни нарезка фрагментов будут недоступны.
 

Max

Administrator
Staff member
Начиная со сборки 5.2.899, воспроизведение фрагментов поддерживается и для записей только с аудио.
 

Serg

New Member
Добрый день. Обновился для версии 5.2.899
Для таких файлов нарезка фрагментов будет работать (а для audio only после выпуска WCS-3069).
Конвертировал тестовый файл test111.mp4 в test222.mp4 как указано выше.

https://wcs.mythospro.ru:8444/client/records/test222.mp4 - воспроизводится
https://wcs.mythospro.ru:8444/client/records/test222.mp4?start=5&end=10 - создается файл test222-s5-e10.mp4, но в браузере не проигрывается
https://wcs.mythospro.ru:8444/client/records/test222-s5-e10.mp4 - тоже тишина

Точнее в firefox проигрывается, в опере, в vivaldi, в яндекс браузерах не проигрывается.

Конфиг:

#codecs
codecs =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,h264,vp8,flv,mpv
codecs_exclude_sip =mpeg4-generic,flv,mpv
codecs_exclude_streaming =flv,telephone-event
codecs_exclude_sip_rtmp =opus,g729,g722,mpeg4-generic,vp8,mpv

#########FIX##########
use_fdk_aac=false
######################
record_fdk_aac_bitrate_mode=5
######################

#websocket ports
ws.port =8080
wss.port =8443

#client_log_level=DEBUG

client_mode=false

rtc_ice_add_local_component=true

###FIX2####
mp4_container_moov_first=true
mp4_container_moov_first_reserve_space=true

 
Last edited:

Max

Administrator
Staff member
Создали тикет WCS-3076.
Уточните, пожалуйста, в свежих записях эта проблема воспроизводится? Если да, то нам потребуется доступ к Вашему серверу, чтобы воспроизвести проблему в Вашем окружении. Доступы можно отправить через эту форму.
use_fdk_aac=false
Возможно, проблема в этой настройке. Здесь написано, что воспроизведение записанных файлов с указанием определенного отрезка при помощи модуля nginx ngx_http_mp4_module возможно только при использовании переменного битрейта аудио. Но настройка record_fdk_aac_bitrate_mode=5, которая включает использование переменного битрейта, работает только при use_fdk_aac=true. Попробуйте включить использование FDK AAC, будет ли при этом воспроизводиться проблема для записей, сделанных с этой настройкой?
 

Serg

New Member
Добрый день, коллеги. После перезагрузки сервера записи стали проигрываться корректно. Единственное с указанием тайминга не проигрывается файл в среде линукс в браузере Opera.
Но меня волнует более серьёзная проблема. После обновления нагрузка на сервер выросла очень сильно. Прикрепляю скриншот когда идет всего два эфира и несколько человек (2-3) слушают. До обновления с меньшей нагрузкой шло одновременно до 40 эфиров!
Версия
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)

Это нормально или что-то не так?
 

Attachments

Max

Administrator
Staff member
Добрый день
openjdk version "1.8.0_282"
Проблема в сборке JDK 8, также проявляется на большинстве сборок JDK 11.
Возможно, обновление сервера совпало с обновлением сборки JDK. Рекомендуем обновить JDK до 12 или 14 по этой инструкции, пп 1-4.
 

Serg

New Member
Начиная со сборки 5.2.899, воспроизведение фрагментов поддерживается и для записей только с аудио.
Добрый день. У меня стоит задача: провести длинное интервью (пару часов) с ответами на множество вопросов (временные метки каждого вопроса известны). В процессе эфира интервью мне необходимо сохранять по событию (новый вопрос) файл с записью ответа на этот вопрос не прерывая эфир.
Два вопроса:
1. могу ли я не прерывая трансляцию сохранить запись? Могу ли я использовать временные метки начала и конца?
2. Если эфир прервался (отвалился интернет), есть ли возможность продолжить его? Если нет, то можно его как-то сохранить в mp4?
 

Max

Administrator
Staff member
Добрый день.
Два вопроса:
1. могу ли я не прерывая трансляцию сохранить запись? Могу ли я использовать временные метки начала и конца?
Запись сохраняется только при остановке публикации потока или при остановке записи по REST API. В Вашем случае можно сделать так:
1. Задать шаблон для имен файлов записей в виде
Code:
stream_record_policy_template={streamName}-{startTime}-{endTime}
чтобы получить уникальное имя каждого фрагмента. То же самое можно сделать и в REST API запросе при старте записи, чтобы, если речь идет только об одном потоке, не менять настройку для всех остальных
При этом в имени файла будут временные метки начала и окончания записи (время формирует браузер, который публикует поток)
2. Для записи ответа на вопрос, запускать запись потока по REST API
Code:
POST /rest-api/recorder/startup
Content-Type: application/json

{
 "mediaSessionId": "5a072377-73c1-4caf-abd3",
  "config": {
    "fileTemplate": "{streamName}-{startTime}-{endTime}"
  }
}
mediaSessionId можно определить для потока при помощи запроса /stream/find
Пример скрипта на bash для запуска записи потока (для разбора JSON используется утилита jq)
Bash:
#!/bin/bash

mediaId=`curl -s -H "Content-Type: application/json" -X POST http://localhost:8081/rest-api/stream/find --data "{\"name\":\"$1\",\"published\":true}" | jq '.[] | .mediaSessionId'`
postDataJson="{\"mediaSessionId\":$mediaId,\"config\":{\"fileTemplate\":\"{streamName}-{startTime}-{endTime\"}}"
curl -s -H "Content-Type: application/json" -X POST http://localhost:8081/rest-api/recorder/startup -d ${postDataJson} | jq
3. Для остановки записи по окончании ответа на вопрос, отправлять REST API запрос
Code:
POST /rest-api/recorder/terminate                             
Content-Type: application/json                      
                                                      
{
    "mediaSessionId": "5a072377-73c1-4caf-abd3"
}
Пример скрипта на bash для остановки записи
Bash:
#!/bin/bash

mediaId=`curl -s -H "Content-Type: application/json" -X POST http://localhost:8081/rest-api/stream/find --data "{\"name\":\"$1\",\"published\":true}" | jq '.[] | .mediaSessionId'`
postDataJson="{\"mediaSessionId\":$mediaId}"
curl -s -H "Content-Type: application/json" -X POST http://localhost:8081/rest-api/recorder/terminate -d ${postDataJson} | jq
Если процедура выглядит сложной, тогда только сохранять запись потока в один файл и потом нарезать его при помощи ffmpeg по известным временным меткам
2. Если эфир прервался (отвалился интернет), есть ли возможность продолжить его? Если нет, то можно его как-то сохранить в mp4?
При остановке публикации по любой причине (кроме остановки всего сервера), запись потока остановится, текущее содержимое будет сохранено в файл. При возобновлении публикации, начнется новая запись. Настройка имени файла, указанная выше, поможет в этом случае не переписать уже существующий файл, т.к. метки времени всегда уникальны.
 

Serg

New Member
Здравствуйте. Спасибо за ваши подробные и очень полезные ответы/советы. У нас появилась проблема с качеством потока с устройств Android с обновленного Chrome браузера, например такой юзерагент:
UserAgent:Mozilla/5.0 (Linux; Android 9; Redmi Note 8T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.86 Mobile Safari/537.36

Записи все хлюпают! Пример: https://wcs.mythospro.ru:8888/client/records/stream-vote-1abe49b1-3825053610083-3825053881113.mp4

Если формировать поток в firefox c мобильного, то проблемы такой нет.

Как можно решить эту проблему?
 
Last edited:

Max

Administrator
Staff member
К сожалению, проблема не воспроизводится при записи audio only потока на сборке сервера 5.2.912, публикация из Chrome 89.0.4389.90 (текущая версия из Google Play), устройства Nokia 5 (Android 9), Xiaomi Redmi 9 (Android 10). Запись играет без проблем как в браузере, так и в VLC.
Проверьте, пожалуйста, поможет ли обновление браузера и сервера.
Возможно также, у публикатора проблемы с каналом, такие искажения могут быть при потерях пакетов. В этом случае необходимо сменить канал (например, с мобильной сети 3G-4G на WiFi)
Если ничего не помогает и проблема продолжает воспроизводиться, предоставьте, пожалуйста, SSH доступы к серверу с помощью этой формы
 

Serg

New Member
Очень странная ситуация. Я тоже не смог воспроизвести ошибку с других устройств. Проблема проявляется на планшетах модели Galaxy Tab A SM-T515, Android 10, Chrome стоит 89.0.4389.90 и на телефоне заказчика Redmi Note 8T (закон подлости). Эти планшеты у нас закуплены для интервьюеров в большом количестве. Проблема на wifi, LTE, пробовал даже сбросить прошивку к заводским настройка. Честно говоря, даже не пойму как отловить эту ошибку, но она точно есть :(((( Вот запись после сброса прошивки https://wcs.mythospro.ru:8888/client/records/stream-vote-31ce628a-3825126821288-3825126845900.mp4 - также булькает и это точно не качество интернета, т.к. с firefox всё нормально.
 
Top