PDA

Просмотр полной версии : [red5] Кто-нибудь знает как сменить имя файла во время записи потока ?


djyamato
25.10.2013, 03:07
Здравствуйте
Нашел такое решение http://sziebert.net/posts/server-side-stream-recording-with-red5/
Но нерабочее (не получилось у меня)
Вместо запуска публикации на стороне AS (NetStream.publish("streamName","record")) с параметром "record" мне нужно файлы чтобы сохранялись не по имени потока, а с такими именами, которые я назначу в серверном скрипте.

Я публикую поток так

outStream.publish(publishStreamName,"live");


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

nc.call("streamManager.recordShow",null);



У него же код функции для записи потока такой

/**
* Start recording the publishing stream for the specified
* IConnection.
*
* @param conn
*/
public void recordShow(IConnection conn) {
log.debug("Recording show for: " + conn.getScope().getContextPath());
String streamName = String.valueOf(System.currentTimeMillis());
// Get a reference to the current broadcast stream.
ClientBroadcastStream stream = (ClientBroadcastStream) app.getBroadcastStream(conn.getScope(),"имя потока");
try {
// Save the stream to disk.
stream.saveAs(streamName, false);
} catch (Exception e) {
log.error("Error while saving stream: " + streamName, e);
}
}

а у меня stream равен null каста его к (ClientBroadcastStream)

ps кстати, нужно попробовать каст убрать

-------------------------------------------------------
Работает верно, нужно было nc.call("streamManager.recordShow",null); после NetStream.Publish.Start

$mival
10.11.2013, 18:59
не надо делать никаких nc.call
в Application переопределяем следущее
@Override
public void streamBroadcastStart(IBroadcastStream stream)
{
String file = stream.getPublishedName();
try {
stream.saveAs(file, false);
} catch (Exception e) {
logger.error("Error while saving stream: {}", stream.getPublishedName());
} finally {
super.streamPublishStart(stream);
}
}

А вот для именования юзаем streamFilenameGenerator (читай про DefaultStreamFilenameGenerator (http://dl.fancycode.com/red5/api/org/red5/server/stream/DefaultStreamFilenameGenerator.html))
для этого надо добавить его в red5-web.xml
<bean id="streamFilenameGenerator" class="StreamNameGenerator" />

вот моя реализация для сервера версии 1.0.0 (приложено), в этой вресии ред5 немного глючно генерятся папки если есть subscopes, поэтому StreamNameGenerator нужно было юзать обязательно иначе писало не туда и невозможно было прочитать потом записанный файл. А более поздние версии тупо не дописывают запись, файлы получаются битыми.
Сейчас юзая этот класс если ты конектишься например в your_app/scope123 то запись будет вестись в webapps/your_app/streams/scope123/mystream.flv
В 52ой строке я внешним классом приписываю таймштамп в конце имени, там надо подредактировать если нужно.

djyamato
10.11.2013, 21:38
Спасибо за совет, не заметил в доках этого по невнимательности.
P.S. Кстати, ты не сталкивался с проблемой для версий 1.0.. когда запись получалась битой. То есть, или звук не соответствует картинке или каринка после нескольких секунд записи вообще залипает.А бывало и такое - сервак просто несколько первых секунд записывал :) Причем, эти все симптомы я лечу одним способом - даунгрэйтом до 0.8. Может есть какие-либо более корректные способы ?

$mival
11.11.2013, 10:44
к счастью мне пока нужно писать только голос, из версий 1.Х это единственная которая дописывает файл до конца.