Открытый канал ID 71118586653264

Media Notes

Media Notes
- мое творчество, различная инфа о медиа пространстве. Linux, Ubuntu, Lubuntu, Debian, Arch, PCManFM-Qt, Nemo, Nautilus, Ffmpeg, ImageMagick

Открыть в MAX

Публикации за период

По реакциям

Поиск и вся лента — после бесплатной регистрации. Свои даты — по подписке; владелец канала видит их бесплатно. Сортировка по реакциям — по подписке. Зарегистрироваться

Загрузка…

Динамические файловые дескрипторы в Bash
(продолжение)

Главная особеность динамических файловых дескрипторов - работа с подстановкой потоков процессов (Process Substitution). Этот механизм создает динамический файловый дескриптор (обычно в /dev/fd/63 или /dev/fd/62), связанный с пайпом (pipe), и передает его имя команде.. Эта возможность появилась в BASH с версии 5.2.15.

Приме
р
# создаем дескриптор процеса
exec {FD}< <(sed 's/foo/bar/g' data.txt)

# читаем построчно и обрабатываем каждую строку+вывод в stdout
while IFS= read -r line; do
echo "Получена строка: $line"
done <&$FD

# закрываем пайп процесса
exec {FD} >&-

В качестве процесса может использоваться любая сложная операция, вплоть до сбора информации со сторонних датчиков, где реально нет в данных конца файла, и саму операцию нужно прекратить по другому принципу в момент обработки, выйдя из цикла. Вот тогда команда закрытия пайпа процесса выдаст EOF (конец файла)

Файловый дескриптор процесса может быть создан и для записи в процесс

Пример

# Открываем подстановку процесса на запись
exec {FD}> >(sed 's/123/456/g' > final.txt)

# Теперь {FD} содержит номер (например, 63)
echo "Обрабатываем первую часть" >&"$FD"
echo "Обрабатываем вторую часть" >&"$FD"

# ВАЖНО: Закрываем дескриптор, чтобы sed внутри скобок понял, что данных больше не будет и завершился
exec {FD}>&-


Без закрытия дескриптора exec {FD}>&- команда внутри >(...) будет висеть вечно, ожидая конца данных
Просмотры: 10
Перейти в пост Открыть в MAX Сообщить о неточности
Динамические файловые дескрипторы в Bash:

Синтаксис:
exec {fd}< file.txt

Вместо номера FD, в фигурных скобках {} используется переменная, которой присваивается первый свободный номер FD, и на него открывается файл. В данном случае для чтения, но при смене направления знака открывается операция записи
Таким образом FD используется как обычная переменная скрипта, т.е если выполнить echo $fd, то в выхлопе увидим номер созданного FD.
Главная особенность FD - все операции выполняются в оперативной памяти, и поэтому это быстрее чем использовать временные файлы, у которых механизм использования практически такой же как и в FD.
Все выше приведённые примеры также работают с динамическим FD,., только нужно заменить номер на переменную. Динамический FD появился в Bash, начиная с версии 4.4.
Просмотры: 6
Перейти в пост Открыть в MAX Сообщить о неточности
Примеры

📌Открыть файл на чтение в FD 3

exec 3< file.txt
read line <&3
echo "$line"
exec 3<&-

📌Открыть файл на запись в FD 4

exec 4> output.log
echo "Hello" >&4
exec 4>&-

📌Одновременно читать один файл и писать в другой

exec3< input.txt
exec 4> output.txt

while read -r line <&3; do
echo "[LOG] $line" >&4
done

exec 3<&-
exec 4>&-

📌Читать два входных файла одновременно

exec 3< fileA.txt
exec 4< fileB.txt

read A <&3
read B <&4

echo "A: $A"
echo "B: $B"

exec 3<&-
exec 4<&-
Просмотры: 6
Перейти в пост Открыть в MAX Сообщить о неточности
Синтаксис FD

📌Открываем FD на чтение

exec номер_FD < имя_файла

📌Открываем FD на запись

exec номер_FD > имя_файла

📌Закрываем читающий FD

exec номер_FD < &-

📌Закрываем пишущий FD

exec номер_FD > &-

📍Закрытие FD, посылает сигнал "конец файла" EOF📍

Явное назначение FD - номером может вызвать конфликт, так как выбранный вручную номер FD может быть занят библиотекой или другим скриптом, а так же при вложенных bash-функциях конфликт становится реальным.

Например, если вы выбрали FD 3, а ваш скрипт был вызван другой программой, которая тоже использует FD 3 ― поведение будет непредсказуемым.

Решение проблемы — динамические файловые дескрипторы через именование
Просмотры: 6
Перейти в пост Открыть в MAX Сообщить о неточности
Что такое файловые дескрипторы?

У каждого процесса в Linux есть три стандартных канала:
FD Назначение
0 stdin (ввод)
1 stdout (вывод)
2 stderr (ошибки)

Но процесс может иметь дополнительные дескрипторы:
3, 4, 5 … — хоть до сотен.

Это такие же каналы ввода-вывода, как и 0–2, только вы сами решаете, куда они ведут.

📌Зачем нужны дополнительные FD?

