понедельник, 14 августа 2017 г.

Делаем шикарные GIF'ки из видео в Linux


Создаём файл с именем например "gif.sh", открываем и заполняем следующим текстом:


#!/bin/sh

palette="/tmp/palette.png"

input="22331-22450.mp4" # видео файл
output="out.gif" # имя гифки

res="480" # разрешение по горизонтали
ps="33" # скорость проигрывания (если равна фреймрейту смого видео то скорость не изменится)
fps="21" # итоговый фреймрейт с отбрасыванием (или дублированием) кадров (если значение меньше чем "ps" то кадры будут отбрасываться)

ffmpeg -i $input -vf "scale=$res:-1:flags=lanczos,palettegen" -y $palette
ffmpeg -r $ps -i $input -i $palette -lavfi "scale=$res:-1:flags=lanczos [x]; [x][1:v] paletteuse" -r $fps -y $output

Как собрать видео из серии кадров можно узнать по ярлыку этой заметки.

понедельник, 31 июля 2017 г.

Пингуем красиво

Я загорелся идеей распарсить выдачу простой программы ping (Это я сделал ранее) и визуализировать колебания в графике. Для этого я нашёл программу gnuplot.

Начнём

Пишем в консоле:

ping ya.ru

получаем примерно следующее:


        64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=58 time=7.24 ms
        64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=58 time=7.26 ms
        64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=58 time=7.16 ms
      

лично меня интересует последнее значение которое следует за time=, но мне не нужен формат измерения ms, поэтому надо распарсить эту строку. Я нашёл 2 способа, через утилиту sed и через утилиту awk, уверен что есть куча других вариантов, но это самые простые для меня.

Парсим строку спомощью SED:

ping 192.168.1.1 | sed -u 's\^.*time=\\; s/ms.*//' > ping

Получаем файл "ping" (в домашмем каталоге) в котором написано что то вроде:


        7.24
        7.26
        7.16
      

Похожий результат будет выдавать AWK:

ping 192.168.1.1 | awk -F "[\ ,=]" '{print $10; fflush()}' > pingawk

Приступим к рисованию гафиков

Как я уже сказал в начале, рисовать мы будем спомощью программы gnuplot.
Первым делом создаём простой и пустой текстовый файл в домашней дирректории, я назвал его "plotping", в нём прописываем параметры для gnuplot:


        splot "pingawk" with lines
        reread
      
после этого нам надо открыть 2 консоли (Позднее подумаю как запустить в одной). В одной запускаем:
ping 192.168.1.1 | awk -F "[\ ,=]" '{print $10; fflush()}' > pingawk
а во второй пишем:
gnuplot
откроется "диалог" с gnuplot где мы говорим ему брать настройки из ранее сделанного файла "plotping"
load "plotping"

Парсим ping с sed и awk

ping 192.168.1.1 | sed -u 's\^.*time=\\; s/ms.*//' > ping

ping 192.168.1.1 | awk -F "[\ ,=]" '{print $10; fflush()}' > pingawk