|
|
<?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]}-CH${<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]} -f ${<a href="#robo5">config</a>[input_format]} -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> <span class="keyword">if</span> <span class="sign">[</span> <span class="keyword">!</span> <span class="sign">-</span>z <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="keyword">then</span> |
|
|
<span class="line_number">185 </span> <a href="#robo2">enableOption</a> input_channel <span class="sign">-</span>map <span class="sign">%</span><span class="sign">%</span> |
|
|
<span class="line_number">186 </span> <a href="#robo2">enableOption</a> audio_bitrate <span class="sign">-</span>ab <span class="sign">%</span><span class="sign">%</span> |
|
|
<span class="line_number">187 </span> <a href="#robo2">enableOption</a> channel_name <span class="sign">\</span> |
|
|
<span class="line_number">188 </span> <span class="sign">-</span>legacy_icecast 1 <span class="sign">\</span> |
|
|
<span class="line_number">189 </span> <span class="sign">-</span>content_type audio<span class="sign">/</span>mpeg <span class="sign">\</span> |
|
|
<span class="line_number">190 </span> <span class="sign">-</span>ice_name <span class="sign">%</span><span class="sign">%</span> |
|
|
<span class="line_number">191 </span> |
|
|
<span class="line_number">192 </span> <a href="#robo2">enableOption</a> channel_descr <span class="sign">\</span> |
|
|
<span class="line_number">193 </span> <span class="sign">-</span>ice_description <span class="sign">%</span><span class="sign">%</span> |
|
|
<span class="line_number">194 </span> |
|
|
<span class="line_number">195 </span> <a href="#robo2">enableOption</a> icecast <span class="sign">\</span> |
|
|
<span class="line_number">196 </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">197 </span> <span class="keyword">fi</span> |
|
|
<span class="line_number">198 </span> |
|
|
<span class="line_number">199 </span> <span class="comment"># АРХИВ</span> |
|
|
<span class="line_number">200 </span> <a href="#robo2">enableOption</a> input_channel <span class="sign">-</span>map <span class="sign">%</span><span class="sign">%</span> |
|
|
<span class="line_number">201 </span> <a href="#robo2">enableOption</a> archive_log <span class="sign">\</span> |
|
|
<span class="line_number">202 </span> <span class="sign">-</span>segment_list <span class="sign">%</span><span class="sign">%</span> <span class="sign">\</span> |
|
|
<span class="line_number">203 </span> <span class="sign">-</span>segment_list_entry_prefix <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[archive_dir]})"</span> <span class="sign">\</span> |
|
|
<span class="line_number">204 </span> <span class="sign">-</span>segment_list_type csv <span class="sign">\</span> |
|
|
<span class="line_number">205 </span> <span class="sign">-</span>segment_list_flags live |
|
|
<span class="line_number">206 </span> |
|
|
<span class="line_number">207 </span> <span class="comment"># +СЕГМЕНТИРОВАНИЕ</span> |
|
|
<span class="line_number">208 </span> <a href="#robo2">enableOption</a> archive_dir <span class="sign">\</span> |
|
|
<span class="line_number">209 </span> <span class="sign">-</span>segment_atclocktime 1 <span class="sign">\</span> |
|
|
<span class="line_number">210 </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">211 </span> <span class="sign">-</span><span class="keyword">fi</span> segment <span class="sign">\</span> |
|
|
<span class="line_number">212 </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">213 </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">214 </span> <span class="sign">-</span>strftime 1 <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[archive_dir]})/$FILE_NAME"</span> |
|
|
<span class="line_number">215 </span> |
|
|
<span class="line_number">216 </span> <span class="comment"># АНАЛИЗ</span> |
|
|
<span class="line_number">217 </span> <a href="#robo2">enableOption</a> input_channel <span class="sign">-</span>map <span class="sign">%</span><span class="sign">%</span> |
|
|
<span class="line_number">218 </span> <a href="#robo2">enableOption</a> slices_log <span class="sign">\</span> |
|
|
<span class="line_number">219 </span> <span class="sign">-</span>segment_list <span class="sign">%</span><span class="sign">%</span> <span class="sign">\</span> |
|
|
<span class="line_number">220 </span> <span class="sign">-</span>segment_list_entry_prefix <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[slices_dir]})"</span> <span class="sign">\</span> |
|
|
<span class="line_number">221 </span> <span class="sign">-</span>segment_list_type csv <span class="sign">\</span> |
|
|
<span class="line_number">222 </span> <span class="sign">-</span>segment_list_flags live |
|
|
<span class="line_number">223 </span> |
|
|
<span class="line_number">224 </span> <span class="comment"># +СЕГМЕНТИРОВАНИЕ</span> |
|
|
<span class="line_number">225 </span> <a href="#robo2">enableOption</a> slices_dir <span class="sign">\</span> |
|
|
<span class="line_number">226 </span> <span class="sign">-</span>segment_atclocktime 1 <span class="sign">\</span> |
|
|
<span class="line_number">227 </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">228 </span> <span class="sign">-</span><span class="keyword">fi</span> segment <span class="sign">\</span> |
|
|
<span class="line_number">229 </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">230 </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">231 </span> <span class="sign">-</span>strftime 1 <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[slices_dir]})/$FILE_NAME"</span> |
|
|
<span class="line_number">232 </span> |
|
|
<span class="line_number">233 </span> <span class="keyword">echo</span> <span class="quote">"$CMD"</span> |
|
|
<span class="line_number">234 </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="./streamproxy.html#robo9">readXML</a>, <a href="#robo4">makeCMD</a> |
|
|
</pre> |
|
|
<p class="item_name">SOURCE</p> |
|
|
<pre class="source"><span class="line_number">250 </span><span class="keyword">typeset</span> <span class="sign">-</span>A <strong>config</strong> |
|
|
<span class="line_number">251 </span> |
|
|
<span class="line_number">252 </span><strong>config</strong><span class="sign">=</span><span class="sign">(</span> |
|
|
<span class="line_number">253 </span> <span class="sign">[</span>proxy<span class="sign">]</span><span class="sign">=</span><span class="quote">"0"</span> |
|
|
<span class="line_number">254 </span> <span class="sign">[</span>stream<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">255 </span> <span class="sign">[</span>icecast<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">256 </span> <span class="sign">[</span>password<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">257 </span> <span class="sign">[</span>channel_name<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">258 </span> <span class="sign">[</span>channel_number<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">259 </span> <span class="sign">[</span>channel_descr<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">260 </span> <span class="sign">[</span>mountpoint<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">261 </span> <span class="sign">[</span>cmd<span class="sign">]</span><span class="sign">=</span><span class="quote">"ffmpeg"</span> |
|
|
<span class="line_number">262 </span> <span class="sign">[</span>input_format<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">263 </span> <span class="sign">[</span>input_channel<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">264 </span> <span class="sign">[</span>archive_dir<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">265 </span> <span class="sign">[</span>archive_time<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">266 </span> <span class="sign">[</span>archive_log<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">267 </span> <span class="sign">[</span>slices_dir<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">268 </span> <span class="sign">[</span>slices_time<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">269 </span> <span class="sign">[</span>slices_log<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">270 </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">271 </span> <span class="sign">[</span>filename_suffix<span class="sign">]</span><span class="sign">=</span><span class="quote">"mp3"</span> |
|
|
<span class="line_number">272 </span> <span class="sign">[</span>output_format<span class="sign">]</span><span class="sign">=</span><span class="quote">"mp3"</span> |
|
|
<span class="line_number">273 </span> <span class="sign">[</span>audio_bitrate<span class="sign">]</span><span class="sign">=</span><span class="quote">"256k"</span> |
|
|
<span class="line_number">274 </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> <!-- Директория для сохранения архивных файлов --> |
|
|
<!-- Может содержать переменную $DATA (текущую дату) --> |
|
|
<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> |
|
|
<!-- Использование <a href="./streamproxy.html#robo8">streamproxy</a> --> |
|
|
<proxy>1</proxy> |
|
|
</xml> |
|
|
</pre> |
|
|
<p></p> |
|
|
<p class="item_name">SOURCE</p> |
|
|
<pre class="source"><span class="line_number">343 </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="#robo_top_of_doc">streamsaver</a> |
|
|
</pre> |
|
|
<p class="item_name">SOURCE</p> |
|
|
<pre class="source"><span class="line_number">354 </span><span class="comment">#Проверка на наличие файла настроек</span> |
|
|
<span class="line_number">355 </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">356 </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">357 </span> <span class="keyword">exit</span> 1 |
|
|
<span class="line_number">358 </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">359 </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">360 </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">361 </span> <span class="keyword">exit</span> 1 |
|
|
<span class="line_number">362 </span><span class="keyword">fi</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="./streamproxy.html#robo9">readXML</a> <span class="quote">"$<a href="#robo6">SETTINGS</a>"</span> |
|
|
<span class="line_number">366 </span> |
|
|
<span class="line_number">367 </span><span class="comment">#Текущая дата</span> |
|
|
<span class="line_number">368 </span>DATE<span class="sign">=</span><span class="quote">"$(\date +%F)"</span> |
|
|
<span class="line_number">369 </span> |
|
|
<span class="line_number">370 </span><span class="comment">#Создание директорий хранения файлов за текущую дату, если требуется</span> |
|
|
<span class="line_number">371 </span><span class="sign">[</span> <span class="keyword">!</span> <span class="sign">-</span>z <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="sign">]</span> <span class="sign">&</span><span class="sign">&</span> <span class="keyword">mkdir</span> <span class="sign">-</span>p <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[archive_dir]})"</span> |
|
|
<span class="line_number">372 </span><span class="sign">[</span> <span class="keyword">!</span> <span class="sign">-</span>z <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="sign">]</span> <span class="sign">&</span><span class="sign">&</span> <span class="keyword">mkdir</span> <span class="sign">-</span>p <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[slices_dir]})"</span> |
|
|
<span class="line_number">373 </span> |
|
|
<span class="line_number">374 </span><span class="comment">#Дата следующего дня</span> |
|
|
<span class="line_number">375 </span>DATE<span class="sign">=</span><span class="quote">"$(\date --date='tomorrow' +%F)"</span> |
|
|
<span class="line_number">376 </span> |
|
|
<span class="line_number">377 </span><span class="comment">#Создание директорий хранения файлов на следующий день</span> |
|
|
<span class="line_number">378 </span><span class="sign">[</span> <span class="keyword">!</span> <span class="sign">-</span>z <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="sign">]</span> <span class="sign">&</span><span class="sign">&</span> <span class="keyword">mkdir</span> <span class="sign">-</span>p <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[archive_dir]})"</span> |
|
|
<span class="line_number">379 </span><span class="sign">[</span> <span class="keyword">!</span> <span class="sign">-</span>z <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="sign">]</span> <span class="sign">&</span><span class="sign">&</span> <span class="keyword">mkdir</span> <span class="sign">-</span>p <span class="quote">"$(eval echo ${<a href="#robo5">config</a>[slices_dir]})"</span> |
|
|
<span class="line_number">380 </span> |
|
|
<span class="line_number">381 </span><span class="comment">#Если используется прокси, то сигнал будет приниматься с соответствующего Icecast</span> |
|
|
<span class="line_number">382 </span><span class="keyword">if</span> <span class="sign">[</span> <span class="sign">$</span><span class="sign">{</span><a href="#robo5">config</a><span class="sign">[</span>proxy<span class="sign">]</span><span class="keyword">}</span> <span class="sign">=</span><span class="sign">=</span> 1 <span class="sign">]</span><span class="sign">;</span> <span class="keyword">then</span> |
|
|
<span class="line_number">383 </span> <a href="#robo5">config</a><span class="sign">[</span>stream<span class="sign">]</span><span class="sign">=</span><span class="quote">"http://${<a href="#robo5">config</a>[icecast]}/${<a href="#robo5">config</a>[mountpoint]}"</span> |
|
|
<span class="line_number">384 </span> <a href="#robo5">config</a><span class="sign">[</span>input_format<span class="sign">]</span><span class="sign">=</span><span class="quote">"${<a href="#robo5">config</a>[output_format]}"</span> |
|
|
<span class="line_number">385 </span> <a href="#robo5">config</a><span class="sign">[</span>output_format<span class="sign">]</span><span class="sign">=</span><span class="quote">"copy"</span> |
|
|
<span class="line_number">386 </span> <a href="#robo5">config</a><span class="sign">[</span>input_channel<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">387 </span> <a href="#robo5">config</a><span class="sign">[</span>icecast<span class="sign">]</span><span class="sign">=</span><span class="quote">""</span> |
|
|
<span class="line_number">388 </span><span class="keyword">fi</span> |
|
|
<span class="line_number">389 </span> |
|
|
<span class="line_number">390 </span><span class="comment">#Создание команды оцифровки сигнала</span> |
|
|
<span class="line_number">391 </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 Wed Aug 24 2016 11:50:31 |
|
|
</p> |
|
|
</div> <!-- footer --> |
|
|
</body> |
|
|
</html>
|
|
|
|