Обычное перенаправление < file может быть применено только один раз, то есть вы не можете «последовательно читать два файла» в одном цикле:

while read line; do …; done < file1 < file2 # так не работает

Более того, невозможно одновременно читать из одного файла и писать в другой ― в рамках одного while read.

Файловые дескрипторы это исправляет.
Просмотры: 8
Перейти в пост Открыть в MAX Сообщить о неточности
sobel - фильтр Собеля (пример видео, продолжение) — видео, канал «Media  Notes» ▶ видео
sobel - фильтр Собеля (пример видео, продолжение)

Получилось, то что хотелось. Алгоритм следующий: сначала перевели видео в монохром, а потом выполнили фильтр Собеля для зеленого слоя

ffmpeg -i inp.mp4 -vf monochrome,sobel=1 out.mp4

Результат налицо, но причина все равно не ясна, причем в фотках в формате JPEG - наблюдается та же картина, а вот в формате rgb24/rgba все играется правильно, так что тема с фильтром Собеля считаю не законченной
Просмотры: 19
Перейти в пост Открыть в MAX Сообщить о неточности
sobel - фильтр Собеля (пример видео) — видео, канал «Media  Notes» ▶ видео
sobel - фильтр Собеля (пример видео)

Мы явно видим, что превалирует исключительно зеленый цвет на контурах. Вопрос - а почему зеленый, ведь работают все слои. А давайте выполним фильтр только в зеленом слое(G)

ffmpeg -i inp.mp4 -vf sobel=1 out.mp4

Вот и все стало на место - фильтр сработал так как мы и ожидали. Но наверное этот факт не дает ответа - почему фильтр с параметрами по умолчанию ведет себя странно, и для этого мы разберем работу фильтра на просто изображении
Просмотры: 12
Перейти в пост Открыть в MAX Сообщить о неточности
sobel - фильтр Собеля (примеры) — видео, канал «Media  Notes» ▶ видео
sobel - фильтр Собеля (примеры)

Для примера мы взяли наше видео и прогнали через фильтр Собеля с параметрами по умолчанию Фильтр сработал, но почему то вылез везде зеленый цвет
Исходно параметры видео-стрима

Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m, progressive), 230x306, 185 kb/s, 30 fps, 30 tbr, 15360 tbn (default)

Обычный общепринятый кодек H264, а так же стандарт видео NTSC-М
Но результат удивил. Давайте разбираться
Просмотры: 12
Перейти в пост Открыть в MAX Сообщить о неточности
sobel - фильтр Собеля

Ffmpeg имеет возможность применить фильтр Собеля к видео

Фильтр Собеля — это основанный на градиенте оператор обнаружения границ, который выявляет сильные изменения в первой производной изображения, что делает его основополагающим инструментом в обработке изображений и компьютерном зрении для обнаружения границ объектов и важных структурных свойств на изображениях.

ffmpeg -i вход -vf sobel выход


У фильтра есть следующие опции
📍planes - слои
Устанавливает слой в котором применяется фильтр, в противном случае слой копируется. Всего слоев 4 и поэтому по умалчанию используются все слои, т.е = 0xF (15 - десятеричная)
Слои нумеруются битовой маской и соответствуют G(зеленый) = 1, B(синий)= 2, R(красный)= 4, A(альфа канал) = 8; что означает по умолчанию Собель выполняется во всех каналах
📍scale
Коэффициент умножения результата, по умолчанию = 1
📍delta
Добавление константы к результату, по умолчанию = 0

Опции задаются двумя способами - явная форма

sobel=planes=маска_слоя,scale=коэффициент,delta=константа

причем любая опция может отсутствовать или обязательная форма

sobel[=маска_слоя[:коэффициент[:константа]]]
Просмотры: 13
Перейти в пост Открыть в MAX Сообщить о неточности
Команда pstree показывает дерево процессов — то есть какие процессы запустили другие процессы.

Удобнее, чем обычный ps, потому что видно иерархию.

Базовое использование: pstree

Пример вывода:
systemd─┬─NetworkManager
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash
└─cron

Что это значит:
• systemd — главный процесс системы (PID 1)
• он запустил:
- NetworkManager
- sshd
- cron
• sshd запустил bash
• из bash запустили pstree
То есть видно кто чей родитель.

Полезные опции:
• Показать PID процессов: pstree -p
• Показать пользователей: pstree -u
• Показать аргументы процессов: pstree -a
• Дерево конкретного процесса: pstree <PID>
• Подсветка текущего процесса: pstree -h
Просмотры: 18
Перейти в пост Открыть в MAX Сообщить о неточности
Вся лента — после бесплатной регистрации
ВКонтакте Телеграм Одноклассники
Избранное в datool.ru

Следите за каналом в личном кабинете

Зарегистрируйтесь в datool.ru, чтобы добавить канал «Media Notes» в избранное и отслеживать его показатели.

Зарегистрироваться
Для владельцев каналов

Подтвердите свой канал

Войдите или зарегистрируйтесь в datool.ru, затем добавьте нашего бота в канал по инструкции в личном кабинете. После проверки владения замок исчезнет и вам станет доступно управление каналом.

Войти или зарегистрироваться

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти