ОсновноеRadiotalkПользовательское
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

Качество звука при снятии двух каналов с линейного входа одновременно

 

2
homm @homm
Добрый день.
Я поставил сервер трансляции интернет-радио для одного из самых популярных офлайновых радио в городе (Челябинск).
Операционная система ubuntu server, сервер трансляции icecast2, стример — ices2. Соответственно формат вещания — OGG. Данные снимались с линейного аудиовхода. Еще когда я мучался с установкой звука, я предусмотрел многпользовательский доступ к аудиоустройствам как на запись, так и на воспроизведение (кажется esd это называется).
И все бы было хорошо, но понадобился еще один поток, обязательно в mp3 формате, для обслуживания встроенных на сайтах Flash-плееров, потому что flash к 10 версии, будь он не ладен, так и не научился воспросизводить OGG.
Нагуглил для этой цели Darkice. Собрал, включил, прослушал, все хорошо, mp3 поток работает нормально. Включил OGG и ужаснулся, поток был с деффектом (суть деффекта объясню ниже). Стал разбиратся, выяснил, что причина диффекта именно включение другого стримера в лице даркайса. Т.е. как только я его выключаю, все ОК. Стал его внимательнее разглядывать, увидел что top выдает у него приоритет -99 (высокий). Не nice, а именно приоритет. Погуглив с часок так и не нашел штатных средств ОС для понижения приоритета. Пошел в исходники, закоментировал повышение приоритета, персобрал, запустил.
Теперь ices2 потоки стали получше, но глюки полностью не прекратились. И на MP3 потоках тоже появились деффекты.
В общем как не мучался, как не искал соотношение между разными nice для этих приложений, так и не удалось убрать диффекты на обоих стриммерах сразу, до исправления оставил конфмгурацию так, что на OGG каличество дифектов чуть меньше чем на MP3.

Суть деффектов в следующем: Каждые 2-10 секунд звук перепрыгивает. Т.е. поток идет непрерывно, музыка не перестает играть, но периодически пропадет то пол секунды, то секунда звука. Как будто вырезаны. Естественно просто так время пропадать не может, канал берется с линейного входа, и рано или поздно звуку просто неоткуда взяться, стример провисает на 3-5 секунд, чтобы заполнить буферы, опустошенные пропавшем временем.

Адрес сервера: **********/ можете сами послушать деффекты (повторюсь, на MP3 более замтены).

Это точно не качество связи и не пропавшие пакеты. Я думаю что это происходит из-за блокировок аудиоустройства каждым стримером. У кого больше приоритет (меньше nice) тот и лучше себя чувствует. Это также не связано с загрузкой процессора, кодирование всех 4-х потоков не отъедает более 12% общей мощности процессора.

Очень надеюсь хотябы на предположения что это может быть. Готов, если нужно, выложить любые конфиги стримеров и сервера. Сейчас еще поищу конфиг esd, выложу первым ответом.

Добавлено спустя 4 минуты 29 секунд:
Конфиг /etc/asound.conf
[mono]pcm.card0 {
type hw
card 0
# mmap_emulation true
}

#pcm.dmix0 {
# type dmix
# ipc_key 34521
# slave {
# pcm "card0"
# }
#}


pcm.dmix0 {
type dmix
ipc_key 1024 ## needs to be a power of 2
slave {
pcm "hw:0"
period_time 0
period_size 1024
buffer_size 8192
#format S16_LE
rate 44100 ## not necessary
}
#slowptr true
}

pcm.dsnoop0 {
type dsnoop
ipc_key 2048
slave {
pcm "card0"
#rate 48000
}
}

pcm.asym0 {
type asym
playback.pcm "dmix0"
capture.pcm "dsnoop0"
}

pcm.pasym0 {
type plug
slave.pcm "asym0"
}

# 'dsp0' is espected by OSS emulation etc.
pcm.dsp0 {
type plug
slave.pcm "asym0"
}

ctl.dsp0 {
type hw
card 0
}

pcm.!default {
type plug
slave.pcm "asym0"
}

ctl.!default {
type hw
card 0
}[/mono]

2
homm @homm
Проблему решил.
Для тех кому будет интересно и кто найдет тему в гугле:
Неплохой мануал по конфигам alsa: **********
Оттуда я взял секцию pcm.dsnoop0 (см предыдущий конфиг) и получилось вот что:
[mono]pcm.dsnoop0 {
type dsnoop
ipc_key 2048
slave {
pcm "card0"
channels 2
period_size 1024
buffer_size 8192
rate 48000
periods 0
period_time 0
}
}[/mono]

Нужно обратить внимание на увеличенный буфер (8192 против начальных 4096) и periods 0.
Что такое periods я не разобрался. Однако после рестарта сервера ices отказался запускаться с формулировкой, что ему нужно хотя-бы periods=2.
Пришлось открыть его конфиг и кое чего поправить:
[mono]<input>
<module>alsa</module>
<param name="rate">48000</param>
<param name="channels">2</param>
<param name="device">default</param>
<param name="periods">0</param>
<param name="buffer-time">500</param>
</input>[/mono]
После этого запустились и ices и darkice. Оба потока без прерываний.
Сказать точно что помогло — увеличение буфера или устранение periods не могу, а выянять на работающем сервере не хочется.

2605
Александр @AlexIT
Спасибо за то что публично поделились решением проблемы!
В будущем может помочь другим.