Публикация потока из ffmpeg

Renat

New Member
Добрый день. Возникла необходимость публиковать поток из ffmpeg на WCS5, передавая при этом еще и объект custom. Насколько я понимаю, подключиться для такого стриминга можно только к приложению appKey = "flashStreamingApp". Сталкивались ли вы с такой задачей? Как правильно передать параметры подключения и объект custom из ffmpeg в WCS5?
 

Max

Administrator
Staff member
При коннекте к серверу из Flash AS3, custom-объект передается в параметрах NetConnection.connect()
code
Например
Code:
obj.custom = new Object();
obj.custom.token='123';
nc.connect(this.urlServer,obj);
Поэтому нужно смотреть как ffmpeg позволяет добавить параметры коннекта.
Например здесь показано как добавляются плоские параметры. Но эта информация может быть не актуальна.
Или здесь про передачу объектов.
Насколько я понимаю, подключиться для такого стриминга можно только к приложению appKey = "flashStreamingApp"
Да через flashStreamingApp
 

Ivan

Member
Отправляю поток из ffmpeg

Code:
ffmpeg -re -i /opt/vichatter-viplay/shared/htdocs/132.mp4 -f flv -rtmp_conn "O:1 NS:appKey:flashStreamingApp NS:name:12121212 NS:stream:12121212  NO:custom:O:1 NS:auth:22222222 NS:stream:3333333 O:0 O:0"  rtmp://fws.vichatter.com:1935/12121212

В этом случае в логах менеджера
Code:
04:13:27,189 INFO  agerRemoteRmiService - RMI TCP Connection(18557)-185.148.37.181 SEND REST OBJECT ==>
URL:http://localhost:9091/EchoApp/connect
OBJECT:
{
  "nodeId" : "dORxhMBSBhZlf1vylM6e8U7xZIj4eE3n@185.148.37.181",
  "appKey" : "flashStreamingApp",
  "sessionId" : "ae64984d-5f0c-44ba-b2bd-a71598de2c60",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "stream" : "12121212",
  "custom" : {
    "keys" : {
      "auth" : "java.lang.String",
      "stream" : "java.lang.String"
    },
    "data" : {
      "auth" : "22222222",
      "stream" : "3333333"
    }
  },
  "name" : "12121212"
}
Это выглядит совсем не так, как если отправлять потом из браузера и URL неверный
Подскажите, какие данные надо отправлять в объект коннекта из ffmpeg.
 

Ivan

Member
А в Серверном логе
Code:
04:13:27,069 INFO                     F - New I/O  worker #24 client part 1 validation success
04:13:27,074 INFO                     F - New I/O  worker #24 initialized encryption / decryption ciphers
04:13:27,176 INFO                     A - New I/O  worker #24 handshake done, rtmpe: false
04:13:27,177 INFO                     G - New I/O  worker #24 command - connect
04:13:27,177 INFO                     G - New I/O  worker #24 connect, client id: 276541107, application: [name: '' streams: {}]
name и stream пустые
 

Max

Administrator
Staff member
В серверном логе name относится к названию rtmp application и оно действительно пустое. Т.к. в пути rtmp://host:1935 нет application.
streams - это коллекция стримов и она тоже пустая, что корректно на момент коннекта. Поэтому с серверным логом все в порядке.
Подскажите, какие данные надо отправлять в объект коннекта из ffmpeg
Не занимались этим раньше, нужно тестировать.
Похоже вам все же удалось передать данные.
"data" : {
"auth" : "22222222",
"stream" : "3333333"
}
Если так, то вы можете передать любые данные, пусть даже в одной строке, а потом их распарсить.
 

Ivan

Member
Вот же адрес публикации: rtmp://fws.vichatter.com:1935/12121212
12121212 - это же и должно быть name?
 

Max

Administrator
Staff member
У нас в реализации RTMP не используются приложения. Поэтому все что за слэшем игнорируется. Поэтому в логе оно пустое.
 

Ivan

Member
При публикации потока из Браузера (defaultApp как я понимаю) стек вызовов из лога такой
URL:https://api.vichatter.com/external.flashphoner.serverIncoming/connect
URL:https://api.vichatter.com/external.flashphoner.serverIncoming/ConnectionStatusEvent
"status" : "ESTABLISHED",
URL:https://api.vichatter.com/external.flashphoner.serverIncoming/publishStream
"status" : "PENDING",
URL:https://api.vichatter.com/external.flashphoner.serverIncoming/StreamStatusEvent
"status" : "PUBLISHING",


А вот при отправке из ffmpeg на appKey:flashStreamingApp стек вызовов такой:
URL:https://api.vichatter.com/external.flashphoner.serverIncoming/connect
Code:
"nodeId" : "dORxhMBSBhZlf1vylM6e8U7xZIj4eE3n@185.148.37.181",
  "appKey" : "flashStreamingApp",
  "sessionId" : "16ba5260-c658-427c-996c-df34acedf074",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "stream" : "12121212",
  "custom" : {
    "keys" : {
      "auth" : "java.lang.String",
      "stream" : "java.lang.String"
    },
    "data" : {
      "auth" : "22222222",
      "stream" : "3333333"
    }
  },
  "name" : "12121212"
URL:https://api.vichatter.com/external.flashphoner.serverIncoming/StreamStatusEvent
Code:
"nodeId" : "dORxhMBSBhZlf1vylM6e8U7xZIj4eE3n@185.148.37.181",
  "appKey" : "flashStreamingApp",
  "sessionId" : "16ba5260-c658-427c-996c-df34acedf074",
  "mediaSessionId" : "702f6831-17b6-4bb7-92f8-3aae7993a241",
  "name" : "555555aaa",
  "published" : true,
  "hasVideo" : false,
  "hasAudio" : true,

  "status" : "PUBLISHING",
  "sdp" : "v=0\r\no=- 1988962254 1988962254 IN IP4 0.0.0.0\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=sdplang:en\r\nm=video 0 RTP/AVP 96\r\na=rtpmap:96 H264/90000\r\na=fmtp:96 profile-level-id=42e01f;packetization-mode=1\r\na=sendonly\r\nm=audio 0 RTP/AVP 97 8 0\r\na=rtpmap:97 SPEEX/16000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:0 PCMU/8000\r\na=sendonly\r\n",
  "record" : true,
  "recordName" : "stream-702f6831-17b6-4bb7-92f8-3aae7993a241-2te43uud5s943a5dmga3g61pou.mp4",
  "width" : 0,
  "height" : 0,
  "bitrate" : 0,
  "quality" : 0,
  "mediaProvider" : "Flash"
после коннекта сразу идёт какой-то запрос на запись
Code:
"record" : true,
  "recordName" : "stream-702f6831-17b6-4bb7-92f8-3aae7993a241-2te43uud5s943a5dmga3g61pou.mp4",
Так как во втором запросе не приходят данные auth и stream, то соответсвенно получаем отказ

Как добиться того что бы данные которые я добавил слались в каждом запросе и чтобы после connect был publishStream?
 

Ivan

Member
Кстати во втором запросе
"name" : "555555aaa",
как раз то, что я отправил после слеша из ffmpeg.
Причём переопределился относительно запроса connect
Code:
ffmpeg -re -i /opt/vichatter-viplay/shared/htdocs/132.mp4 -f flv -rtmp_conn "O:1 NS:appKey:flashStreamingApp NS:name:12121212 NS:stream:12121212  NO:custom:O:1 NS:auth:22222222 NS:stream:3333333 O:0 O:0"  rtmp://fws.vichatter.com:1935/application/555555aaa
 

Max

Administrator
Staff member
после коннекта сразу идёт какой-то запрос на запись
Это не запрос на запись. Показывает что стрим будет записан и в какой файл.
Так как во втором запросе не приходят данные auth и stream, то соответсвенно получаем отказ
custom - данные передаются в вызовах: connect, publishStream, playStream
в StreamStatusEvent эти данные не передаются, т.к. это событие генерируется на сервере.
Как добиться того что бы данные которые я добавил слались в каждом запросе и чтобы после connect был publishStream?
В каждом запросе они не будут посылаться.
В каждом запросе посылается один и тот же sessionId, который является уникалным и постоянным внутри коннекта:
Code:
"sessionId" : "16ba5260-c658-427c-996c-df34acedf074"
Нельзя сделать publish потока вне RTMP коннекта.
Поэтому нет смысла отправлять auth параметры внутри коннекта. Достаточно авторизовать сам коннект.
и чтобы после connect был publishStream?
flashStreamingApp реализует только connect метод.
Если его недостаточно, можете попробовать flashRoomApp зацепить на ваше API
Code:
update -l https://.. flashRoomApp
flashRoomApp реализует метод publishStream
Кстати во втором запросе
"name" : "555555aaa",
как раз то, что я отправил после слеша из ffmpeg.
Причём переопределился относительно запроса connect
В данном случае, похоже что правильно распарсилось имя стрима
Code:
rtmp://fws.vichatter.com:1935/application/555555aaa
application - RTMP приложение
555555aaa - stream name
 

Ivan

