Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нормализация звуковой дорожки в видео файлов
Россия-2 > Форумы поддержки работающих проектов > Линукс для всех > Работа в Linux - графика/аудио/видео
Slon
Люди добрые.
Обращаюсь к вам за помощью по созданию скрипта.
Я нуб так что не обесуте.
Беда у меня со всеми этими цыклами и орфографией. smile.gif
Задался я тут таким вопросом.
Есть коллекция фильмов, клипов, тв передач которые я периодически пересматриваю.
Беда в том что один файл орет, а другой шепчет. Вот и приходится подскакивать после такого шептуна. Достало.
Хочу чтоб у всех файлов громкость была одинаковая на тихая короче нормальная.

Вот тут я начал ваять и закончить не могу.
Код
#!/bin/sh

# извлекаем звуковую дорожку
find . -name "*.avi" -exec ffmpeg -i {} -vn -acodec copy -f mp3 {}.mp3 \;

# удаляем лишнее из названия файлов
find . -name '*.mp3' -exec rename 's/.avi././' {} \;

# нормализовать mp3
find . -name '*.mp3' -exec normalize-audio -b {} \;

# вставляем звуковую дорожку
mp3=find . -name "*.mp3" {} \;
avi=find . -name "*.avi" {} \;
ffmpeg -i $mp3 -i $avi -y $avi


Люди добрые поможите довести мысль до конца.
Rus349Lan
"Нормализация звука видеофайлов" http://softhelp.org.ua/?p=2661

Slon
Спасибо за подсказку, но это не совсем то.
Код
for i in *avi; do mencoder "$i" -ovc copy -oac mp3lame -lameopts cbr:br=128:vol=5 -o "Vol5_${i}"; done;

этот скрипт просто приподнимает громкость в значении от 0 до 10. Мне то нужно нормализация, зачем мне поднимать громкость итак в громких файлах.
IVK
У вас основная проблема в чём? В том, что не совсем ясно, что надо сделать с этими файлами, или в том, что не совсем ясно, как написать скрипт? Я, к примеру, во внутренностях видео/аудиофайлов особо не рылся, так что мне тут не очень понятно как раз первое - что именно (не "вообще", а в деталях) надо сделать с файлами. То есть не знаю. как выполняется нормализация.
Slon
Попробую объяснить.
Вобшем есть коллекция видео файлов, она находится на машине под ОС Дебиан (без графики), на этой машине поднят Transmission и Mebiatomb.
Вот файлы мы иногда просматриваем всей семьёй по телику. Ну и тут как раз заключается беда закачиваем на машину какой не будь новый фильмец а он шепчет не черта неслышно (руки по отдирать таким риперам) телек естественно на всю громкость, а за ним нормальный фильм с нормальной громкостью ну результат короче ясен.
Ну короче я загнался этим вопросом покурил гугол выяснил что напрямую это зделать нельзя но можно нормализовать громкость в mp3 файле вот и родилась мысль создать скрипт который извлекает к примеру из avi ауди дорожку в mp3 файл в этом файле нормализует громкость и обратно вставляет ауди дорожку в avi файл.
Вот и возникла у меня проблема с написанием данного скрипта.
Ну как то так.
IVK
Зачем всё это нужно - мне как раз ясно; и даже удивляюсь, почему до сих пор нет простого решения этой довольно актуальной проблемы. Вопрос в другом. Я, к примеру, не могу написать требующийся тут скрипт потому что не знаю, что конкретно он должен делать. какова последовательность действий, которые он должен выполнять. У вас та же проблема, или же вы чётко представляете себе эту последовательность, а сложность состоит в том, как её изложить в виде кода?
kostyalamer
Вот тут товарищи эту тему обсуждали, может чего-нибудь полезное почерпнете для себя :
http://linuxforum.ru/post/310949
посмотрел внимательней скрипт тот же самый.
kostyalamer
Вот тут уже интереснее:
http://forum.ubuntu.ru/index.php?topic=207371.0
в 5-ом ответе
Slon
Это я все читал.
В первом случаи просто повышает громкость а не нормализует. Зачем увеличивать громкость итак громкому файлу.
И -vf volnorm 2:0.2 в mencoder не работает.
Во втором случаи в принципе тоже самое. В пятом ответе
Цитата
-vf volnorm 2:0.2 это вместо какого пункта нужно вставить?
.
Повторюсь -vf volnorm 2:0.2 в mencoder не работает. В mencoder вообще нет такой фунции
Slon
IVK.
Ну попробую обрисовать мое виденье алгоритма кода.
Скрипт проходит по заданному каталогу и под каталогу находит все файлы с расширением к примеру AVI извлекает из них аудио дорожку и сохраняет ее в виде файла MP3 с аналогичным именем что и исходник. Далее он все MP3 файлы нормализует по громкости (где надо добавляет, а где и убавляет громкость). Затем он должен в исходном файле AVI заменит аудио дорожку на уже нормализованную из MP3 файла ну естественно файлы должны иметь идентичные имена smile.gif .
Результат должен быть сохранен с иным названием на всякий случай. К примеру исходник "Мумия.avi" а результат "Мумия_norm.avi".
Ну как то так.
robinzoid
Жаль что у Вас без графики. Эту задачу в Аудасити решить совсем запросто. Точно так же как просто звуковой файл в программе можно открыть видеоролик. звук из него она сама высосет. http://www.proshkolu.ru/user/robinzoid/file/4864057/
Slon
robinzoid
Под графикой каждый файл по отдельности.
Ужас. У меня 5367 файлов из них 4274 мультиков для ребенка. Полная коллекция СССРовских мультов плюс современные лунтики да фиксики всякие. Короче огромная коллекция.
Обрабатывать каждый по отдельности. Либо за большую зарплату, либо из-за большой любви к процессу.
IVK
На каком этапе дело застопорилось? Вот вытащил скрипт звуковые дорожки, нормализовал их командой -exec normalize-audio - так? Cами эти дорожки в виде файлов .mp3 нормализовались, и вопрос в том, как вернуть их на место, или же нет? До какого этапа скрипт успешно выполняет свою работу?
Slon
Дело имено в склейке файлов.
Скрипт успешно выполняет эту часть
Код
#!/bin/sh

