Есть коллекция видеофайлов из 1023 штук. Все лежат в одной папке. У меня такая вот задача: сделать скриншот на 7 секунде из каждого файла и поместить их в папку folder, которая лежит в той же папке, где хранятся эти видеофайлы. Пробовал решить задачу двумя способами. Точнее одним, а на втором экспериментировал, экспериментировал, но так удобоваримого результата не получил.
Первый вариант сделан в стиле python-zen, то есть я по максимуму сделал упрощение, примитивизировал решение, поделил его на кучу «простых» задач.
Во втором варианте, я решил немного поиграть в кулхацкера и замахнулся даже на владение приёмами regex. Получилось краткое решение, мне оно нравится, почему-то. Люблю краткость. Но вот незадача, почему-то скрипт работает менее эффективно. То есть, вместо 1023 штук скриншотов он делает 900 штук.
В общем-то, такой вариант меня бы тоже устроил, но хотелось бы понять, в чём моя ошибка. Может быть я с синтаксисом намудрил? Переборщил с regex?
Первый вариант работает на ура, делает 1015 штук - меня это устраивает вполне.
То, что ни тот, ни другой вариант не делает все 1023 штуки скриншотов - меня устраивает, потому что некоторые скрины, судя по логам, цепляются с какими-то ошибками и отказами и т.п., то есть ffmpeg «решает» их пропускать. Это не проблема.
Проверьте, пожалуйста, второй вариант. Может быть, незамыленный глаз увидит лучше.
Вариант №1
#!/bin/bash
# Папка для сохранения превьюшек должна находится в той же папке, в которой находятся видеофайлы!!
# Статья, где я взял команду по ffmpeg находится здесь: https://annimon.com/article/4008
folder_to_save="folder"
# 1. Находим скриншоты для mp4-файлов
for file in *.mp4; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mp4}_${RANDOM}.jpeg"
done
# 2. Находим скриншоты для avi-файлов
for file in *.avi; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.avi}_${RANDOM}.jpeg"
done
# 3. Находим скриншоты для rmvb-файлов
for file in *.rmvb; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.rmvb}_${RANDOM}.jpeg"
done
# 4. Находим скриншоты для 3gp-файлов
for file in *.3gp; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.3gp}_${RANDOM}.jpeg"
done
# 5. Находим скриншоты для mov-файлов
for file in *.mov; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mov}_${RANDOM}.jpeg"
done
# 6. Находим скриншоты для mpg-файлов
for file in *.mpg; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mpg}_${RANDOM}.jpeg"
done
# 7. Находим скриншоты для flv-файлов
for file in *.flv; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.flv}_${RANDOM}.jpeg"
done
# 8. Находим скриншоты для mkv-файлов
for file in *.mkv; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mkv}_${RANDOM}.jpeg"
done
# 9. Находим скриншоты для mpeg-файлов
for file in *.mpeg; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mpeg}_${RANDOM}.jpeg"
done
# 10. Находим скриншоты для mp-файлов
for file in *.mp; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mp}_${RANDOM}.jpeg"
done
# 11. Находим скриншоты для wmv-файлов
for file in *.wmv; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.wmv}_${RANDOM}.jpeg"
done
Вариант №2
#!/bin/bash
# Упрощённый вариант (получилось всего 900 картинок, а надо было 1023)
for file in {*.mp4,*.avi,*.rmvb,*.3gp,*.mov,*.mpg,*.flv,*.mkv,*.mpeg,*.mp,*.wmv}; do
ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "folder/${file%.[mp4,avi,rmvb,3gp,mov,mpg,flv,mkv,mpeg,mp,wmv]}_${RANDOM}.jpeg"
done
Перемещено hobbit из general