Posts

Заметки Задрота #3: извлечь кадры из видео с помощью FFMPEG

 FFmpeg Animated CLI Prompt by VA: Несколько простых команд для извлечения оригинальных кадров из видеофайла.

 Извлечь кадры в формате .PNG начиная с 5 секунды видео, отрезок продолжительностью 2 секунды, пронумеровать извлечённые кадры 00001.png и т.д.:

ffmpeg -i /sdcard/VIDEO/myvideo.mp4 -ss 00:00:05.000 -t 2 /sdcard/VIDEO/%05d.png


 Извлечь 15 кадров в формате .PNG начиная с 1 минуты 24 секунды, пронумеровать извлечённые кадры 00001.png и т.д.:

ffmpeg -ss 00:01:24.000 -i /sdcard/VIDEO/myvideo.mp4 -frames:v 15 /sdcard/VIDEO/%05d.png


 Извлечь кадры в формате .JPG наилучшего качества (параметр -q:v 1, может иметь значения от 1 до 31, где 31 - худшее, а 1 - наилучшее) начиная с 20 секунды видео, отрезок продолжительностью 2 секунды, пронумеровать извлечённые кадры 00001.jpg и т.д.:

ffmpeg -i /sdcard/VIDEO/myvideo.mp4 -ss 00:00:20.000 -t 2 -qmin 1 -q:v 1 /sdcard/VIDEO/%05d.jpg

Добавлено: 23.05.2026, 03:45 | Последнее обновление: 23.05.2026, 03:45

BASH: автоматическое переименование файлов

Linux / Bash: Переименовать все графические файлы в текущем, либо в заданном каталоге с помощью стандартного Bash скрипта .sh

 Работая в виртуальной среде Linux на мобильном устройстве Android через Termux, возникла нездоровая потребность переименовать множество графических файлов, по шаблону 00001.png, 00002.png и т.д.

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

Bash:
#!/bin/bash

echo
c=1
shopt -s extglob
for i in "/INPUT/"*.@(png|jpg|jpeg); do
  newname=$(printf "%05d" "$c")
  mv -v -i -- "$i" "/INPUT/${newname}.${i##*.}"
  let c="$c+1"
done
echo

  Кратко: переименует все файлы в папке /INPUT, которые имеют расширение .png .jpg или .jpeg (добавьте в скрипт нужные типы через разделитель | ) по шаблону 00001.jpg, 00002.jpg и т.д.
Для увеличения или уменьшения количества нолей в имени, изменяйте значение "%05d" в скрипте ("%03d" - 001.jpg, "%04d" - 0001.jpg и так далее, )
Путь к файлами задаётся на свое усмотрение (его вообще может не быть, если файлы находятся в той же папке что и скрипт), также не забывайте указывать путь, куда будут помещаться переименованные файлы (допускается одинаковый путь, как в примере выше, в этом случае, на месте файлов со старыми названиями, появятся новые - нумерованные файлы)
Скрипт отлично работает с пробелами, точками и дефисами в именах входных файлов, также корректно обрабатывает пробелы содержащиеся в именах папок указанных в пути.


UPDATE: 21.05.2026

Для особо дотошных субъектов: версия скрипта с предварительной сортировкой по дате изменения файла

Командой ls -tr отсортируем входные файлы по времени последнего изменения и выведем в обратном порядке (самый старый вверху, самый новый внизу) для последующего переименования, самый старый файл получит имя 00001, а самый новый - конечный номер.
Также пришлось добавить параметр IFS=$'\n' - никак не удавалось заставить команду ls корректно обрабатывать пробелы в именах файлов и пробелы в именах папок, которые присутствуют в пути.

Bash:
#!/bin/bash

DefaultIFS=${IFS-$(printf " \t\n")}

echo
c=1
shopt -s extglob
IFS=$'\n'
for i in $(ls -tr "/sdcard/INPUT/"*.@(png|jpg|jpeg)); do
  newname=$(printf "%05d" "$c")
  mv -v -i -- "$i" "/sdcard/INPUT/${newname}.${i##*.}"
  let c="$c+1"
  echo
done
IFS="$DefaultIFS"
echo

Добавлено: 20.05.2026, 03:30 | Последнее обновление: 21.05.2026, 04:07

Заметки Задрота #2: захватить аудиопоток .AAC и встроить метаданные

 FFmpeg: записать "сырой" аудиопоток в формате .аас (источник транслирует в формате .ааc) продолжительностью 60 секунд и добавить к нему метаданные, которые отправляет сервер радиостанции в формате icy-name заголовков.
*Большинство медиа проигрывателей не увидят эти теги, только специальные программы для чтения тегов.

ffmpeg -y -i https://ice2.somafm.com/deepspaceone-64-aac -t 60s -c:a copy -write_apetag 1 '/sdcard/OUTPUT/'livestream.aac

Вместо параметра -write_apetag 1 можно использовать -write_id3v2 1