# извлекаем звуковую дорожку
find . -name "*.avi" -exec ffmpeg -i {} -vn -acodec copy -f mp3 {}.mp3 \;

# удаляем лишнее из названия файлов
find . -name '*.mp3' -exec rename 's/.avi././' {} \;

# нормализовать mp3
find . -name '*.mp3' -exec normalize-audio -b {} \;

А дальше я что то не как не соображу что делать, какой то клин в голове.
Помогите пожалуйста.
IVK
А если сначала попробовать, для проверки, хотя бы в один файл вставить скриптом его нормализованную дорожку?
robinzoid
Цитата(Slon @ 26.4.2015, 11:08) *
robinzoid
... У меня 5367 файлов из них 4274 мультиков для ребенка....

Ну это в корне меняет дело.
Slon
Цитата(IVK @ 26.4.2015, 11:52) *
А если сначала попробовать, для проверки, хотя бы в один файл вставить скриптом его нормализованную дорожку?

Команда выглядеть так
Код
ffmpeg -i Мумия.mp3 -i Мумия.avi Мумия_norm.avi

и работает.
Вот как ее в скрипте реализовать.
Код
ffmpeg -i(опуия источник) Мумия.mp3(файл со с звуковой дородкой) -i(опять источник) Мумия.avi(файл видео) Мумия_norm.avi(выходной файл)

для себя вижу примерно так

  • функция переменой к примеру MP3 поиск файла с расширением mp3
  • функция переменой к примеру AVI поиск файла с расширением avi но по имени переменой MP3
  • Если если оба файла нашлись то выполнить команду "ffmpeg -i $MP3 -i $AVI $AVI_norm.avi"
  • Если оба файла не найдено вывести сообщение "к файлу "$MP3" не найдено видео источника"
IVK
Скрипт при отделении файлов звуковых дорожек должен вписывать имена файлов в список и потом по этому списку вставлять дорожки обратно. На Питоне это так:
Код
for x in [тут список названий файлов без расширений]:
    subprocess.call ("ffmpeg -i "+x+".mp3 -i "+x+".avi "+x+"_norm.avi",shell=True)

На sh тоже что-то в этом роде. Ну, временное удаление пробелов в названиях или ещё что-то в этом роде - проблемы легко решаемые.
Slon
Ага.
Значит я создаю файл со списком и куда его воткнуть чтоб это работало.
Вот что у меня получается
Код
#!/bin/sh

# извлекаем звуковую дорожку
find . -name "*.avi" -exec ffmpeg -i {} -vn -ar 44100 -ac 2 -ab 128 -f mp3 {}.mp3 \;

# удаляем лишнее из названия файлов
find . -name '*.mp3' -exec rename 's/.avi././' {} \;

# нормализовать mp3
find . -iname '*.mp3' -exec normalize-audio -b {} \;

# создаем список
rm list_tmp.txt list_tmp2.txt
find . -name "*.mp3" -exec echo {} >> list_tmp.txt \;
cat list_tmp.txt | sed 's/.mp3//g' > list_tmp2.txt
cat list_tmp2.txt | cut -c 3- > list.txt

IVK
Там даже можно не файл со списком, а просто список. Я shell поверхностно знаю, так что лучше просто изложу алгоритм.
1. Создаётся пустой список.
2. При извлечении дорожки из каждого видеофайла его имя (без расширения) вносится в этот список.
3. Когда дело доходит до возвращения нормализованных дорожек на место, скрипт открывает этот список и по нему легко находит (без всякого find, просто по циклу for x in) все требующиеся файлы - и с дорожками, и видео. Во всяком случае, если файлы в одном каталоге, то всё должно работать.
Slon
Гы.
Вроде все вырисовывается, осталось пробелы убрать.
По результату отпишусь.
Slon
Промежуточный вариант.

