Skip to content

Обработка звука с IP камер

Обработка звука с IP камер

Большинство IP камер умеют отдавать звук только в кодеках PCMA/PCMU (также известных как G.711a и G.711u).

Flussonic Media Server умеет записывать аудио такого формата в архив и отдавать его по тем протоколам, которые поддерживают этот кодек - RTMP и HDS.

Другие протоколы не подразумевают передачи этого кодека, поэтому отправить такой звук по HLS или выгрузить в MP4 так, чтобы клиент услышал звук, не получится.

Для того, чтобы все клиенты могли услышать звук, следует включить транскодирование звука с IP камеры.

Для этого надо сначала установить пакет flussonic-transcoder:

Note

Пакет flussonic-transcoder необходим только в случае, если вы планируете использовать CPU для выполнения транскодирования. Если вы используете Nvidia NVENC, то он не нужен.

apt-get install -y flussonic-transcoder

Теперь включите транскодирование звука на потоке с камеры следующим образом:

stream origin {
 url fake://fake;
}
stream camera {
 url rtsp2://localhost/origin;
}

или так

stream camera1 {
 url rtsp://localhost:553/bunny.mp4 aac=true;
}

Так Flussonic Media Server осуществит транскодирование звука в кодек AAC и сможет отдавать его всем клиентам по всем протоколам.

Особенности записи аудио с IP камер

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

Для того, чтобы предотвратить подобное поведение и исключить его в будущем, во Flussonic введён параметр buffer_length. Он определяет количество фреймов для буферизации. Более того, значение buffer_length, делённое на 2, определяет максимальное число фреймов видео, которое может быть принято без аудио фреймов. После чего сервер не станет сохранять аудиодорожку.

Как это работает?

Давайте рассмотрим пример конфигурации в файле /etc/flussonic/flussonic.conf:

stream example_name {
  url rtsp://localhost/origin buffer_length=200;
}

Поток с именем example_name осуществляет захват видео и аудио фреймов с IP камеры с указанным URL. В случае, если по истечении 100 видео фреймов от источника не поступит аудио, то сервер перестанет ждать и не будет записывать аудиодорожку.
Параметр buffer_length, равный 200 в нашем примере, как раз и значит, что Flussonic на протяжении указанного количества фреймов, делённого пополам, ожидает аудио, пропуская только видео. Если он не так и не получает звук, то аудиодорожка просто не будет записываться. Таким образом, будет произведена запись только видеопотока. По умолчанию параметр buffer_length равен 100.

Если Вы укажете в качестве параметра, например, число 300, то это означает, что Flussonic будет накапливать 150 видео фреймов без аудио и, не получив его, не станет записывать дорожку со звуком.

В лог-файле Вы увидите следующую запись (при buffer_length=100):

Dropping audio because 51 video frames queued (max 50), but still no audio frame