LINUX.ORG.RU

Сжатие mp3

 ,


0

1

Пытаюсь массово сжать mp3-файлы в рандомном числе каталогов.

#!/bin/sh
find ./ -type f -iname "*.mp3" -printf "%p\n" | while read f
do
    fname="${f%.mp3}"
    ffmpeg -i "$fname.mp3" -acodec libmp3lame -vn -ac 1 -ab 11k "$fname.mp3";
done

Естественно названия файла одинаковые и ничего не получится. Как бы так сделать, чтобы оно записывало или в те же названия файлов или не ломая общую логику наименования файлов?

Недавно разбирали вопрос с использованием ffmpeg в цикле.

find ... | while read filename; do
    ffmpeg -nostdin -i "$filename" ... "${filename/\.mp3/-compressed.mp3}"
done
anonymous ()
Ответ на: комментарий от gremlin_the_red

Ой.. Точно. Другое же имя и переименовать. Совсем мозги за 10 лет без программирования отвалились. Спасибо.

А почему плохая идея? Плеер держит только мп3. Надо сжать их посильнее.

LightDiver ★★★★★ ()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от gremlin_the_red

Изначально у меня мп3. Флаков нет.

У меня аудиокниги. Мне нужно их сжать так, чтобы размер был минимален, а качество слухабельным. Лучше всего получается в аас, но плеер его не поддерживает.

LightDiver ★★★★★ ()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

Прочитал. Ты спросил зачем тут цикл. Я использую то, что знаю. Если ты знаешь вариант лучше - внимательно выслушаю. Цель - перегнать 100500 вложенных каталогов в более низкое качество.

По вариантам качества тоже принимаю предложения.

LightDiver ★★★★★ ()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Так я написал что цикл тут можно выкинуть и просто использовать exec. Ну и твою проблему то я решил, так что ты цикл можешь оставить и всего лишь одну правку внести, раз он так тебе нравится.

По вариантам качества ничего не могу предложить.

micronekodesu ★★ ()
Последнее исправление: micronekodesu (всего исправлений: 1)
Ответ на: комментарий от LightDiver
find ./ -type f -iname "*.mp3" -exec sh -c 'filename={}; ffmpeg -i  $filename <тут всякие параметры ffmpeg> "$(dirname $filename)"/"$(basename -s .mp3 $filename)"_converted.mp3' \;

Здесь "$(dirname $filename)"/"$(basename -s .mp3 $filename)"_converted.mp3 - это чтоб имя файла отличалось - если исходник ./foo/bar.mp3 то на выхое будет создан ./foo/bar_converted.mp3. Можно и через временный файл и переименование сделать - тогда это можно выкинуть (просто тот же temp.mp3 писать) и потом добавить точку с запятой и mv.

micronekodesu ★★ ()
Ответ на: комментарий от gremlin_the_red

Тот прожил уже 11 лет и до сих пор держит часа 4. Но это уже новый. Новый не поддерживает.

А еще тут опять беда:

http://pastebin.calculate-linux.ru/ru/show/133217

Гадит этим 100500 строк. Пишет, что файл не найден. Ничего не понимаю.

LightDiver ★★★★★ ()
Ответ на: комментарий от gremlin_the_red

Читал. Так он почему то берет кусок файла, гадит непонятным кодом и выдает ошибку именно на несуществующее имя. Причем не всегда.

Output file #0 (./8/0008_36m_00s__00m_42s_9h_converted.mp3):

2s_9h.mp3: No such file or directory

LightDiver ★★★★★ ()
Ответ на: комментарий от micronekodesu

Короче, не знаю почему, но мой вариант ругается на отсутствие файлов, которых и правда не существует:

http://pastebin.calculate-linux.ru/ru/show/133221

.mp3: No such file or directory

find ./ -type f -iname "*.mp3" -exec sh -c 'filename={}; ffmpeg -i  $filename <тут всякие параметры ffmpeg> "$(dirname $filename)"/"$(basename -s .mp3 $filename)"_converted.mp3' \;

Однако это точно работает. Ну и фиг с ним, пущай работает. Еще бы параметры подобрать оптимальные и все.

Ну разве что немножко ругается: [mp3 @ 0x55ffbdacea00] Estimating duration from bitrate, this may be inaccurate

LightDiver ★★★★★ ()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от anonymous

Что знаю, то и использую.

Слушай, да - сокс весьма удобен. Я же им пользовался уже. Только найти бы как им обнулять теги.

LightDiver ★★★★★ ()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от anonymous

Потестировал сокс и ффмпег. Ффмпег в 2-4 раза быстрее, имеет больше настроек, как мне показалось приравных настройках генерирует файлы чуть меньше. Однако, не умеет ниже 22 кбит/с.

А вот сокс невероятно медленный, непонятно как работать с тэгами, возможно нужно чем то дополнительно, зато умеет 16 кбит/с, которые при этом звучат гораздо лучше, чем 22 кбит/с от ффмпег.

Не мп4, конечно, но весьма неплохо. Спасибо за подсказку, надо еще ковырять параметры:

sox -S 001.mp3 -c 1 -r 22050 -b 32000 -C 16 01.mp3 gain -n -5

ffmpeg -i 001.mp3 -acodec libmp3lame -vn -aq 1 -ar 22050 -ac 1 -qscale:a 11 -b:a 16k 002222.mp3

LightDiver ★★★★★ ()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

надо еще ковырять параметры

Попробуй ещё pacpl (Perl Audio Converter). Он работает с утилитами madplay, lame и еже напрямую. Мож им добъёшься нужного тебе аффекта.

ЗЫ: У sox (впрочем как и ffmpeg) есть ещё один негативный момент: он не имеет параметров, управляющих чтением. Т.е. он сначала читает звук, а потом только применяет аргументы. Это не позволяет устранять такую нехорошую вещь, как клиппинг.

anonymous ()
Ответ на: комментарий от anonymous

Can’t locate String/ShellQuote.pm in @INC (you may need to install the String::ShellQuote module) (@INC contains: /etc/perl /usr/local/lib64/perl5/5.30.1/x86_64-linux-thread-multi /usr/local/lib64/perl5/5.30.1 /usr/lib64/perl5/vendor_perl/5.30.1/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.30.1 /usr/local/lib64/perl5 /usr/lib64/perl5/vendor_perl/5.28.2 /usr/lib64/perl5/vendor_perl/5.26.2 /usr/lib64/perl5/vendor_perl /usr/lib64/perl5/5.30.1/x86_64-linux-thread-multi /usr/lib64/perl5/5.30.1) at /usr/bin/pacpl line 27. BEGIN failed–compilation aborted at /usr/bin/pacpl line 27.

Ой мля, ну началось. В генте его официально нету, сборка из исходников приведет к перебиранию половины системы. Думаю, остановлюсь на соксе.

LightDiver ★★★★★ ()
Ответ на: комментарий от LightDiver

Для уменьшения плохости DCT-фильтрации MP3-кодека попробуй также предфильтрацию https://github.com/xiph/rnnoise, либо поизголятся в sox: https://stackoverflow.com/questions/44159621/how-to-denoise-audio-with-sox . Но это всё долго.

anonymous ()