Страница 1 из 1

shell script ffmpeg

Добавлено: 2016-11-02 15:32:39
pimlab
Решил тут свою фильмотеку привести в порядок.
На просторах нета выкопал и собрал скрипт,который пережимает и выравнивает звук у конечного ролика, но вот не задача где-то теряется точка и ffmpeg сxодит с ума.
по порядку..

Код: Выделить всё

#! /bin/sh
dir="./2007/"
for ext in AVI avi; do for file in $dir*.$ext; 
do
volumeinfo=$(ffmpeg -hide_banner -i "$file" -af volumedetect -vn -f null /dev/null 2>&1)
vfvol=$(echo "$volumeinfo" | sed -nr '/max_volume:/ s/.*[[:space:]]-?([[:digit:]\.]+)[[:space:]]+dB$/\1/p')  
echo "$file volume=${vfvol}"
 /usr/local/bin/ffmpeg -hide_banner -i "$file" \
  -c:v libx264 -preset veryslow -crf 20 -pix_fmt yuv420p -y \
 -tune film -profile:v high \
 -map_metadata 0 -vf smartblur \
 -metadata:s:a:0 language=rus -metadata:s:v:0 language=rus \
 -c:a libfdk_aac -b:a 128k \
 -ar 44100 -af "volume="${vfvol}"dB"  \
 -f mp4 $dir"$(basename  "$file" .$ext).mp4"
как и положено

Код: Выделить всё

echo "$file volume=${vfvol}"
на тeстовом ролике выводит "тест.avi volume=5.4"
Но далее в config ffmpeg уже подставляет 5 4 без точки и ffmpeg уже работает не верно... 4 для него выходной фаил.
почему теряется точка?

shell script ffmpeg

Добавлено: 2016-11-03 9:58:00
BlitzKrieg
Попробуйте поменять . на \. например.
В общем и целом я бы попробовал эту строчку повыполнять разным образом экранируя . с целью добиться искомого результата без скрипта.

shell script ffmpeg

Добавлено: 2016-11-03 10:24:27
pimlab
BlitzKrieg писал(а):Попробуйте поменять . на \. например.
В общем и целом я бы попробовал эту строчку повыполнять разным образом экранируя . с целью добиться искомого результата без скрипта.
Где экранировать?
Мы видимо друг друга не поняли...
По ходу выполнения скрипта получаю

Код: Выделить всё

echo "$file volume=${vfvol}"
в консоли "тест.avi volume=5.4"
а далее он вставляет

Код: Выделить всё

-ar 44100 -af "volume="${vfvol}"dB"

Код: Выделить всё

-ar 44100 -af volume=5 4db
если вписать руками ,то само собой все отрабатывает

Код: Выделить всё

-ar 44100 -af volume=5.4db
, но ведь цель автоматизировать

попробуйте у себя запустить

shell script ffmpeg

Добавлено: 2016-11-03 10:52:21
BlitzKrieg
Я все правильно понял. Попробуйте сделать так, чтобы у вас переменная vfvol содержала \. т.е. чтобы echo "${vfvol}" выводило 5\.4.

Отправлено спустя 12 минут 14 секунд:
И да, было бы лучше, если после /bin/bash была бы пустая строка :-) mc тогда подсвечивает :-)

shell script ffmpeg

Добавлено: 2016-11-03 11:11:54
pimlab
сработало ! спасибо !

shell script ffmpeg

Добавлено: 2016-11-03 11:15:28
BlitzKrieg
У вас там натурально sh или какой интерпретатор? Я попробовал с враппером+бузибокс и эффекта такого не достиг.

shell script ffmpeg

Добавлено: 2016-11-03 11:19:37
pimlab
если кому надо, то вот конечный работаюший скрипт

Код: Выделить всё

#! /bin/sh

dir="./2007/"

for ext in AVI avi; do for file in $dir*.$ext;
do
volumeinfo=$(ffmpeg -hide_banner -i "$file" -af volumedetect -vn -f null /dev/null 2>&1)
vfvol=$(echo "$volumeinfo" | sed -nr '/max_volume:/ s/.*[[:space:]]-?([[:digit:]\.]+)[[:space:]]+dB$/\1/p' | sed /[.]/\. /) 
echo "$file volume=${vfvol}"
 /usr/local/bin/ffmpeg -hide_banner -i "$file" \
  -c:v libx264 -preset veryslow -crf 20 -pix_fmt yuv420p -y \
 -tune film -profile:v high \
 -map_metadata 0 -vf smartblur \
 -metadata:s:a:0 language=rus -metadata:s:v:0 language=rus \
 -c:a libfdk_aac -b:a 128k \
 -ar 44100 -af "volume="${vfvol}"dB"  \
 -f mp4 $dir"$(basename  "$file" .$ext).mp4"

Отправлено спустя 2 минуты 12 секунд:
BlitzKrieg писал(а):У вас там натурально sh или какой интерпретатор? Я попробовал с враппером+бузибокс и эффекта такого не достиг.
чтото мне кажется это из-за UTF в консоли.
с bash таже песня