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

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

★★★★★

Последнее исправление: LightDiver (всего исправлений: 1)

ffmpeg -i "$fname.mp3" -acodec libmp3lame -vn -ac 1 -ab 11k "${fname}_converted.mp3";

Но вообще это делается через exec, зачем тут этот цикл через принт?

micronekodesu ★★★
()

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

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

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

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

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

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

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

А почему плохая идея?

Потому что алгоритмы такие. Качество падает катастрофически. flac→mp3(320kbit)→mp3(128kbit) по качеству будет хуже, чем flac→mp3(96kbit).

gremlin_the_red ★★★★★
()
Ответ на: комментарий от 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 ★★★
()
Ответ на: комментарий от LightDiver

Да если цикл работает то можно им пользоваться, какая разница, тут надо просто задачу решить, это ж не картина чтоб им любоваться.

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)
Ответ на: комментарий от micronekodesu

Оооу! до меня дошло что такое exec. Это же просто перенаправление вложенной команды в основную. Спасибо.

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

mp3 2020

Если залезть на рутрекер, то там все книжки в mp3

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

mp3 — худший кодек из используемых.

Чем он хуже? Конкретно для книг, когда моно и битрейт в лучшем случае 48 kbps?

.

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

Чем он хуже? Конкретно для книг, когда моно и битрейт в лучшем случае 48 kbps?

Хуже минимум тем, что speex 8kbps будет не хуже (скорее, лучше) mp3 48kbps.

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

speex рвёт всех остальных просто в хламину

Меньше размер файлов? Так понимаю, чтобы его прослушать оффлайн, надо завернуть в ogg?

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

Сконвертил ffmpeg’ом – размер:

mp3: 2.84mb (95kbps)

spx: 921kb (30kbps)

Качество одинаковое.

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

MPEG-4 весит раза в два меньше при том же качестве. Иногда даже более чем в два раза. Вот только честные китайцы его не поддерживаю.

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

MPEG-4 весит раза в два меньше при том же качестве.

Это ты еще OPUS не пользовал.

А зачем пользовать ffmpeg, если исходняк - mp3 и результат - mp3? Почему не пользовать sox или madplay+lame?

anonymous
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от LightDiver

непонятно как работать с тэгами

lltag --clear you.mp3
lltag -a <val> -t <val> -A <val> -n <val> -g <val> -d <val> -c <val> you.mp3

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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.