Member
У меня приложение с appKey = flashRoomApp имеет не уникальное название
Code:
admin chatRoomApp       roomApp           9  http://localhost:9091/RoomApp
admin flashChatApp      flashChatApp      6  http://localhost:9091/ChatApp
admin conferenceApp     conferenceApp     10 http://localhost:9091/ConferenceApp
admin defaultApp        defaultApp        1  https://api.vichatter.com/external.flashphoner.serverIncoming
admin flashStreamingApp flashStreamingApp 4  https://api.vichatter.com/external.flashphoner.serverIncoming
admin clickToCallApp    clickToCallApp    12 http://localhost:9091/ClickToCallApp
admin qaApp             qaApp             3  http://localhost:9091/QAApp
admin testApp           testAppKey        17 http://185.148.37.182:8000/index.php
admin chatRoomApp       flashRoomApp      5  http://localhost:9091/RoomApp
admin wcs3App           wcs3App           2  http://localhost:9091/EchoApp
admin websocketChatApp  websocketChatApp  7  http://localhost:9091/ChatApp
admin callApp           callApp           11 http://localhost:9091/CallApp
admin chatRoomApp       chatRoomApp       8  http://localhost:9091/ChatRoomApp
И из-а этого я не могу его обновить командой
Code:
update app -l "https://api.vichatter.com/external.flashphoner.serverIncoming" chatRoomApp
Его можно обновить по ID как-то?
 

Max

Administrator
Staff member
тогда лучше создать отдельный flashRoomApp2
Code:
add app flashRoomApp2 flashRoomApp2 https://...
и привязать к нему handlers, которые используются в flashRoomApp
Code:
show apps -d
update app -h
update app -c com.flashphoner.server.client.handler.wcs4.FlashStreamingCallbackHandler -m com.flashphoner.server.client.handler.wcs4.FlashRoomHandler flashRoomApp2
документация
 

Ivan

Member
Почему-то при отправке в это приложение вылетает ошибка:
Code:
av_interleaved_write_frame(): Broken pipe
    Last message repeated 1 times
[flv @ 0x36cf320] Failed to update header with correct duration.
[flv @ 0x36cf320] Failed to update header with correct filesize.
Error writing trailer of rtmp://fws.vichatter.com:1935/application/555555aaa: Broken pipeframe=    1 fps=0.0 q=1.6 Lsize=       6kB time=00:00:00.41 bitrate= 111.8kbits/s speed=0.865x
video:4kB audio:7kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!
при дургих appKey ошибок нет.

Детальное описание
Code:
admin com.flashphoner.server.client.handler.wcs4.FlashStreamingCallbackHandler flashRoomApp2     flashRoomApp2     null   18 https://api.vichatter.com/external.flashphoner.serverIncoming com.flashphoner.server.client.handler.wcs4.Flash
                                                                                                                                                                                           RoomHandler
 

Max

Administrator
Staff member
Проверим публикацию с ffmpeg у себя. По результатам отпишу.
 

Max

Administrator
Staff member
Скорее всего проблемы в кодеках. RTMP стрим должен идти с кодеками H.264 видео и AAC аудио. Возможно по-умолчанию идет FLV-кодек Sorenson Spark видео и Nelly Moser аудио, которые у нас не поддерживаются нормально.
При явном задании кодеков все работает корректно:
Code:
ffmpeg -re -i /tmp/VIDEO2findingnews.mp4 -acodec aac -vcodec libx264 -f flv -ar 44100 -rtmp_conn "O:1 NS:appKey:flashStreamingApp NS:name:12121212 NS:stream:12121212  NO:custom:O:1 NS:auth:22222222 NS:stream:3333333 O:0 O:0"  rtmp://192.168.33.200:1935/12121212
В том числе REST-нотификации ходят через flashStreamingApp для connect, publishStream, StreamStatusEvent
 

Ivan

Member
Как сделать так чтобы через через flashStreamingApp Отправлялся запрос publishStream?
И как сделать так что бы видео не записывалось, а шло только вещание?
 

Max

Administrator
Staff member
И как сделать так что бы видео не записывалось, а шло только вещание?
Нужно добавить настройку:
Code:
record_streams=false
в файл flashphoner.properties
Эта настройка требует перезагрузки сервера и применяется ко всем стримам: Flash и WebRTC.
В последних версиях сервера есть настройка:
Code:
record_flash_published_streams=false
Позволяющая включить/выключить запись потокв для Flash (RTMP).
Как сделать так чтобы через через flashStreamingApp Отправлялся запрос publishStream?
Мы проверили. Это работает в последней версии сервера. publishStream отправляется на REST.
Дайте номер вашей версии сервера. Проверим с вашей.
 

Ivan

Member
Обновление сервера командой
Code:
servicewebcallserver update
не работает?
Code:
service webcallserver check_update
Мне выдаёт You have latest version: 5.0.2019
 
Top