Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #параметры скрипта можно получить из нумерованных переменных $1, $2, $3...
- #можно и дальше использовать $1, но так понятнее
- srcFileName="$1"
- # Получаем длину файла в секундах
- #для этого просим mplayer показать подробную информацию о файле (-identify), а сам файл не проигрывать (-frames 0 - количество кадров, которые надо показать)
- #в этом выводе будет строка с длительностью в секундах (например ID_LENGTH=278.00)
- #перенаправляем стандартный поток вывода (stdout) mplayer на стандартный поток ввода (stdin) следующей программы
- #для этого используем конструкцию, называемую конвейером/трубой (pipe) - "|"
- #следующей программой будет grep - она просмотрит все строки файла или, если файл не указан, stdin и оставит только те, в которых найдет искомую подстроку, заданную в параметрах.
- #в данном случае grep оставит нам все строки (там она одна такая), содержащие ID_LENGTH
- #результат работы этого конвеера (mplayer -> grep) мы при помощи конструкции $() присваиваем переменной timeString
- timeString=$( mplayer "$srcFileName" -frames 0 -identify | grep ID_LENGTH )
- #конструкция ${timeString} эквивалентна $timeString и просто вернет значение переменной timeString
- #конструкция ${timeString##ID_LENGTH=} отрежет от переменной timeString слева подстроку максимальной длины, удовлетворяющую патерну ID_LENGTH=
- #конструкция ${timeString#ID_LENGTH=} отрезала бы подстроку минимальной длины
- #в данном случае патерн является константной строкой, так что ## и # эквивалентны
- #отрезаем от timeString (ID_LENGTH=278.00) слева ID_LENGTH=
- fileTime=${timeString##ID_LENGTH=}
- #если # заменить на %, то подстрока будет вырезаться справа
- #отрезаем от fileTime(278.00) справа .*, где * - любое количество любых символов
- #тут опять безразлично что использовать: % или %% - точка всего одна
- fileTime=${fileTime%.*}
- # начало куска семпла в секундах (0, 4*60 секунд, 8*60 секунд)
- startPos=0
- # номер семпла, нужен для генерации имен временных файлов
- i=0
- # список семплов
- tmpFiles=""
- # конструкция while <условие>; do <действия>; done будет циклически выполнять <действия> пока <условие> истинно
- # в качестве условия может выступать значение переменной или результат работы программы
- # конструкция [[ ... ]] производит некоторые логические операции
- # в данном случае параметр -lt требует проверить, что первый аргумент ($startPos) численно меньше второго ($fileTime)
- while [[ $startPos -lt $fileTime ]]; do
- # хитрое кодлунство для получения имени временного файла в виде tmpFileXXX.mp3, где XXX = 001, 002, 003... 010 ...
- # достаточно tmpFile$i.mp3 - тогда XXX = 1, 2, 3... 10 ...
- tmpFileName=tmpFile$(printf "%.3d\n" $i).mp3
- # добавляем к списку семплов только что созданное имя
- tmpFiles="${tmpFiles} ${tmpFileName}"
- # увеличиваем номер семпла
- # конструкция (( )) производит арифметические операции
- i=$(($i + 1))
- # вырезаем семпл
- ffmpeg -ss $startPos -t 30 -vn -acodec copy -i "$srcFileName" $tmpFileName;
- # увеличиваем начальную позицию нового семпла на 4 минуты
- startPos=$(($startPos + 240))
- done
- # склеиваем семпл
- # в качестве источника (после -i) указываем stdin (-)
- # многие программы понимают, что если вместо имени файла стоит "-", то данные надо брать из stdin
- # на ввод ffmpeg конвейером подаем вывод cat.
- # cat читает файлы из переданного списка и отправляет их на stdout
- cat $tmpFiles | ffmpeg -vn -acodec copy -i - "${srcFileName%.*}.samples.mp3"
- # удаляем временные файлы
- rm $tmpFiles
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement