FLAC

Список разделов foobar2000 Аудиоформаты

Описание: Аудиоформаты, конвертация и другие связанные вопросы

Сообщение #41 postED » 25.08.2018, 02:24

Провел тут самоликбез по ffmpeg-овскому энкодеру флаки, что основан на наработках альтернативного flake. Имеет степени сжатия 0-12, и 11-12 считаются non-subset (могут возникнуть сложности при воспроизведении на железках). Немного инфы из мануалов:
Код: Выделить всё
Levels 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 and 10 should generate subset-compatible streams, 11 and 12 should not. The difference is that 11 and 12 are allowed to use a much larger predictor (32) order which is not allowed in the subset. Other than that, there is no subset-incompatible behaviour.
Код: Выделить всё
[flac @ 000000000034ff60]  compression: 0
[flac @ 000000000034ff60]  lpc type: Fixed pre-defined coefficients
[flac @ 000000000034ff60]  prediction order: 2, 3
[flac @ 000000000034ff60]  order method: estimate
[flac @ 000000000034ff60]  partition order: 2, 2
[flac @ 000000000034ff60]  block size: 1152
[flac @ 000000000034ff60]  lpc precision: 15

[flac @ 000000000034ff60]  compression: 1
[flac @ 000000000034ff60]  lpc type: Fixed pre-defined coefficients
[flac @ 000000000034ff60]  prediction order: 0, 4
[flac @ 000000000034ff60]  order method: estimate
[flac @ 000000000034ff60]  partition order: 2, 2
[flac @ 000000000034ff60]  block size: 1152
[flac @ 000000000034ff60]  lpc precision: 15

[flac @ 0000000002c2ff60]  compression: 2
[flac @ 0000000002c2ff60]  lpc type: Fixed pre-defined coefficients
[flac @ 0000000002c2ff60]  prediction order: 0, 4
[flac @ 0000000002c2ff60]  order method: estimate
[flac @ 0000000002c2ff60]  partition order: 0, 3
[flac @ 0000000002c2ff60]  block size: 1152
[flac @ 0000000002c2ff60]  lpc precision: 15

[flac @ 0000000002bfff60]  compression: 3
[flac @ 0000000002bfff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002bfff60]  prediction order: 1, 6
[flac @ 0000000002bfff60]  order method: estimate
[flac @ 0000000002bfff60]  partition order: 0, 3
[flac @ 0000000002bfff60]  block size: 4608
[flac @ 0000000002bfff60]  lpc precision: 15

[flac @ 0000000002b2ff60]  compression: 4
[flac @ 0000000002b2ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002b2ff60]  prediction order: 1, 8
[flac @ 0000000002b2ff60]  order method: estimate
[flac @ 0000000002b2ff60]  partition order: 0, 3
[flac @ 0000000002b2ff60]  block size: 4608
[flac @ 0000000002b2ff60]  lpc precision: 15

[flac @ 0000000002b8ff60]  compression: 5
[flac @ 0000000002b8ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002b8ff60]  prediction order: 1, 8
[flac @ 0000000002b8ff60]  order method: estimate
[flac @ 0000000002b8ff60]  partition order: 0, 8
[flac @ 0000000002b8ff60]  block size: 4608
[flac @ 0000000002b8ff60]  lpc precision: 15

[flac @ 0000000002b2ff60]  compression: 6
[flac @ 0000000002b2ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002b2ff60]  prediction order: 1, 8
[flac @ 0000000002b2ff60]  order method: 4-level
[flac @ 0000000002b2ff60]  partition order: 0, 8
[flac @ 0000000002b2ff60]  block size: 4608
[flac @ 0000000002b2ff60]  lpc precision: 15

[flac @ 000000000034ff60]  compression: 7
[flac @ 000000000034ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 000000000034ff60]  prediction order: 1, 8
[flac @ 000000000034ff60]  order method: log search
[flac @ 000000000034ff60]  partition order: 0, 8
[flac @ 000000000034ff60]  block size: 4608
[flac @ 000000000034ff60]  lpc precision: 15

[flac @ 0000000002bcff60]  compression: 8
[flac @ 0000000002bcff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002bcff60]  prediction order: 1, 12
[flac @ 0000000002bcff60]  order method: 4-level
[flac @ 0000000002bcff60]  partition order: 0, 8
[flac @ 0000000002bcff60]  block size: 4608
[flac @ 0000000002bcff60]  lpc precision: 15

[flac @ 0000000002b9ff60]  compression: 9
[flac @ 0000000002b9ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002b9ff60]  prediction order: 1, 12
[flac @ 0000000002b9ff60]  order method: log search
[flac @ 0000000002b9ff60]  partition order: 0, 8
[flac @ 0000000002b9ff60]  block size: 4608
[flac @ 0000000002b9ff60]  lpc precision: 15

[flac @ 0000000002b2ff60]  compression: 10
[flac @ 0000000002b2ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002b2ff60]  prediction order: 1, 12
[flac @ 0000000002b2ff60]  order method: full search
[flac @ 0000000002b2ff60]  partition order: 0, 8
[flac @ 0000000002b2ff60]  block size: 4608
[flac @ 0000000002b2ff60]  lpc precision: 15

[flac @ 0000000002bbff60]  compression: 11
[flac @ 0000000002bbff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 0000000002bbff60]  prediction order: 1, 32
[flac @ 0000000002bbff60]  order method: log search
[flac @ 0000000002bbff60]  partition order: 0, 8
[flac @ 0000000002bbff60]  block size: 4608
[flac @ 0000000002bbff60]  lpc precision: 15

[flac @ 000000000035ff60]  compression: 12
[flac @ 000000000035ff60]  lpc type: Levinson-Durbin recursion with Welch window
[flac @ 000000000035ff60]  prediction order: 1, 32
[flac @ 000000000035ff60]  order method: full search
[flac @ 000000000035ff60]  partition order: 0, 8
[flac @ 000000000035ff60]  block size: 4608
[flac @ 000000000035ff60]  lpc precision: 15
Код: Выделить всё
FLAC encoder AVOptions:
  -lpc_coeff_precision <int>        E...A.... LPC coefficient precision (from 0 to 15) (default 15)
  -lpc_type          <int>        E...A.... LPC algorithm (from -1 to 3) (default -1)
     none                         E...A....
     fixed                        E...A....
     levinson                     E...A....
     cholesky                     E...A....
  -lpc_passes        <int>        E...A.... Number of passes to use for Cholesky factorization during LPC analysis (from 1 to INT_MAX) (default 2)
  -min_partition_order <int>        E...A.... (from -1 to 8) (default -1)
  -max_partition_order <int>        E...A.... (from -1 to 8) (default -1)
  -prediction_order_method <int>        E...A.... Search method for selecting prediction order (from -1 to 5) (default -1)
     estimation                   E...A....
     2level                       E...A....
     4level                       E...A....
     8level                       E...A....
     search                       E...A....
     log                          E...A....
  -ch_mode           <int>        E...A.... Stereo decorrelation mode (from -1 to 3) (default auto)
     auto                         E...A....
     indep                        E...A....
     left_side                    E...A....
     right_side                   E...A....
     mid_side                     E...A....
  -exact_rice_parameters <boolean>    E...A.... Calculate rice parameters exactly (default false)
  -multi_dim_quant   <boolean>    E...A.... Multi-dimensional quantization (default false)
  -min_prediction_order <int>        E...A.... (from -1 to 32) (default -1)
  -max_prediction_order <int>        E...A.... (from -1 to 32) (default -1)
Для дальнейшего увеличения сжатия можно попробовать ключем -lpc_type сменить алгоритм LPC с levinson на cholesky ценой незначительного падения скорости кодирования. Ключ -lpc_passes регулирует количество проходов cholesky - чем выше значение, тем ниже скорость кодирования. Стандартно 2, разумные значения от 2 до 10.
Ключ -exact_rice_parameters 1 еще мизерно увеличивает сжатие
Ключ -multi_dim_quant 1 для самых мазохистов терпеливых. Скорость словно при серьезном видеокодировании :insane:.
postED M
Аватара
Откуда: Криворіжжя
Репутация: 115
С нами: 14 лет 11 месяцев

Сообщение #42 Azaza » 07.09.2018, 00:22

postED:block size: 4608
Такие файлы хоть и не являются non-subset, но на деле могут вызывать проблемы у некоторых железных плееров, которые не поддерживают размер блока больше 4096. Пример1, пример 2

А какую команду в ffmpeg нужно использовать, чтобы увидеть эту информацию?
[flac @ 000000000034ff60] compression: 0
[flac @ 000000000034ff60] lpc type: Fixed pre-defined coefficients
[flac @ 000000000034ff60] prediction order: 2, 3
[flac @ 000000000034ff60] order method: estimate
[flac @ 000000000034ff60] partition order: 2, 2
[flac @ 000000000034ff60] block size: 1152
[flac @ 000000000034ff60] lpc precision: 15
Azaza M
Аватара
Репутация: 412
С нами: 8 лет 2 месяца

Сообщение #43 postED » 07.09.2018, 03:41

Azaza:А какую команду в ffmpeg нужно использовать, чтобы увидеть эту информацию?
Не знаю. Нашел я эту инфу на xiph'овском mailing list. Наиболее достоверную инфу можно получить читая исходники энкодера.
postED M
Аватара
Откуда: Криворіжжя
Репутация: 115
С нами: 14 лет 11 месяцев

Сообщение #44 postED » 24.01.2021, 06:43

Нужно пояснение по поводу оконных функций и как они работают вместе. Хоть в мануале и написано "When more than one function is specified, then for every subframe the encoder will try each of them separately and choose the window that results in the smallest compressed subframe", при перетасовке функций результат поменялся.

Параметры, принятые в текущей версии как -8
Код: Выделить всё
flac -l 12 -b 4096 -m -r 6 -A tukey(5e-1);partial_tukey(2);punchout_tukey(3) test.wav -o test1.flac
test.wav: wrote 31598469 bytes, ratio=0,499
Если тукей отправить в конец
Код: Выделить всё
flac -l 12 -b 4096 -m -r 6 -A partial_tukey(2);punchout_tukey(3);tukey(5e-1) test.wav -o test2.flac
test.wav: wrote 31595058 bytes, ratio=0,499

Второй файл оказался даже слегка меньше, чем со стандартными параметрами. Так как все же это работает?..
postED M
Аватара
Откуда: Криворіжжя
Репутация: 115
С нами: 14 лет 11 месяцев

Сообщение #45 postED » 24.08.2021, 05:06

Решил еще раз потестить энкодер пакета ffmpeg - и он вполне хорош. Если массовую (насыщенную) музыку он сжимает несколько хуже референсного энкодера, то эмбиент может лучше. А иногда заметно лучше, достигая уровня максимального сжатия wavpack - чтобы получить хотя бы близкую степень сжатия на референсном энкодере, нужно добавлять -e -p и увеличивать значения partial_tukey и punchout_tukey, что снижает скорость сжатия до совсем уж неприличных значений.

Строки для фубара (ключи -lpc_type cholesky, -lpc_passes 10 и -exact_rice_parameters 1 улучшают сжатие за счет уменьшения скорости, все три вместе на моем пк замедляют кодирование примерно в 5-6 раз):

Уровень 10 (subset), размер блока 4096. Файл, сжатый этими параметрами, просто обязан читаться любым железным плеером.
Код: Выделить всё
-i - -compression_level 10 -frame_size 4096 %d
-i - -compression_level 10 -frame_size 4096 -lpc_type cholesky -lpc_passes 10 -exact_rice_parameters 1 %d

Уровень 10 (subset), размер блока по-умолчанию (4608)
Код: Выделить всё
-i - -compression_level 10 %d
-i - -compression_level 10 -lpc_type cholesky -lpc_passes 10 -exact_rice_parameters 1 %d

Уровень 12 (non-subset), размер блока по-умолчанию (4608). Далеко не все железки могут потянуть, но фубар без проблем читает.
Код: Выделить всё
-i - -compression_level 12 %d
-i - -compression_level 12 -lpc_type cholesky -lpc_passes 10 -exact_rice_parameters 1 %d

Результаты на хорошо сжимаемом тестовом файле (минималистический дарк эмбиент от Phragments).

flac -8: 386 kbps. Бинарник версии 1.3.3 из пакета Free Encoder Pack
flac -8 -e -p: 374 kbps. Скорость наверно раз в 30 ниже.

ffmpeg, уровень 10, размер блока 4096: 354 kbps. Скорость где-то в полтора раза ниже flac -8
ffmpeg, уровень 10, размер блока 4608: 353 kbps.

ffmpeg, уровень 10, размер блока 4096, дополнительные ключи: 352 kbps. Скорость где-то в три раза выше flac -8 -e -p
ffmpeg, уровень 10, размер блока 4608, дополнительные ключи: 351 kbps.

ffmpeg, уровень 12: 351 kbps. Скорость по сравнению с уровнем 10 примерно в 4 раза ниже. И в пять раз выше, чем у flac -8 -e -p
ffmpeg, уровень 12, дополнительные ключи: 348 kbps. Скорость сопоставима с flac -8 -e -p

wavpack -hh -x3: 379 kbps. Скорость втрое ниже flac -8
wavpack -hh -x6: 355 kbps. Скорость в полтора раза выше -8 -e -p
postED M
Аватара
Откуда: Криворіжжя
Репутация: 115
С нами: 14 лет 11 месяцев

Сообщение #46 Azaza » 25.08.2021, 20:19

CUETools (CUETools.Flake) тоже не отстаёт.
-8 даёт почти такое же сжатие (а на некоторых файлах даже лучше), как ffmpeg -compression_level 12 -lpc_type cholesky -lpc_passes 10 -exact_rice_parameters 1. При этом скорость раз в 10 выше и сохраняется полная совместимость с железными плеерами.
-11 - если и попадаются файлы, на которых сжатие хуже, чем у ffmpeg -compression_level 12 -lpc_type cholesky -lpc_passes 10 -exact_rice_parameters 1 то разница совсем минимальна, а скорость раз в 6 выше.
Azaza M
Аватара
Репутация: 412
С нами: 8 лет 2 месяца

Сообщение #47 postED » 19.09.2021, 00:19

Azaza, в CUETools.Flake максимальное subset сжатие -8 -e 32 -s search --window-method search, или еще что-то можно добавить? Подробного мануала конечно не хватает, потому как не ясно, какие параметры приняты за -0 .. -11. Также не ясно, какие оконные функции используются.
postED M
Аватара
Откуда: Криворіжжя
Репутация: 115
С нами: 14 лет 11 месяцев

Сообщение #48 Azaza » 19.09.2021, 16:36

-8 -e 32 -s search -t search --window-method search -l 12 -r 0,8 -m akaike --max-precision 0,1 должно всё ещё давать subset файлы
Azaza M
Аватара
Репутация: 412
С нами: 8 лет 2 месяца

Сообщение #49 postED » 19.09.2021, 20:18

Azaza, бегло протестировал - дает побитово идентичный результат с моим вариантом. -t search точно входит в -8, так как с -t levinson сжатие немного слабее.
postED M
Аватара
Откуда: Криворіжжя
Репутация: 115
С нами: 14 лет 11 месяцев

Сообщение #50 Azaza » 24.02.2022, 01:29

Вышла новая версия официального кодера - 1.3.4. https://github.com/xiph/flac/releases/tag/1.3.4
Устранены некоторые проблемы с безопасностью и больше ничего существенного.
Скорость и сжатие не улучшены. Баги и недоработки, качающиеся кодирования и декодирования не исправлены.
Не исправлен даже баг, приводящий тому, что файл во FLAC может получиться в тысячи раз больше, чем исходный wav. Баг был "добавлен" между версиями 1.3.3 и 1.3.4. А вот неофициальная сборка между версиями 1.3.3 и 1.3.4, но с исправленным багом - https://hydrogenaud.io/index.php?topic=121349.msg1001821#msg1001821
Azaza M
Аватара
Репутация: 412
С нами: 8 лет 2 месяца

Сообщение #51 VEG » 17.04.2022, 23:26

Azaza:Не исправлен даже баг, приводящий тому, что файл во FLAC может получиться в тысячи раз больше, чем исходный wav.
Уже смержили фикс.

Добавлено спустя 20 минут 21 секунду:
Если ещё смержат вот это изменение, что немного улучшает сжатие, следующий релиз может получиться даже интересным =)
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 277
С нами: 12 лет 6 месяцев

Сообщение #52 VEG » 19.04.2022, 22:45

Что-то текущий разработчик FLAC в ударе, за последние дни много чего интересного смержил. Изменения касательно улучшения сжатия тоже.

Добавлено спустя 2 минуты 49 секунд:
Я бы ещё по умолчанию выставил бы максимальную степень сжатия. Сейчас железо такое мощное, что оно всё равно очень быстро всё жмёт. Зато лишние килобайтики экономит. В масштабах это более заметно =)
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 277
С нами: 12 лет 6 месяцев

Сообщение #53 VEG » 26.08.2022, 20:36

Тут обсуждаются потенциальные улучшения в степени сжатия.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 277
С нами: 12 лет 6 месяцев

Сообщение #54 VEG » 27.08.2022, 23:51

В каких-то (очень редких) случаях улучшение сжатия даже удивительно.

24bit96khz-extended.png
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 277
С нами: 12 лет 6 месяцев

Сообщение #55 Azaza » 09.09.2022, 22:52

Azaza M
Аватара
Репутация: 412
С нами: 8 лет 2 месяца

Сообщение #56 VEG » 10.09.2022, 00:43

  • Improved compression. The difference is only small for CD audio, but can be very large (> 10%) for low-passed material like most "high-resolution" downloads that do not contain any material above 20kHz but are sampled at 96kHz or even higher.
  • Presets 0, 1 and 2 got a little faster, 3, through 8 got a little slower.
  • Encoding and decoding of 32 bps audio is now possible (integer, not float).
  • Samplerates above 655'350Hz are now supported, up to 1'048'575Hz.
  • Many bug fixes of problems found by fuzzing.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 277
С нами: 12 лет 6 месяцев

Пред.

Вернуться в Аудиоформаты