Код
#!/bin/sh

# замена пробелов на _
find -name "* *" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr ' ' _)"; done

# извлекаем звуковую дорожку
find . -name "*.avi" -exec ffmpeg -i {} -vn -ar 44100 -ac 2 -ab 128 -f mp3 {}.mp3 \;

# удаляем лишнее из названия файлов
find . -name '*.mp3' -exec rename 's/.avi././' {} \;

# нормализовать mp3
find . -iname '*.mp3' -exec mp3gain -r -c -s r {} \;

# создаем список
rm list.txt list_tmp.txt list_tmp2.txt
find . -name "*.mp3" -exec echo {} >> list_tmp.txt \;
cat list_tmp.txt | sed 's/.mp3//g' > list_tmp2.txt
cat list_tmp2.txt | cut -c 3- > list.txt

# вставляем звуковую дорожку
for x in $(cat list.txt);
do
ffmpeg -i "${x}".mp3 -i "${x}".avi -vcodec copy -acodec copy "${x}"_norm.avi;
done

# удаляем mp3 файлы и все временые файлы
find . -name *.mp3 -delete
rm list.txt list_tmp.txt list_tmp2.txt

exit 0


для нормализации mp3 я изменил с normalize-audio на mp3gain вроде бы пишут что она лучше.
Slon
Тут подумал и решил что пробелы нужно вернуть

Код
#!/bin/sh

# замена пробелов на _
find -name "* *" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr ' ' _)"; done

# извлекаем звуковую дорожку
find . -name "*.avi" -exec ffmpeg -i {} -vn -ar 44100 -ac 2 -ab 128 -f mp3 {}.mp3 \;

# удаляем лишнее из названия файлов
find . -name '*.mp3' -exec rename 's/.avi././' {} \;

# нормализовать mp3
find . -iname '*.mp3' -exec mp3gain -r -c -s r {} \;
#find . -iname '*.mp3' -exec normalize-audio -b {} \;

# создаем список
rm list_tmp.txt list_tmp2.txt
find . -name "*.mp3" -exec echo {} >> list_tmp.txt \;
cat list_tmp.txt | sed 's/.mp3//g' > list_tmp2.txt
cat list_tmp2.txt | cut -c 3- > list.txt

# вставляем звуковую дорожку
for x in $(cat list.txt);
do
ffmpeg -i "${x}".mp3 -i "${x}".avi -vcodec copy -acodec copy "${x}"_norm.avi;
done

# удаляем все временные файлы
find . -name *.mp3 -delete
rm list.txt list_tmp.txt list_tmp2.txt

# возвращаем пробелы
find -name "*_*" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr '_' ' ')"; done

exit 0
IVK
И как, работает? Я потом обязательно у себя попробую; тоже есть что, так сказать, нормализовать, просто прямо сейчас не до этого, да и самой идеи не было, пока вы не подсказали smile.gif
Slon
На небольшом количестве файлов (4-5) работает довольна быстро.
Сейчас я его запустил на выполнение на всю коллекцию.
5367 файлов это довольно много. Да и я ступил, надо было скрипт в скрине запустить. Теперь придётся комп включенным держать.
Slon
На все про все ушло полутро суток.
скрипт не обработал 15 файлов почему не знаю.
глюков в самих файлов пока не обнаружил ну в тех которых я просмотрел.
Drool
Это, конечно, хорошо. Но не проще ли было бы вместо уродования двуковой дорожки в MP3, просто включить в видеопроигрывателе нормализацию звука?
Slon
Цитата(Drool @ 30.4.2015, 13:12) *
Это, конечно, хорошо. Но не проще ли было бы вместо уродования двуковой дорожки в MP3, просто включить в видеопроигрывателе нормализацию звука?

Может я что то пропустил.
Как в телевизоре это сделать?
Drool
А, если для телевизора разве что. Я решил, что это подгоняется под просмотр на PC.
Slon
Небольшой фикс.
Так как mp3gain по умолчанию нормализует на уровень громкости 89dB нам может быть или мало или много этого уровня.
Чтобы это изменить нам нужно добавить ещё один ключ.
Чтобы получить уровень скажем 95dB.
Изменим эту строчку.
Код
find . -iname '*.mp3' -exec mp3gain -r -c -s r {} \;

добавим такой ключ -d 6
в результате 89+6=95 а если нужно убавить то пишем -d -4 в результате 89-4=85.
Ну во такой факс на 95dB
Код
find . -iname '*.mp3' -exec mp3gain -r -d 6 -c -s r {} \;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2017 IPS, Inc.