ffmpeg/streamsaver [ Files ]

[ Top ] [ Files ]

NAME

    streamsaver - обработчик аудиопотоков с нарезкой их в файлы и
    ретрансляцией на icecast

VERSION

    1.0

DESCRIPTION

Сценарий принимает аудиопоток с оборудования, по UDP или TCP, фрагментирует его на отрезки заданной длины для последующего хранения и анализа, а также ретранслирует поток на сервер радиовещания icecast для прослушивания аудио конечным пользователем.

USAGE

    streamsaver <файл настроек>

ARGUMENTS


streamsaver/readOption [ Functions ]

[ Top ] [ streamsaver ] [ Functions ]

NAME

    readOption - получение значения опции из файла настроек

USAGE

    readOption <опция> <файл>

ARGUMENTS

RESULT

    Значение параметра при наличии искомой опции в xml-файле или значение по
    умолчанию, которое задаётся при инициализации переменной config.

SOURCE

45 readOption() {
46         cfg=$(\grep -oPm1 "(?<=<$1>)[^<]+" "$2")
47         
48         if [ ! -z "$cfg" ]; then
49                 config[$1]=$cfg
50         fi
51 }

streamsaver/enableOption [ Functions ]

[ Top ] [ streamsaver ] [ Functions ]

NAME

    enableOption - добавление опции к команде ffmpeg

DESCRIPTION

Процедура включает опцию, если в конфигурационном файле имеется соответствующая настройка.

USAGE

    enableOption <опция>

ARGUMENTS

SOURCE

71 enableOption () {
72         if [ ! -z "${config[$1]}" ]; then
73                 CMD+=" $(echo $* | cut -d ' ' -f 2- | sed "s|%%|\"${config[$1]}\"|g")"
74         fi
75 }

streamsaver/readXML [ Functions ]

[ Top ] [ streamsaver ] [ Functions ]

NAME

    readXML - чтение файла настроек

DESCRIPTION

Получение настроек из xml-файла.

USAGE

    readXML <xml>

ARGUMENTS

SOURCE

94 readXML() {
95         #Чтение настроек из файла
96         for option in ${!config[*]}; {
97                 readOption "$option" "$1"
98         }
99 }

streamsaver/makeCMD [ Functions ]

[ Top ] [ streamsaver ] [ Functions ]

NAME

    makeCMD - создание команды для оцифровки сигнала

DESCRIPTION

Процедура составляет команду ffmpeg, включая опции, если они заданы в конфигурационном файле или указаны значения по умолчанию в массиве настроек config.

Эталонные настройки ffmpeg

        ffmpeg  -reconnect 1 \
           \
           -i  "${config[stream]}" \
              -legacy_icecast 1 \
              -content_type audio/mpeg \
              -ice_name "Имя канала" \
              -ice_description "Описание канала" \
              icecast://source:${config[password]}@${config[icecast]}/${config[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" -map 0  -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" -map 0  -f segment \
              -segment_time   "$SLICES_TIME" \
              -segment_format "$FORMAT" \
              -strftime 1     "$SLICES_DIR/$FILE_NAME"

RESULT

    Команда ffmpeg, которую можно передать на выполнение.

SOURCE

148 makeCMD() {
149         #Правило именования файлов
150         FILE_NAME="${config[filename_prefix]}-${config[channel_name]}.${config[filename_suffix]}"
151 
152         #Минимальная команда
153         CMD="${config[cmd]} -reconnect 1 -i ${config[stream]} -f mp2"
154         # " -f ${config[input_format]}"
155 
156         #КОДИРОВАНИЕ
157         # enableOption output_format -c %%
158 
159         #ICECAST
160         enableOption channel_name \
161                 -legacy_icecast 1 \
162                 -content_type audio/mpeg \
163                 -ice_name %%
164 
165         enableOption channel_descr \
166                 -ice_description %%
167 
168         enableOption icecast \
169                 icecast://source:${config[password]}@${config[icecast]}/${config[mountpoint]}
170 
171         # АРХИВ
172         enableOption archive_log \
173                 -segment_list %% \
174                 -segment_list_entry_prefix "${config[archive_dir]}" \
175                 -segment_list_type csv \
176                 -segment_list_flags live
177 
178         # +СЕГМЕНТИРОВАНИЕ
179         enableOption archive_dir \
180                 -segment_atclocktime 1 \
181                 -acodec "${config[output_format]}" -map 0 \
182                 -fi segment \
183                 -segment_time   "${config[archive_time]}" \
184                 -segment_format "${config[output_format]}" \
185                 -strftime 1     "${config[archive_dir]}/$FILE_NAME"
186 
187         # АНАЛИЗ
188         enableOption slices_log \
189                 -segment_list %% \
190                 -segment_list_entry_prefix "${config[slices_dir]}" \
191                 -segment_list_type csv \
192                 -segment_list_flags live
193 
194         # +СЕГМЕНТИРОВАНИЕ
195         enableOption slices_dir \
196                 -segment_atclocktime 1 \
197                 -acodec "${config[output_format]}" -map 0 \
198                 -fi segment \
199                 -segment_time   "${config[slices_time]}" \
200                 -segment_format "${config[output_format]}" \
201                 -strftime 1     "${config[slices_dir]}/$FILE_NAME"
202 
203         echo "$CMD"
204 }

streamsaver/config [ Variables ]

[ Top ] [ streamsaver ] [ Variables ]

VARIABLE

    config - массив настроек, содержащий значения по-умолчанию.
    Настройки описаны в секции SETTINGS.

USED BY

    enableOption, readOption, readXML, makeCMD

SOURCE

220 typeset -A config
221 
222 config=(
223         [stream]=""
224         [icecast]="http://localhost:8000/"
225         [password]="hackme"
226         [channel_name]=""
227         [channel_descr]=""
228         [mountpoint]=""
229         [cmd]="ffmpeg"
230         [input_format]="mpegts"
231         [archive_dir]=""
232         [archive_time]="3600"
233         [archive_log]="/var/log/tuc01_archive.log"
234         [slices_dir]=""
235         [slices_time]=10
236         [slices_log]="/var/log/tuc01_slices.log"
237         [filename_prefix]="%Y-%m-%d_%H:%M:%S"
238         [filename_suffix]="mp2"
239         [output_format]="mp2"
240         [audio_bitrate]="256k"
241 )

streamsaver/SETTINGS [ Variables ]

[ Top ] [ streamsaver ] [ Variables ]

VARIABLE

    SETTINGS - файл настроек

DESCRIPTION

Переменная хранит имя файла настроек, который содержит параметры, перечисленные в массиве опций config, в формате XML. При отсутствии параметра или пустом значении соответствующие флаги а аргументы не добавляются в итоговую команду ffmpeg. Таким образом, например, можно включать или отключать ведение журнала сохранения аудиозаписей, просто указывая или удаляя параметр archive_log.

Формат файла настроек следующий:

       <xml>
       <!-- Название канала -->
       <channel_name></channel_name>
       <!-- Описание канала -->
       <channel_descr>Тестовый_канал</channel_descr>
       <!-- Входящий поток  -->
       <stream>http://localhost:8000/tuc01
       <!-- Icecast для вывода -->
       <icecast>localhost:8000</icecast>
       <!-- Пароль для доступа к Icecast -->
       <password>hackme</password>
       <!-- Точка подключения канала -->
       <mountpoint>tuc02</mountpoint>

       <!-- Команда получения сигнала -->
       <cmd>ffmpeg</cmd>

       <!-- Формат входного потока -->
       <input_format>mp2 -map 0:0</input_format>

       <!-- Директория для сохранения архивных файлов -->
       <archive_dir>FILES/archive/</archive_dir>
       <!-- Длительность архивных файлов в секундах -->
       <archive_time>3600</archive_time>
       <!-- Файл журнала обработки архивных записей -->
       <archive_log>FILES/archive.log</archive_log>

       <!-- Директория для сохранения фрагментов на анализ -->
       <slices_dir>FILES/fragments/</slices_dir>
       <!-- Длительность фрагментов для анализа в секундах -->
       <slices_time>10</slices_time>
       <!-- Файл журнала обработки фрагментов на анализ -->
       <slices_log>FILES/fragments.log</slices_log>

       <!-- Префикс имени файла -->
       <filename_prefix>%Y-%m-%d_%H:%M:%S</filename_prefix>
       <!-- Расширение имени файла -->
       <filename_suffix>mp2</filename_suffix>

       <!-- Формат аудиофайлов -->
       <output_format>mp2</output_format>
       <!-- Битрейт аудиофайлов -->
       <audio_bitrate>256k</audio_bitrate>
       </xml>

SOURCE

305 SETTINGS="$1"

streamsaver/main [ Toplevel ]

[ Top ] [ streamsaver ] [ Toplevel ]

NAME

    streamsaver

SOURCE

316 #Проверка на наличие файла настроек
317 if [ -z "$SETTINGS" ]; then
318         echo "USAGE: $(basename $0) <settings.xml>" >&2
319         exit 1
320 elif [ ! -r "$SETTINGS" ]; then
321         echo "Unable open file $1." >&2
322         echo "USAGE: $(basename $0) <settings.xml>" >&2
323         exit 1
324 fi
325 
326 #Чтение настроек
327 readXML "$SETTINGS"
328 
329 #Создание директорий хранения файлов, если требуется
330 mkdir -p ${config[archive_dir]}
331 mkdir -p ${config[slices_dir]}
332 
333 #Создание команды оцифровки сигнала
334 makeCMD