<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" lang = "en" >
< head >
< meta http-equiv = "Content-Style-Type" content = "text/css" / >
< meta http-equiv = "Content-type" content = "text/html; charset=utf-8" / >
< link rel = "stylesheet" href = "./robodoc.css" type = "text/css" / >
< title > ./streamsaver< / title >
<!-- Source: ./streamsaver -->
<!-- Generated with ROBODoc Version 4.99.41 (Jul 2 2011) -->
< / head >
< body >
< div id = "logo" >
< a name = "robo_top_of_doc" > < / a >
< / div > <!-- logo -->
< div id = "navigation" >
< a class = "menuitem" href = "./toc_index.html#top" > Table of Contents< / a >
< a class = "menuitem" href = "./robo_sourcefiles.html#top" > Sourcefiles< / a >
< a class = "menuitem" href = "./masterindex.html#top" > Index< / a >
< a class = "menuitem" href = "./robo_files.html#top" > Files< / a >
< a class = "menuitem" href = "./robo_functions.html#top" > Functions< / a >
< a class = "menuitem" href = "./tobo_toplevel.html#top" > Toplevel< / a >
< a class = "menuitem" href = "./robo_variables.html#top" > Variables< / a >
< / div > <!-- navigation -->
< div id = "content" >
< hr / >
< a name = "ffmpeg2fstreamsaver" > < / a >
< a name = "robo0" > < / a > < h2 > ffmpeg/streamsaver [ Files ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "./robo_files.html#robo_top_of_doc" > Files< / a > ]< / p >
< p class = "item_name" > NAME< / p >
< pre > < strong > streamsaver< / strong > - обработчик аудиопотоков с нарезкой их в файлы и
ретрансляцией на icecast
< / pre >
< p class = "item_name" > VERSION< / p >
< pre > 1.0
< / pre >
< p class = "item_name" > DESCRIPTION< / p >
< p > Сценарий принимает аудиопоток с оборудования, по UDP или TCP,
фрагментирует его на отрезки заданной длины для последующего хранения и
анализа, а также ретранслирует поток на сервер радиовещания icecast для
прослушивания аудио конечным пользователем.
< / p >
< p class = "item_name" > USAGE< / p >
< pre > < strong > streamsaver< / strong > < файл настроек>
< / pre >
< p class = "item_name" > ARGUMENTS< / p >
< ul > < li > < файл настроек> - xml-файл с описанием входящего и выходящего потоков и
правилами фрагментирования записей.
< / li >
< / ul >
< p > < / p >
< hr / >
< a name = "streamsaver2freadOption" > < / a >
< a name = "robo1" > < / a > < h2 > streamsaver/readOption [ Functions ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./robo_functions.html#robo_top_of_doc" > Functions< / a > ]< / p >
< p class = "item_name" > NAME< / p >
< pre > < strong > readOption< / strong > - получение значения опции из файла настроек
< / pre >
< p class = "item_name" > USAGE< / p >
< pre > < strong > readOption< / strong > < опция> < файл>
< / pre >
< p class = "item_name" > ARGUMENTS< / p >
< ul > < li > опция - имя опции
< / li >
< li > файл - xml-файл с настройками
< / li >
< / ul >
< p > < / p >
< p class = "item_name" > RESULT< / p >
< pre > Значение параметра при наличии искомой опции в xml-файле или значение по
умолчанию, которое задаётся при инициализации переменной < a href = "#robo5" > config< / a > .
< / pre >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 45 < / span > < strong > readOption< / strong > < span class = "sign" > (< / span > < span class = "sign" > )< / span > < span class = "keyword" > {< / span >
< span class = "line_number" > 46 < / span > cfg< span class = "sign" > =< / span > < span class = "sign" > $< / span > < span class = "sign" > (< / span > < span class = "sign" > \< / span > < span class = "keyword" > grep< / span > < span class = "sign" > -< / span > oPm1 < span class = "quote" > "(?< =< $1> )[^< ]+"< / span > < span class = "quote" > "$2"< / span > < span class = "sign" > )< / span >
< span class = "line_number" > 47 < / span >
< span class = "line_number" > 48 < / span > < span class = "keyword" > if< / span > < span class = "sign" > [< / span > < span class = "keyword" > !< / span > < span class = "sign" > -< / span > z < span class = "quote" > "$cfg"< / span > < span class = "sign" > ]< / span > < span class = "sign" > ;< / span > < span class = "keyword" > then< / span >
< span class = "line_number" > 49 < / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > < span class = "sign" > $< / span > 1< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "sign" > $< / span > cfg
< span class = "line_number" > 50 < / span > < span class = "keyword" > fi< / span >
< span class = "line_number" > 51 < / span > < span class = "keyword" > }< / span >
< / pre >
< hr / >
< a name = "streamsaver2fenableOption" > < / a >
< a name = "robo2" > < / a > < h2 > streamsaver/enableOption [ Functions ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./robo_functions.html#robo_top_of_doc" > Functions< / a > ]< / p >
< p class = "item_name" > NAME< / p >
< pre > < strong > enableOption< / strong > - добавление опции к команде ffmpeg
< / pre >
< p class = "item_name" > DESCRIPTION< / p >
< p > Процедура включает опцию, если в конфигурационном файле имеется
соответствующая настройка.
< / p >
< p class = "item_name" > USAGE< / p >
< pre > < strong > enableOption< / strong > < опция>
< / pre >
< p class = "item_name" > ARGUMENTS< / p >
< ul > < li > опция - имя опции из массива настроек < a href = "#robo5" > config< / a > .
< / li >
< / ul >
< p > < / p >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 71 < / span > < strong > enableOption< / strong > < span class = "sign" > (< / span > < span class = "sign" > )< / span > < span class = "keyword" > {< / span >
< span class = "line_number" > 72 < / span > < span class = "keyword" > if< / span > < span class = "sign" > [< / span > < span class = "keyword" > !< / span > < span class = "sign" > -< / span > z < span class = "quote" > "${< a href = "#robo5" > config< / a > [$1]}"< / span > < span class = "sign" > ]< / span > < span class = "sign" > ;< / span > < span class = "keyword" > then< / span >
< span class = "line_number" > 73 < / span > CMD< span class = "sign" > +< / span > < span class = "sign" > =< / span > < span class = "quote" > " $(echo $* | cut -d ' ' -f 2- | sed "< / span > s< span class = "sign" > |< / span > < span class = "sign" > %< / span > < span class = "sign" > %< / span > < span class = "sign" > |< / span > < span class = "sign" > \< / span > < span class = "sign" > "< / span > < span class = "sign" > $< / span > < span class = "sign" > {< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > < span class = "sign" > $< / span > 1< span class = "sign" > ]< / span > < span class = "keyword" > }< / span > < span class = "sign" > \< / span > < span class = "sign" > "< / span > < span class = "sign" > |< / span > g< span class = "quote" > ")"< / span >
< span class = "line_number" > 74 < / span > < span class = "keyword" > fi< / span >
< span class = "line_number" > 75 < / span > < span class = "keyword" > }< / span >
< / pre >
< hr / >
< a name = "streamsaver2freadXML" > < / a >
< a name = "robo3" > < / a > < h2 > streamsaver/readXML [ Functions ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./robo_functions.html#robo_top_of_doc" > Functions< / a > ]< / p >
< p class = "item_name" > NAME< / p >
< pre > < strong > readXML< / strong > - чтение файла настроек
< / pre >
< p class = "item_name" > DESCRIPTION< / p >
< p > Получение настроек из xml-файла.
< / p >
< p class = "item_name" > USAGE< / p >
< pre > < strong > readXML< / strong > < xml>
< / pre >
< p class = "item_name" > ARGUMENTS< / p >
< ul > < li > xml - файл настроек.
< / li >
< / ul >
< p > < / p >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 94 < / span > < strong > readXML< / strong > < span class = "sign" > (< / span > < span class = "sign" > )< / span > < span class = "keyword" > {< / span >
< span class = "line_number" > 95 < / span > < span class = "comment" > #Чтение настроек из файла< / span >
< span class = "line_number" > 96 < / span > < span class = "keyword" > for< / span > option < span class = "keyword" > in< / span > < span class = "sign" > $< / span > < span class = "keyword" > {< / span > < span class = "sign" > !< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > < span class = "sign" > *< / span > < span class = "sign" > ]< / span > < span class = "keyword" > }< / span > < span class = "sign" > ;< / span > < span class = "keyword" > {< / span >
< span class = "line_number" > 97 < / span > < a href = "#robo1" > readOption< / a > < span class = "quote" > "$option"< / span > < span class = "quote" > "$1"< / span >
< span class = "line_number" > 98 < / span > < span class = "keyword" > }< / span >
< span class = "line_number" > 99 < / span > < span class = "keyword" > }< / span >
< / pre >
< hr / >
< a name = "streamsaver2fmakeCMD" > < / a >
< a name = "robo4" > < / a > < h2 > streamsaver/makeCMD [ Functions ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./robo_functions.html#robo_top_of_doc" > Functions< / a > ]< / p >
< p class = "item_name" > NAME< / p >
< pre > < strong > makeCMD< / strong > - создание команды для оцифровки сигнала
< / pre >
< p class = "item_name" > DESCRIPTION< / p >
< p > Процедура составляет команду ffmpeg, включая опции, если они заданы в
конфигурационном файле или указаны значения по умолчанию в массиве
настроек < a href = "#robo5" > config< / a > .
< / p >
< p > Эталонные настройки ffmpeg
< / p >
< pre > ffmpeg -reconnect 1 \
\
-i "${< a href = "#robo5" > config< / a > [stream]}" \
-legacy_icecast 1 \
-content_type audio/mpeg \
-ice_name "Имя канала" \
-ice_description "Описание канала" \
icecast://source:${< a href = "#robo5" > config< / a > [password]}@${< a href = "#robo5" > config< / a > [icecast]}/${< a href = "#robo5" > config< / a > [mountpoint]} \
\
-segment_list "./files_archive.csv" \
-segment_list_entry_prefix "$ARCHIVE_DIR" \
-segment_list_type "csv" \
-segment_list_flags "live" \
-segment_atclocktime 1 \
-acodec "$FORMAT" -f segment \
-segment_time "$ARCHIVE_TIME" \
-segment_format "$FORMAT" \
-strftime 1 "$ARCHIVE_DIR/$FILE_NAME"
\
-segment_list "./files_slices.csv" \
-segment_list_entry_prefix "$ARCHIVE_DIR" \
-segment_list_type "csv" \
-segment_list_flags "live" \
-segment_atclocktime 1 \
-acodec "$FORMAT" -f segment \
-segment_time "$SLICES_TIME" \
-segment_format "$FORMAT" \
-strftime 1 "$SLICES_DIR/$FILE_NAME"
< / pre >
< p >
Пример иерархии файлового хранилища:
< / p >
< pre > FILES
├── archive
│ ├── TK04
│ │ └── CH4098
│ │ └── 2016-07-12_13:41:47-TK#4-4098.mp2
│ ├── TK05
│ │ └── CH4098
│ │ └── 2016-07-12_13:41:45-TK#5-4098.mp2
│ └── TK06
│ └── CH53
│ └── 2016-07-12_13:41:49-TK#6-53.mp2
└── fragments
├── TK04
│ └── CH4098
│ ├── 2016-07-12_13:41:47-TK#4-4098.mp2
│ └── 2016-07-12_13:41:50-TK#4-4098.mp2
├── TK05
│ └── CH4098
│ ├── 2016-07-12_13:41:45-TK#5-4098.mp2
│ └── 2016-07-12_13:41:50-TK#5-4098.mp2
└── TK06
└── CH53
└── 2016-07-12_13:41:49-TK#6-53.mp2
< / pre >
< p > < / p >
< p class = "item_name" > RESULT< / p >
< pre > Команда ffmpeg, которую можно передать на выполнение.
< / pre >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 173 < / span > < strong > makeCMD< / strong > < span class = "sign" > (< / span > < span class = "sign" > )< / span > < span class = "keyword" > {< / span >
< span class = "line_number" > 174 < / span > < span class = "comment" > #Правило именования файлов< / span >
< span class = "line_number" > 175 < / span > FILE_NAME< span class = "sign" > =< / span > < span class = "quote" > "${< a href = "#robo5" > config< / a > [filename_prefix]}-${< a href = "#robo5" > config< / a > [channel_name]}-${< a href = "#robo5" > config< / a > [channel_number]}.${< a href = "#robo5" > config< / a > [filename_suffix]}"< / span >
< span class = "line_number" > 176 < / span >
< span class = "line_number" > 177 < / span > < span class = "comment" > #Минимальная команда< / span >
< span class = "line_number" > 178 < / span > CMD< span class = "sign" > =< / span > < span class = "quote" > "${< a href = "#robo5" > config< / a > [cmd]} -i ${< a href = "#robo5" > config< / a > [stream]} -f ${< a href = "#robo5" > config< / a > [output_format]}"< / span >
< span class = "line_number" > 179 < / span >
< span class = "line_number" > 180 < / span > < span class = "comment" > #КОДИРОВАНИЕ< / span >
< span class = "line_number" > 181 < / span > < span class = "comment" > # < a href = "#robo2" > enableOption< / a > output_format -c %%< / span >
< span class = "line_number" > 182 < / span >
< span class = "line_number" > 183 < / span > < span class = "comment" > #ICECAST< / span >
< span class = "line_number" > 184 < / span > < a href = "#robo2" > enableOption< / a > input_channel < span class = "sign" > -< / span > map 0< span class = "sign" > :< / span > < span class = "sign" > %< / span > < span class = "sign" > %< / span >
< span class = "line_number" > 185 < / span > < a href = "#robo2" > enableOption< / a > channel_name < span class = "sign" > \< / span >
< span class = "line_number" > 186 < / span > < span class = "sign" > -< / span > legacy_icecast 1 < span class = "sign" > \< / span >
< span class = "line_number" > 187 < / span > < span class = "sign" > -< / span > content_type audio< span class = "sign" > /< / span > mpeg < span class = "sign" > \< / span >
< span class = "line_number" > 188 < / span > < span class = "sign" > -< / span > ice_name < span class = "sign" > %< / span > < span class = "sign" > %< / span >
< span class = "line_number" > 189 < / span >
< span class = "line_number" > 190 < / span > < a href = "#robo2" > enableOption< / a > channel_descr < span class = "sign" > \< / span >
< span class = "line_number" > 191 < / span > < span class = "sign" > -< / span > ice_description < span class = "sign" > %< / span > < span class = "sign" > %< / span >
< span class = "line_number" > 192 < / span >
< span class = "line_number" > 193 < / span > < a href = "#robo2" > enableOption< / a > icecast < span class = "sign" > \< / span >
< span class = "line_number" > 194 < / span > icecast< span class = "sign" > :< / span > < span class = "sign" > /< / span > < span class = "sign" > /< / span > source< span class = "sign" > :< / span > < span class = "sign" > $< / span > < span class = "sign" > {< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > password< span class = "sign" > ]< / span > < span class = "keyword" > }< / span > < span class = "sign" > @< / span > < span class = "sign" > $< / span > < span class = "sign" > {< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > icecast< span class = "sign" > ]< / span > < span class = "keyword" > }< / span > < span class = "sign" > /< / span > < span class = "sign" > $< / span > < span class = "sign" > {< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > mountpoint< span class = "sign" > ]< / span > < span class = "keyword" > }< / span >
< span class = "line_number" > 195 < / span >
< span class = "line_number" > 196 < / span > < span class = "comment" > # АРХИВ< / span >
< span class = "line_number" > 197 < / span > < a href = "#robo2" > enableOption< / a > input_channel < span class = "sign" > -< / span > map 0< span class = "sign" > :< / span > < span class = "sign" > %< / span > < span class = "sign" > %< / span >
< span class = "line_number" > 198 < / span > < a href = "#robo2" > enableOption< / a > archive_log < span class = "sign" > \< / span >
< span class = "line_number" > 199 < / span > < span class = "sign" > -< / span > segment_list < span class = "sign" > %< / span > < span class = "sign" > %< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 200 < / span > < span class = "sign" > -< / span > segment_list_entry_prefix < span class = "quote" > "${< a href = "#robo5" > config< / a > [archive_dir]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 201 < / span > < span class = "sign" > -< / span > segment_list_type csv < span class = "sign" > \< / span >
< span class = "line_number" > 202 < / span > < span class = "sign" > -< / span > segment_list_flags live
< span class = "line_number" > 203 < / span >
< span class = "line_number" > 204 < / span > < span class = "comment" > # +СЕГМЕНТИРОВАНИЕ< / span >
< span class = "line_number" > 205 < / span > < a href = "#robo2" > enableOption< / a > archive_dir < span class = "sign" > \< / span >
< span class = "line_number" > 206 < / span > < span class = "sign" > -< / span > segment_atclocktime 1 < span class = "sign" > \< / span >
< span class = "line_number" > 207 < / span > < span class = "sign" > -< / span > acodec < span class = "quote" > "${< a href = "#robo5" > config< / a > [output_format]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 208 < / span > < span class = "sign" > -< / span > < span class = "keyword" > fi< / span > segment < span class = "sign" > \< / span >
< span class = "line_number" > 209 < / span > < span class = "sign" > -< / span > segment_time < span class = "quote" > "${< a href = "#robo5" > config< / a > [archive_time]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 210 < / span > < span class = "sign" > -< / span > segment_format < span class = "quote" > "${< a href = "#robo5" > config< / a > [output_format]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 211 < / span > < span class = "sign" > -< / span > strftime 1 < span class = "quote" > "${< a href = "#robo5" > config< / a > [archive_dir]}/$FILE_NAME"< / span >
< span class = "line_number" > 212 < / span >
< span class = "line_number" > 213 < / span > < span class = "comment" > # АНАЛИЗ< / span >
< span class = "line_number" > 214 < / span > < a href = "#robo2" > enableOption< / a > input_channel < span class = "sign" > -< / span > map 0< span class = "sign" > :< / span > < span class = "sign" > %< / span > < span class = "sign" > %< / span >
< span class = "line_number" > 215 < / span > < a href = "#robo2" > enableOption< / a > slices_log < span class = "sign" > \< / span >
< span class = "line_number" > 216 < / span > < span class = "sign" > -< / span > segment_list < span class = "sign" > %< / span > < span class = "sign" > %< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 217 < / span > < span class = "sign" > -< / span > segment_list_entry_prefix < span class = "quote" > "${< a href = "#robo5" > config< / a > [slices_dir]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 218 < / span > < span class = "sign" > -< / span > segment_list_type csv < span class = "sign" > \< / span >
< span class = "line_number" > 219 < / span > < span class = "sign" > -< / span > segment_list_flags live
< span class = "line_number" > 220 < / span >
< span class = "line_number" > 221 < / span > < span class = "comment" > # +СЕГМЕНТИРОВАНИЕ< / span >
< span class = "line_number" > 222 < / span > < a href = "#robo2" > enableOption< / a > slices_dir < span class = "sign" > \< / span >
< span class = "line_number" > 223 < / span > < span class = "sign" > -< / span > segment_atclocktime 1 < span class = "sign" > \< / span >
< span class = "line_number" > 224 < / span > < span class = "sign" > -< / span > acodec < span class = "quote" > "${< a href = "#robo5" > config< / a > [output_format]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 225 < / span > < span class = "sign" > -< / span > < span class = "keyword" > fi< / span > segment < span class = "sign" > \< / span >
< span class = "line_number" > 226 < / span > < span class = "sign" > -< / span > segment_time < span class = "quote" > "${< a href = "#robo5" > config< / a > [slices_time]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 227 < / span > < span class = "sign" > -< / span > segment_format < span class = "quote" > "${< a href = "#robo5" > config< / a > [output_format]}"< / span > < span class = "sign" > \< / span >
< span class = "line_number" > 228 < / span > < span class = "sign" > -< / span > strftime 1 < span class = "quote" > "${< a href = "#robo5" > config< / a > [slices_dir]}/$FILE_NAME"< / span >
< span class = "line_number" > 229 < / span >
< span class = "line_number" > 230 < / span > < span class = "keyword" > echo< / span > < span class = "quote" > "$CMD"< / span >
< span class = "line_number" > 231 < / span > < span class = "keyword" > }< / span >
< / pre >
< hr / >
< a name = "streamsaver2fconfig" > < / a >
< a name = "robo5" > < / a > < h2 > streamsaver/config [ Variables ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./robo_variables.html#robo_top_of_doc" > Variables< / a > ]< / p >
< p class = "item_name" > VARIABLE< / p >
< pre > < strong > config< / strong > - массив настроек, содержащий значения по-умолчанию.
Настройки описаны в секции < a href = "#robo6" > SETTINGS< / a > .
< / pre >
< p class = "item_name" > USED BY< / p >
< pre > < a href = "#robo2" > enableOption< / a > , < a href = "#robo1" > readOption< / a > , < a href = "#robo3" > readXML< / a > , < a href = "#robo4" > makeCMD< / a >
< / pre >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 247 < / span > < span class = "keyword" > typeset< / span > < span class = "sign" > -< / span > A < strong > config< / strong >
< span class = "line_number" > 248 < / span >
< span class = "line_number" > 249 < / span > < strong > config< / strong > < span class = "sign" > =< / span > < span class = "sign" > (< / span >
< span class = "line_number" > 250 < / span > < span class = "sign" > [< / span > stream< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 251 < / span > < span class = "sign" > [< / span > icecast< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "http://localhost:8000/"< / span >
< span class = "line_number" > 252 < / span > < span class = "sign" > [< / span > password< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "hackme"< / span >
< span class = "line_number" > 253 < / span > < span class = "sign" > [< / span > channel_name< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 254 < / span > < span class = "sign" > [< / span > channel_number< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 255 < / span > < span class = "sign" > [< / span > channel_descr< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 256 < / span > < span class = "sign" > [< / span > mountpoint< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 257 < / span > < span class = "sign" > [< / span > cmd< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "ffmpeg"< / span >
< span class = "line_number" > 258 < / span > < span class = "sign" > [< / span > input_format< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "mpegts"< / span >
< span class = "line_number" > 259 < / span > < span class = "sign" > [< / span > input_channel< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "0"< / span >
< span class = "line_number" > 260 < / span > < span class = "sign" > [< / span > archive_dir< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 261 < / span > < span class = "sign" > [< / span > archive_time< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "3600"< / span >
< span class = "line_number" > 262 < / span > < span class = "sign" > [< / span > archive_log< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "/var/log/tuc01_archive.log"< / span >
< span class = "line_number" > 263 < / span > < span class = "sign" > [< / span > slices_dir< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > ""< / span >
< span class = "line_number" > 264 < / span > < span class = "sign" > [< / span > slices_time< span class = "sign" > ]< / span > < span class = "sign" > =< / span > 10
< span class = "line_number" > 265 < / span > < span class = "sign" > [< / span > slices_log< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "/var/log/tuc01_slices.log"< / span >
< span class = "line_number" > 266 < / span > < span class = "sign" > [< / span > filename_prefix< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "%Y-%m-%d_%H:%M:%S"< / span >
< span class = "line_number" > 267 < / span > < span class = "sign" > [< / span > filename_suffix< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "mp2"< / span >
< span class = "line_number" > 268 < / span > < span class = "sign" > [< / span > output_format< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "mp2"< / span >
< span class = "line_number" > 269 < / span > < span class = "sign" > [< / span > audio_bitrate< span class = "sign" > ]< / span > < span class = "sign" > =< / span > < span class = "quote" > "256k"< / span >
< span class = "line_number" > 270 < / span > < span class = "sign" > )< / span >
< / pre >
< hr / >
< a name = "streamsaver2fSETTINGS" > < / a >
< a name = "robo6" > < / a > < h2 > streamsaver/SETTINGS [ Variables ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./robo_variables.html#robo_top_of_doc" > Variables< / a > ]< / p >
< p class = "item_name" > VARIABLE< / p >
< pre > < strong > SETTINGS< / strong > - файл настроек
< / pre >
< p class = "item_name" > DESCRIPTION< / p >
< p > Переменная хранит имя файла настроек, который содержит параметры,
перечисленные в массиве опций < a href = "#robo5" > config< / a > , в формате XML. При отсутствии
параметра или пустом значении соответствующие флаги а аргументы не
добавляются в итоговую команду ffmpeg. Таким образом, например, можно
включать или отключать ведение журнала сохранения аудиозаписей, просто
указывая или удаляя параметр archive_log.
< / p >
< p > Формат файла настроек следующий:
< / p >
< pre > < xml>
< !-- Название канала -->
< channel_name> < /channel_name>
< !-- Описание канала -->
< channel_descr> Тестовый_канал< /channel_descr>
< !-- Входящий поток -->
< stream> < a href = "http://localhost:8000/tuc01</stream>" > http://localhost:8000/tuc01< / stream > < / a >
< !-- Icecast для вывода -->
< icecast> localhost:8000< /icecast>
< !-- Пароль для доступа к Icecast -->
< password> hackme< /password>
< !-- Точка подключения канала -->
< mountpoint> tuc02< /mountpoint>
< !-- Программа/канал из потока -->
< input_channel> 0:p:4098< /input_channel>
< / pre >
< p >
< / p >
< pre > < !-- Команда получения сигнала -->
< cmd> ffmpeg< /cmd>
< / pre >
< p >
< / p >
< pre > < !-- Формат входного потока -->
< input_format> mp2 -map 0:0< /input_format>
< / pre >
< p >
< / p >
< pre > < !-- Директория для сохранения архивных файлов -->
< archive_dir> FILES/archive/< /archive_dir>
< !-- Длительность архивных файлов в секундах -->
< archive_time> 3600< /archive_time>
< !-- Файл журнала обработки архивных записей -->
< archive_log> FILES/archive.log< /archive_log>
< / pre >
< p >
< / p >
< pre > < !-- Директория для сохранения фрагментов на анализ -->
< slices_dir> FILES/fragments/< /slices_dir>
< !-- Длительность фрагментов для анализа в секундах -->
< slices_time> 10< /slices_time>
< !-- Файл журнала обработки фрагментов на анализ -->
< slices_log> FILES/fragments.log< /slices_log>
< / pre >
< p >
< / p >
< pre > < !-- Префикс имени файла -->
< filename_prefix> %Y-%m-%d_%H:%M:%S< /filename_prefix>
< !-- Расширение имени файла -->
< filename_suffix> mp2< /filename_suffix>
< / pre >
< p >
< / p >
< pre > < !-- Формат аудиофайлов -->
< output_format> mp2< /output_format>
< !-- Битрейт аудиофайлов -->
< audio_bitrate> 256k< /audio_bitrate>
< /xml>
< / pre >
< p > < / p >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 336 < / span > < strong > SETTINGS< / strong > < span class = "sign" > =< / span > < span class = "quote" > "$1"< / span >
< / pre >
< hr / >
< a name = "streamsaver2fmain" > < / a >
< a name = "robo7" > < / a > < h2 > streamsaver/main [ Toplevel ]< / h2 >
< p > [ < a href = "#robo_top_of_doc" > Top< / a > ] [ < a href = "#robo0" > streamsaver< / a > ] [ < a href = "./tobo_toplevel.html#robo_top_of_doc" > Toplevel< / a > ]< / p >
< p class = "item_name" > NAME< / p >
< pre > < a href = "#robo0" > streamsaver< / a >
< / pre >
< p class = "item_name" > SOURCE< / p >
< pre class = "source" > < span class = "line_number" > 347 < / span > < span class = "comment" > #Проверка на наличие файла настроек< / span >
< span class = "line_number" > 348 < / span > < span class = "keyword" > if< / span > < span class = "sign" > [< / span > < span class = "sign" > -< / span > z < span class = "quote" > "$< a href = "#robo6" > SETTINGS< / a > "< / span > < span class = "sign" > ]< / span > < span class = "sign" > ;< / span > < span class = "keyword" > then< / span >
< span class = "line_number" > 349 < / span > < span class = "keyword" > echo< / span > < span class = "quote" > "USAGE: $(basename $0) < settings.xml> "< / span > < span class = "sign" > > < / span > < span class = "sign" > & < / span > 2
< span class = "line_number" > 350 < / span > < span class = "keyword" > exit< / span > 1
< span class = "line_number" > 351 < / span > < span class = "keyword" > elif< / span > < span class = "sign" > [< / span > < span class = "keyword" > !< / span > < span class = "sign" > -< / span > r < span class = "quote" > "$< a href = "#robo6" > SETTINGS< / a > "< / span > < span class = "sign" > ]< / span > < span class = "sign" > ;< / span > < span class = "keyword" > then< / span >
< span class = "line_number" > 352 < / span > < span class = "keyword" > echo< / span > < span class = "quote" > "Unable open file $1."< / span > < span class = "sign" > > < / span > < span class = "sign" > & < / span > 2
< span class = "line_number" > 353 < / span > < span class = "keyword" > echo< / span > < span class = "quote" > "USAGE: $(basename $0) < settings.xml> "< / span > < span class = "sign" > > < / span > < span class = "sign" > & < / span > 2
< span class = "line_number" > 354 < / span > < span class = "keyword" > exit< / span > 1
< span class = "line_number" > 355 < / span > < span class = "keyword" > fi< / span >
< span class = "line_number" > 356 < / span >
< span class = "line_number" > 357 < / span > < span class = "comment" > #Чтение настроек< / span >
< span class = "line_number" > 358 < / span > < a href = "#robo3" > readXML< / a > < span class = "quote" > "$< a href = "#robo6" > SETTINGS< / a > "< / span >
< span class = "line_number" > 359 < / span >
< span class = "line_number" > 360 < / span > < span class = "comment" > #Создание директорий хранения файлов, если требуется< / span >
< span class = "line_number" > 361 < / span > < span class = "keyword" > mkdir< / span > < span class = "sign" > -< / span > p < span class = "sign" > $< / span > < span class = "sign" > {< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > archive_dir< span class = "sign" > ]< / span > < span class = "keyword" > }< / span >
< span class = "line_number" > 362 < / span > < span class = "keyword" > mkdir< / span > < span class = "sign" > -< / span > p < span class = "sign" > $< / span > < span class = "sign" > {< / span > < a href = "#robo5" > config< / a > < span class = "sign" > [< / span > slices_dir< span class = "sign" > ]< / span > < span class = "keyword" > }< / span >
< span class = "line_number" > 363 < / span >
< span class = "line_number" > 364 < / span > < span class = "comment" > #Создание команды оцифровки сигнала< / span >
< span class = "line_number" > 365 < / span > < a href = "#robo4" > makeCMD< / a >
< / pre >
< / div > <!-- content -->
< div id = "footer" >
< p > Generated from ./streamsaver with < a href = "http://www.xs4all.nl/~rfsber/Robo/robodoc.html" > ROBODoc< / a > V4.99.41 on Tue Jul 12 2016 15:45:39
< / p >
< / div > <!-- footer -->
< / body >
< / html >