Используйте кодировщик Media Foundation H.264 с live555

Я хочу создать поток H.264 RTSP, используя потоковую библиотеку live555. Для кодирования видеокадров я хочу использовать кодировщик H.264 MFT. Кодирование работает с использованием базовой модели обработки (я не строю график, а вызываю MFT вручную). Потоковая передача с использованием пользовательского FramedSource источника также, похоже, работает в том смысле, что программа не дает сбоев и поток в проигрывателе VLC стабилен. Однако изображение искажено - нет цвета, странные узоры линий и т. Д.

Я предполагаю, что я передаю неправильные данные из кодировщика в потоковую библиотеку, но мне не удалось узнать, что библиотека на самом деле ожидает. Я читал, что кодировщик Microsoft H.264 выводит более одного NAL в образце. Далее я обнаружил, что live555 требует, чтобы в doGetNextFrame был возвращен единственный NAL. Поэтому я пытаюсь идентифицировать отдельные NAL (Что означает этот заголовок NAL H264? заявляет, что заголовок может быть 3 или 4 байта - я не знаю, где взять информацию, которую использует MF, но представление памяти отладчика предлагает 4 байта):

for (DWORD i = 0; i < sampleLen; ++i) {
    auto v = *reinterpret_cast<unsigned int *>(sampleData + i);
    if (v == ::htonl(1)) {
        nals.push_back(sampleData + i);
    }
}

Этот фрагмент кода обычно идентифицирует более одного элемента в одном образце вывода из MFT. Однако, если я скопирую диапазоны, найденные этим циклом, в выходной буфер fTo, VLC ничего не покажет и остановится через несколько секунд. Я также где-то читал, что live555 не хочет магическое число 0x00000001, поэтому я попытался его пропустить. Эффект на стороне клиента такой же.

Есть ли документация о том, что live555 ожидает от меня скопировать в выходной буфер?

Создает ли кодировщик H.264 в Media Foundation выходные образцы, которые я могу использовать для потоковой передачи?

Нужно ли разделять выходные образцы? Сколько мне нужно пропустить, если я нашел магическое число (Как написать Live555 FramedSource, чтобы я мог транслировать H.264 в прямом эфире, предполагает, что мне может потребоваться пропустить больше, чем магическое число, потому что принятый ответ передает только часть полезной нагрузки NAL)?

Есть ли способ проверить, формируют ли образцы, возвращаемые MFT H.264 в базовом режиме обработки, допустимый поток H.264?


person Christoph    schedule 04.02.2016    source источник


Ответы (1)


Вот как я это сделал, MFWebCamRtp.

Я смог транслировать поток с веб-камеры и просматривать его в VLC. Не было необходимости копаться в NAL и т.п. Каждый IMFSample из кодировщика Media Foundation H264 содержит один NAL, который можно передать прямо в live555.

person sipsorcery    schedule 04.02.2016
comment
Спасибо за то, что поделились - мой исходный код выглядел почти так же, за исключением того, что я напрямую извлек буфер из образца вместо использования ConvertToContiguousBuffer. Мой поток все еще немного мерцает, но в целом, кажется, нормально передавать вывод MFT напрямую, как вы сказали. - person Christoph; 05.02.2016