кодирование музыки в mp3 без разрывов

a10063

был у меня raw-файл
разбил я его на 5 файлов и закодировал в mp3 отдельно
возможно ли слить mp3-шки вместе, чтобы результат был как от кодирования целого raw-файла, т.е. без разрывов (gapless encoding)?
у lame есть опция --nogap, но я так и не понял, как ей воспользоваться (даже после поиска ) - может, кто-нибудь подскажет?

otvertka07

> возможно ли
нет, это собственно основой недостаток mp3

a10063

может, какие-нибудь аргументы приведешь?

otvertka07

думаю, ты сам их найдешь без особых усилий, я по памяти не вспомню, но вся проблема в алгоритме - при кодировании в mp3 длительность немного увеличивается с начала и с конца, ну если глубоко копнуть, то типа в особенности использования FFT вся трабла заключается, если тебе это интересно - можешь в гугле поискать на эту тему

a10063

это понятно, но я как раз понял (поискав, перед тем, как задать вопрос что кодеры вроде lame умеют с этим справляться
только вот не пойму, как использовать
в инете мало примеров, и все они, почему-то, работают не так, как я рассчитываю

apl13

Поставь CoolEdit и спасти все с точностью до тысячной доли секунды.

otvertka07

я не в курсе... поробуй почитать ман к лэйму

a10063

cooledit-like tool у меня есть, однако все дело в автоматизации , поэтому нужно делать с помощью ком. строки
2: жаль
а ман я, конечно, читал, но тот мне не помог
надо будет на свежую голову еще попробовать

ppplva

Проблема в том, чтобы сделать это без перекодирования ?

a10063

да хоть как-нибудь

ppplva

Тогда не вижу проблемы. Попробуй каким-нибудь ***Edit'ом, типа того что Ден предлагает.

ppplva

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

a10063

раз это приписано спец. образом, то вероятно, что можно автоматически определить это и убрать
***edit-ом не подходит, потому что нужен человек
а описанная задача будет выполняться часто, считай, каждый день, поэтому все должно быть автоматически

ppplva

Тогда sox
Он умеет обрезать, но что-то мне кажется, что это не потребуется. Ибо декодер сам может обрезать, и я не вижу для него причины этого не делать.

a10063

да не, тут не все так просто...
нужно же знать, что отрезать...
кстати, я нашел здесь, что --nogap у lame - это нечто другое, чем я ожидал (ему нужно отдавать raw-files, а он из них сделает mp3-шки, которые можно играть без gap-ов; полезно для концертных записей)
т.о. с mp3 уже не сделать этим ничего...
еще нашел древний фак по lame, там 6 вопросов, самый главный вот
1. Why is a decoded MP3 longer than the original .wav file?
Because LAME (and all other MDCT based encoders) add padding to the
beginning and end of each song. For an explination of why,
see the questions below.
LAME embeds the amount of padding in the ancillary data of the
first frame of the MP3 file. (LAME INFO tag). The LAME decoder
will use this information to remove the leading padding of an MP3 file.
Modifications to the decoder so that it will also remove the
trailing padding have not yet been made.
последнее меня огорчило, но, мб, за 5 лет что-то изменилось...

ppplva

Прямой эксперимент показывает, что ничего не изменилось
Есть перловый модуль для чтения INFO tag, есть прога mp3info. Обои два не выдают нужных значений. Остается только патчить Должно быть несложно.

a10063

что патчить-то?

ppplva

Перловку, наверное, проще. Мне. Тебе - не знаю
Чтоб выдавала значения padding. Потом в sox можно будет по ним обрезать.
Спецификация где-то в интернете валялась.

a10063

я не совсем тебя понимаю
перловый скрипт выдает padding в начале, а mp3info - в конце? или как?

ppplva

Оба не выдают ничего. Зато они показывают много других полей, откуда я сделал вывод, что достать нужную информацию будет несложно.
lame --decode --verbose выдает padding в начале. Возможно, проще будет пропатчить его.

a10063

с отступом вначале проблемы почти нет - lame сам при декодировании пропускает эти сэмплы
а вот что делать с добавленными в конец?
mp3info судя по всему читает всякие там тэги и этим ограничивается тех. инфа
а как называется перловый модуль?
кстати, а правильно я понимаю, что даже если буду резать raw как надо, то это не поможет?
3.  Why does LAME add silence to the end of each song?
Extra padding at the end of a file can be caused by a couple of things:
1. Because the MDCT's are overlapped, it looks something like this:
<--576 MDCT coefficients--><--576 MDCT coefficients--><--576 MDCT coefficients-->
<-- 576 samples PCM output --><-- 576 samples PCM output -->
So no matter where you truncate your MP3 file, the last 288 samples of
that granule will not be decoded. So LAME appends 288 samples of
padding to the input file to guarantee all input samples will be
decoded.
2. If the number of samples is not an exact multiple of 1152,
then last frame of data is padded with 0's so that it has 1152 samples.
Before lame3.56, we just added a few extra frames to make sure all
internal buffers would be flushed. In lame3.56, we tried to pad
with the exact minimum number of samples needed. And in lame3.80,
we finally fixed the bitstream flushing so that the final mp3
frame is properly padded with ancillary data.

т.е. если у меня будет 1152, он мне добавит еще 288
если будет 1152+288, он добавит еще 288*3, чтобы делилось на 1152?
проверить не могу, т.к. не знаю как посчитать длину sample у raw-файла и те же ли это сэмплы в mp3?
вообще не понимаю, какой смысл в этом сдвиге (п.1)... все сэмплы одинаковы по сути

a10063

еще есть такая идея:
1. я знаю, какой длины был raw
2. я знаю padding в начале
=> могу декодировать, отрезать кусок от начала, а потом взять нужное мне кол-во байт с начала
как думаете, прокатит?
конечно, это walkaround, т.к. п.1 не всегда известен в общем случае

a10063

lame --decode --verbose выдает padding в начале.
оказывается, что фигню он выдает, а не padding
короче, закодировал файл длиной 115200 байт, сэмпл - 4 байта
 $ lame --decode --verbose w.mp3
input: w.mp3 (44.1 kHz, 2 channels, MPEG-1 Layer III)
output: w.mp3.wav (16 bit, Microsoft WAVE)
skipping initial 1105 samples (encoder+decoder delay)
Frame# 27/27 128 kbps

открываю в audacity (***edit)
визуально 2250 сэмплов в начале и 60 сэмплов в конце
checksum: 115200/4 + 2250 + 60 ~= 31104 - столько сэмплов в mp3
а на глаз определять тишину - это не дело
Оставить комментарий
Имя или ник:
Комментарий: