LINUX.ORG.RU

[потестируйте] DTS Encoder


1

2

Если у вас нет акустической системы 5.1, подключенной по цифре (S/PDIF или HDMI) и понимающей DTS - можно дальше не читать.

Прошу протестировать ALSA-плугин, который позволяет выводить многоканальный звук из произвольного приложения (а не только готовый DTS-звук от DVD-плеера и т.п.) на такую акустическую систему путем конвертирования в DTS «на лету». Такое преобразование необходимо, т.к. несжатый многоканальный PCM в SPDIF не влезает.

В составе alsa-plugins есть нечто аналогичное для AC3. Сам проверить не могу, т.к. у меня ресивера, понимающего DTS, нет.

В случае успешного тестирования я завтра выпущу версию 1, в случае неуспешного тестирования - буду чинить.

Инструкция:

1. Скачать для контроля готовый DTS-файл, сделанный не моим кодеком: например, http://www.diatonis.com/downloads/diatonis_dts_wav_secret-universe.zip

2. Выяснить правильное название устройства spdif или hdmi:

$ aplay -L

У меня получается «hdmi:CARD=Intel,DEV=0». Для простановки бита non-audio, в конец надо добавить ",AES0=6", т.е. у меня получается «hdmi:CARD=Intel,DEV=0,AES0=6»

3. Проиграть готовый DTS wav-файл, чтобы убедиться, что ресивер действительно понимает DTS:

unzip diatonis_dts_wav_secret-universe.zip
aplay -D "hdmi:CARD=Intel,DEV=0,AES0=6" diatonis_dts_secret-universe.wav
mplayer -ao 'alsa:device=hdmi={CARD Intel DEV 0 AES0 6}' -ac hwdts  diatonis_dts_secret-universe.wav

При ошибке «устройство занято» надо подождать, пока другая программа (вероятно, pulseaudio) освободит его, и повторить попыткую

Если aplay не работает, а mplayer работает - модель ресивера в студию с пометкой «требует заворачивания DTS в IEC61937», дальше не читать. Если обе команды шипят или молчат - ресивер DTS не понимает, дальше можно не читать.

4. Поставить заголовочные файлы от ALSA. В Ubuntu это apt-get install libasound2-dev.

5. Скачать и поставить dtsenc из git:

git clone git://gitorious.org/dtsenc/dtsenc.git
cd dtsenc
autoreconf -f -i -v
./configure --prefix=/usr   # в другом префиксе ALSA-плугин работать не будет
make
sudo make install

6. Скачать 5.1 flac, который обычными средствами через spdif не играется. Например, отсюда: http://www.linnrecords.com/linn-downloads-testfiles.aspx (см. конец страницы).

7. Понизить частоту дискретизации, переконвертировать в DTS:

ffmpeg -i ForUntoUsSurround88.flac -ar 44100  ForUntoUsSurround44.wav
dcaenc ForUntoUsSurround44.wav   ForUntoUsSurround44.dts 1411200

8. Попробовать вывести получившийся dts-файл через spdif:

aplay -D "hdmi:CARD=Intel,DEV=0,AES0=6" -f cd ForUntoUsSurround44.dts

Результат (молчит | шипит | поет | заикается) и модель ресивера - в студию. Если молчит или шипит - дальше не читать.

mplayer -ac hwdts работать не будет, т.к. использована вся доступная полоса spdif, и места для заголовка IEC61937 нет. При желании можно исправить, в main.c существующий вызов dcaenc_create() надо поменять вот на что:

c = dcaenc_create(f->sample_rate, channel_map[f->channels - 1], bitrate,
    f->channels == 6 ? DCAENC_FLAG_LFE | DCAENC_FLAG_28BIT : DCAENC_FLAG_28BIT);

9. Создать в домашнем каталоге файл .asoundrc с таким содержимым:

pcm.dca {
	type dca
	slave.pcm "hdmi:CARD=Intel,DEV=0,AES0=6"
}

Проверить ALSA-плугин mplayer'ом:

mplayer -channels 6 -ao alsa:device=dca -af resample=44100 ForUntoUsSurround88.flac

10. Если у кого-то получится завести с моим плугином pulseaudio - инструкцию в студию.

Результат и модель ресивера - в студию.

★★★★★

Искажатели звука, они по всюду, они везде.

bhfq ★★★★★ ()

Неужели ни у кого нет ресивера с поддержкой DTS???

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

> Зачем? Есть же компьютер.

Ну компьютер тоже нужен ;) А колонки к нему можно подключать либо аналоговым проводом, либо по SPDIF через ресивер.

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

А не лучше через HDMI, если уж с жиру беситься? Чтобы не мучиться с перекодированием?

// но как по мне, так лучше обычным аналоговым проводом. Все 6/8 колонок.

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

Через HDMI действительно лучше, тогда действительно, в идеальном случае перекодирование не требуется. Однако, HDMI не у всех есть. И даже если он есть, некоторые видеокарты накладывают ограничение на битрейт звука, такое же, как при передаче по SPDIF.

AEP ★★★★★ ()

1. Скачал.
2. Выяснил (iec958:CARD=NVidia,DEV=0,AES0=6).
3. aplay все нормально проиграл. mplayer ставить было лень.
4. Поставил.
5. Немного помучившись собрал.
6. Скачал (http://download.linnrecords.com/test/flac/ForUntoUsSurround88.aspx).
7. Переконвертировал, правда частоту дискретизации 6-канального WAV-файла уменьшал через sox — ffmpeg это делать отказался («Resampling with input channels greater than 2 unsupported.»)
8. Ресивер NAD T474 молчит, хотя на дисплее появляется надпись «DTS». На другой машине mplayer, впрочем, этот файл декодирует и играет.

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

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

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

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

1) Запретить кодеку выбрасывать какие бы то ни было частоты. Для этого надо подправить в функции init_quantization_noise() присваивание переменной c->abits[band][ch] следующим образом:

                        c->abits[band][ch] = (snr_cb >= 1312) ? 26
                                : (snr_cb >= 222) ? (8 + mul32(snr_cb - 222, 69000000))
                                : (snr_cb >= 0) ? (2 + mul32(snr_cb, 106000000))
                                : 1;

2) Правильно учитывать выбрасываемые частоты. Для этого в int_data.h в массиве bit_consumption[] первый элемент изменить с 0 на -8 (т.к. есть 8 бит, которые по сравнению с обычным случаем не передаются).

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

Спасибо, способ 1 сработал: ресивер заиграл, в том числе и при кодировании «на лету» через ALSA-плагин. Способ 2, примененный отдельно либо совместно со способом 1, никакого влияния не оказал. Вот только при воспроизведении через ресивер на фоне музыки слышны приглушенные булькающе-клокочущие звуки. При программном декодировании полученного DTS-файла mplayer'ом этих звуков нет.

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

Закоммитил. Насчет булькания надо будет разобраться отдельно.

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

Есть подозрение, что булькающе-клокочущие звуки связаны с неправильной упаковкой бит в поддиапазонах, где abits < 8. Для отладки прошу протестировать плугин со следующим изменением в функции init_quantization_noise():

                        c->abits[band][ch] = (snr_cb >= 1312) ? 26
                                : (snr_cb >= 222) ? (8 + mul32(snr_cb - 222, 69000000))
                                : 8;

Это не настоящее исправление - просто чтобы подтвердить или опровергнуть мое предположение о месте, где спряталась ошибка.

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

Предположение оказалось неверным, прошу изменение выше игнорировать. Баг был в ALSA-плугине, а не в самом кодере.

AEP ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.