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" -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"

RESULT

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

SOURCE

148 makeCMD() {
149         #Правило именования файлов
150         FILE_NAME="${config[filename_prefix]}-${config[channel_name]}.${config[filename_suffix]}"
151 
152         #Минимальная команда
153         CMD="${config[cmd]} -i ${config[stream]} -f ${config[output_format]}"
154 
155         #КОДИРОВАНИЕ
156         # enableOption output_format -c %%
157 
158         #ICECAST
159         enableOption input_channel -map %%
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 input_channel -map %%
173         enableOption archive_log \
174                 -segment_list %% \
175                 -segment_list_entry_prefix "${config[archive_dir]}" \
176                 -segment_list_type csv \
177                 -segment_list_flags live
178 
179         # +СЕГМЕНТИРОВАНИЕ
180         enableOption archive_dir \
181                 -segment_atclocktime 1 \
182                 -acodec "${config[output_format]}" \
183                 -fi segment \
184                 -segment_time   "${config[archive_time]}" \
185                 -segment_format "${config[output_format]}" \
186                 -strftime 1     "${config[archive_dir]}/$FILE_NAME"
187 
188         # АНАЛИЗ
189         enableOption input_channel -map %%
190         enableOption slices_log \
191                 -segment_list %% \
192                 -segment_list_entry_prefix "${config[slices_dir]}" \
193                 -segment_list_type csv \
194                 -segment_list_flags live
195 
196         # +СЕГМЕНТИРОВАНИЕ
197         enableOption slices_dir \
198                 -segment_atclocktime 1 \
199                 -acodec "${config[output_format]}" \
200                 -fi segment \
201                 -segment_time   "${config[slices_time]}" \
202                 -segment_format "${config[output_format]}" \
203                 -strftime 1     "${config[slices_dir]}/$FILE_NAME"
204 
205         echo "$CMD"
206 }

streamsaver/config [ Variables ]

[ Top ] [ streamsaver ] [ Variables ]

VARIABLE

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

USED BY

    enableOption, readOption, readXML, makeCMD

SOURCE

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

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

308 SETTINGS="$1"

streamsaver/main [ Toplevel ]

[ Top ] [ streamsaver ] [ Toplevel ]

NAME

    streamsaver

SOURCE

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