Требования: FFmpeg установлен.



Для того, чтобы добавить определенные теги (Альбом, Исполнитель) к нашему записываемому аудиопотоку .aac и не сойти с ума, нам нужно поместить копию нашего .aac потока в контейнер .m4a (без пережатия, чистая копия), указав в команде нужные нам теги. Перемещение .aac аудиопотока в контейнер .m4a необходимо для того, чтобы медиа плееры смогли прочитать и правильно отобразить встроенные нами индивидуальные теги:

ffmpeg -y -i https://ice2.somafm.com/deepspaceone-64-aac -t 60s -c:a copy -metadata artist="My Cat" -metadata album="PAWS" '/sdcard/OUTPUT/'livestream.m4a

 В результате работы этой команды, мы получим аудиофайл формата .m4a, продолжительностью 60 секунд, исполнителем композиции будет "Мой кот", а название альбома - "ЛАПЫ".

*При таком варианте выполнения команды есть небольшой недостаток, встраивая свои индивидуальные теги в контейнер .m4a, мы теряем возможность (но это не точно), встроить те метаданные, которые посылает нам сервер интернет вещания в виде icy-name заголовков, даже если используем параметр -write_apetag 1 или -write_id3v2 1

Требования: FFmpeg установлен.


Эти команды тестировались в CLI Termux на мобильном устройстве с Android 16, также будут работать и в других ОС при надлежащей настройке.


Добавлено: 07.05.2026, 23:45 | Последнее обновление: 07.05.2026, 23:45

Заметки Задрота #1: записать трансляцию YouTube, установить продолжительность записи - связка FFmpeg + YT-DLP

 FFmpeg в связке с YT-DLP: записать прямую трансляцию с YouTube, установить продолжительность записи 60 сек., качество захватываемого видео - наихудшее из возможных (параметр yt-dlp: -f worst), обычно это 256x144 и 15 fps.
YT-DLP код внутри команды FFmpeg играет роль экстрактора, который извлекает прямую ссылку на транслируемое видео.
Эта команда тестировалась в CLI Termux на мобильном устройстве с Android 16, также будет работать в других ОС при надлежащей настройке.

ffmpeg -i $(yt-dlp -f worst --get-url YOUTUBE-URL) -t 60s -c copy '/sdcard/My Video/'live_stream_$(date +%d-%m-%Y_%H-%M-%S).mp4

Требования: FFmpeg установлен, YT-DLP установлен, Termux CLI (для мобильных устройств).



 FFmpeg: записать аудио поток интернет-радиостанции с вещанием в формате .aac, с продолжительностью 60 сек.
Необходима прямая ссылка на аудиопоток (ее можно извлечь из скачанных файлов плейлиста, например, формата .pls)
Эта команда тестировалась в CLI Termux на мобильном устройстве с Android 16, также будет работать в других ОС при надлежащей настройке.

ffmpeg -i https://ice2.somafm.com/deepspaceone-64-aac -t 60s -c copy '/sdcard/My Music/'live_stream.aac

Требования: FFmpeg установлен, Termux CLI (для мобильных устройств).


Добавлено: 05.05.2026, 01:45 | Последнее обновление: 05.05.2026, 01:45

BATch Processing: автоматическое переименование файлов

Переименовать все файлы в текущем, либо в заданном каталоге с помощью стандартного пакетного .BAT скрипта Windows.

 Предположим, что у вас есть 1000500 неких графических (или иного типа) файлов, например, цифровых снимков, на которых вы со своим котом, отмечаете его день рождения.
В общем, вам нужно привести имена этих файлов в определённое, последовательное наименование по шаблону 00001.jpg, 00002.jpg, 00003.jpg... - ...00184.jpg, 00185.jpg, 00186.jpg и т. д. Для этого, мы воспользуемся стандартным пакетным сценарием Windows, скриптом, который по щелчку, будет мгновенно (ну почти) переименовывать все наши файлы, в чёткую последовательность от 0001 до... бесконечности.

  1. Создайте каталог INPUT и поместите в него «груду» своих *.JPG файлов, которые собираетесь переименовать.
  2. Откройте обычный Блокнот Windows и скопируйте код ниже в Блокнот, сохраните ваш файл с расширением BAT ("Сохранить как... ---> Все файлы ---> RENAMER.bat") рядом с нашей папкой INPUT.

Пакетный сценарий:

@COLOR 0A
@MODE CON COLS=130 LINES=50
@ECHO.

@ECHO OFF
setlocal enabledelayedexpansion

SET i=100000
SET X=1
FOR %%a IN (INPUT\*.png;INPUT\*.jpg;INPUT\*.gif) DO (
    SET /A i+=1
    SET /A n+=1
    SET "filename=!i:~%X%!"
    ECHO   Rename "%%a" --- "!filename!%%~xa"
    REN "%%a" "!filename!%%~xa"
)

@ECHO.
@ECHO      %n% files have been renamed
@ECHO.

@PAUSE