Advertisement
Guest User

Untitled

a guest
Aug 18th, 2010
562
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.31 KB | None | 0 0
  1. #!/bin/bash
  2. #параметры скрипта можно получить из нумерованных переменных $1, $2, $3...
  3. #можно и дальше использовать $1, но так понятнее
  4. srcFileName="$1"
  5. # Получаем длину файла в секундах
  6. #для этого просим mplayer показать подробную информацию о файле (-identify), а сам файл не проигрывать (-frames 0 - количество кадров, которые надо показать)
  7. #в этом выводе будет строка с длительностью в секундах (например ID_LENGTH=278.00)
  8. #перенаправляем стандартный поток вывода (stdout) mplayer на стандартный поток ввода (stdin) следующей программы
  9. #для этого используем конструкцию, называемую конвейером/трубой (pipe) - "|"
  10. #следующей программой будет grep - она просмотрит все строки файла или, если файл не указан, stdin и оставит только те, в которых найдет искомую подстроку, заданную в параметрах.
  11. #в данном случае grep оставит нам все строки (там она одна такая), содержащие ID_LENGTH
  12. #результат работы этого конвеера (mplayer -> grep) мы при помощи конструкции $() присваиваем переменной timeString
  13. timeString=$( mplayer "$srcFileName" -frames 0 -identify | grep ID_LENGTH )
  14. #конструкция ${timeString} эквивалентна $timeString и просто вернет значение переменной timeString
  15. #конструкция ${timeString##ID_LENGTH=} отрежет от переменной timeString слева подстроку максимальной длины, удовлетворяющую патерну ID_LENGTH=
  16. #конструкция ${timeString#ID_LENGTH=} отрезала бы подстроку минимальной длины
  17. #в данном случае патерн является константной строкой, так что ## и # эквивалентны
  18. #отрезаем от timeString (ID_LENGTH=278.00) слева ID_LENGTH=
  19. fileTime=${timeString##ID_LENGTH=}
  20. #если # заменить на %, то подстрока будет вырезаться справа
  21. #отрезаем от fileTime(278.00) справа .*, где * - любое количество любых символов
  22. #тут опять безразлично что использовать: % или %% - точка всего одна
  23. fileTime=${fileTime%.*}
  24.  
  25. # начало куска семпла в секундах (0, 4*60 секунд, 8*60 секунд)
  26. startPos=0
  27. # номер семпла, нужен для генерации имен временных файлов
  28. i=0
  29. # список семплов
  30. tmpFiles=""
  31. # конструкция while <условие>; do <действия>; done будет циклически выполнять <действия> пока <условие> истинно
  32. # в качестве условия может выступать значение переменной или результат работы программы
  33. # конструкция [[ ... ]] производит некоторые логические операции
  34. # в данном случае параметр -lt требует проверить, что первый аргумент ($startPos) численно меньше второго ($fileTime)
  35. while [[ $startPos -lt $fileTime ]]; do
  36.         # хитрое кодлунство для получения имени временного файла в виде tmpFileXXX.mp3, где XXX = 001, 002, 003... 010 ...
  37.         # достаточно tmpFile$i.mp3 - тогда XXX = 1, 2, 3... 10 ...
  38.         tmpFileName=tmpFile$(printf "%.3d\n" $i).mp3
  39.         # добавляем к списку семплов только что созданное имя
  40.         tmpFiles="${tmpFiles} ${tmpFileName}"
  41.         # увеличиваем номер семпла
  42.         # конструкция (( )) производит арифметические операции
  43.         i=$(($i + 1))
  44.         # вырезаем семпл
  45.         ffmpeg -ss $startPos -t 30 -vn -acodec copy -i "$srcFileName" $tmpFileName;
  46.         # увеличиваем начальную позицию нового семпла на 4 минуты
  47.         startPos=$(($startPos + 240))
  48. done
  49.  
  50. # склеиваем семпл
  51. # в качестве источника (после -i) указываем stdin (-)
  52. # многие программы понимают, что если вместо имени файла стоит "-", то данные надо брать из stdin
  53. # на ввод ffmpeg конвейером подаем вывод cat.
  54. # cat читает файлы из переданного списка и отправляет их на stdout
  55. cat $tmpFiles | ffmpeg -vn -acodec copy -i - "${srcFileName%.*}.samples.mp3"
  56.  
  57. # удаляем временные файлы
  58. rm $tmpFiles
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement