NDI SDK 6 (macOS/Metal): асинхронное повреждение кучи видео и искажение аудиосигнала на потребительском оборудованииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 NDI SDK 6 (macOS/Metal): асинхронное повреждение кучи видео и искажение аудиосигнала на потребительском оборудовании

Сообщение Anonymous »

Контекст и оборудование:
  • Устройство: Mac Mini M4 (Tahoe 26.1), 16 ГБ ОЗУ, 512 ГБ SSD.
  • ОС: macOS Sequoia.
  • SDK: NDI SDK 6 (расширенный SDK).
  • Цель: Мультивьюер промышленного уровня. Входные данные: несколько источников NDI. Выход: одиночный поток NDI 4K 60 кадров в секунду со смешанным звуком.
Архитектура:

У нас есть собственный движок C++, использующий:
  • Видео: захват «нулевой копии» (shared_ptr) --> Metal Compositor (общее хранилище) --> NDI Sender.
  • Аудио: специальный поток, который извлекает аудиосэмплы float32 из всех активных источников, суммирует их и отправляет результат через NDIlib_send_send_audio_v3.
Мы столкнулись с двумя отдельными критическими проблемами, которые, по-видимому, связаны с тем, как NDI обрабатывает память и уровни сигнала.Проблема 1: угроза памяти при «асинхронной отправке».

Чтобы добиться разрешения 4K и 60 кадров в секунду, мы не можем использовать синхронную отправку (NDIlib_send_send_video_v2), поскольку копия памяти блокирует основной поток, снижая FPS до ~30.

Мы перешли на асинхронную отправку (NDIlib_send_send_video_async_v2), что решило проблему с FPS. (плавная частота 60 кадров в секунду), но приводили к случайным сбоям.
  • Симптом: Случайный std::system_error: ошибка блокировки мьютекса: неверный аргумент или EXC_BAD_ACCESS.
  • Триггер: Подключение нового источника или входов с высокой пропускной способностью (например, инструменты Linux NDI).
  • Диагноз: Похоже, Повреждение кучи. Фоновый поток NDI, похоже, читает буфер кадра после того, как наш движок уже начал записывать в него следующий кадр, несмотря на наши попытки двойной буферизации.
Вопрос 1: Каков правильный жизненный цикл памяти для send_video_async_v2? Станет ли NDI владельцем указателя? Нужен ли нам «тройной буфер» с ограничителем, чтобы гарантировать, что NDI полностью обработает кадр, прежде чем мы снова коснемся этого адреса памяти?Проблема 2: «жужжание»/искажение звука на потребительском оборудовании

Наш аудиомикшер суммирует плавающие сэмплы из активных источников.
  • Аномалия: смешанный звук звучит совершенно чисто при мониторинге с помощью «NDI Video Monitor» или профессиональных инструментов.
  • Неисправность: Когда точно такой же поток воспроизводится на колонках телевизора Samsung или бытовых наушниках, на звук накладывается заметное «жужжание» или «статический шум».
  • Текущая логика: Мы просто суммируем значения с плавающей запятой: out = sourceA + sourceB. Мы попробовали жесткий клип на скорости 1.0f, но шум остался.

Вопрос 2: Ожидает ли NDI определенного запаса или опорного уровня (например, -20dBFS) для своего плавающего звука? Почему действительный поток float32 четко воспроизводится на профессиональных мониторах, но искажается или гудит на потребительском оборудовании? Является ли tanh мягким ограничением стандартного решения или нам не хватает определенного флага метаданных аудио NDI?**Ссылки на код:**Отправитель видео (сбои):

Код: Выделить всё

// We set up the frame
video_frame.p_data = buffer_ptr;
video_frame.frame_rate_N = 60000; video_frame.frame_rate_D = 1000;

// This provides 60fps but eventually corrupts the heap
NDIlib_send_send_video_async_v2(sender_instance, &video_frame);
Аудиомикшер (искажения на ТВ):

Код: Выделить всё

// Simple summing mixer
for (size_t i = 0; i < samples; i++) {
// If Source A and Source B are loud, this exceeds 1.0f
mixBuffer[i] = sourceA[i] + sourceB[i];
}
// Sent as NDIlib_send_send_audio_v3 (Float32 Planar)
Любая информация о жизненном цикле асинхронной памяти или эталонных уровнях звука NDI будет невероятно полезна.

Подробнее здесь: https://stackoverflow.com/questions/798 ... stortion-o
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»