после многих лет,существоватьEnhancing RTMP, FLV With Additional Video Codecs And HDR Support(2023Год7луна31Официально выпущен)До выхода официальных правил,Если RTMP хочет поддерживать H.265,Обычной практикой является расширение протокола FLV.,Решением, предложенным производителями CDN, является видеотег для flv. CodecID добавляет новый тип (12) для представления h265 (hevc). Отличие от h264 заключается в анализе HEVCDecoderConfigurationRecord и анализе vps из HEVCDecoderConfigurationRecord. sps, pps. С ВПС, sps, pps, Его можно расшифровать.
К сожалению, хотя CodecID можно настроить, CodecID имеет только 4 бита. Добавление H.265 — это нормально. Было бы неловко, если бы позже были добавлены VP8, VP9, AV1 или даже H.266. официальный выпуск новой спецификации улучшения RTMP. Что отрадно, так это то, что организации с открытым исходным кодом, такие как SRS, реализовали адаптацию и совместимость на стороне обслуживания как можно скорее.
В этой статье в качестве примера используются модули RTMP Live Push и RTMP Live SDK платформы Windows из Daniu Live SDK. Учитывая, что старый расширенный сценарий CodecID 12 все еще используется, мы добавили интерфейс настройки:
Завершение RTMP, соответствующий файл — SmartPublisherSDK\nt_smart_publisher_sdk.h:
/*
* disable enhanced RTMP, По умолчанию в SDK включена расширенная версия. RTMP
* value: 1:disable, 0:enable
*/
NT_UINT32(NT_API *DisableEnhancedRTMP)(NT_HANDLE handle, NT_INT32 value);
RTMP-плеер, соответствующий файл — SmartPlayerSDK\smart_player_sdk.h:
/*
* disable enhanced RTMP, По умолчанию в SDK включена расширенная версия. RTMP
* value: 1:disable, 0:enable
*/
NT_UINT32(NT_API *DisableEnhancedRTMP)(NT_HANDLE handle, NT_INT32 value);
В расширенном RTMP внесены следующие изменения в FrameType (4 бита) в исходном VideoTagHeader FLV:
| IsExHeader(1bit)FrameType(3bits) |
0-й бит первого байта VideoTagHeader используется для определения того, является ли это расширенным форматом RTMP. Если этот бит равен 1, это заголовок расширения, формат Enhanced-Rtmp.
Push-конец RTMP генерирует FLV VideoTagHeader HEVC, а соответствующий пример кода оценки выглядит следующим образом:
/*
* Author:daniusdk.com
*/
*p = 0x80;
if (key)
*p |= (1<<4);
else
*p |= (2 << 4);
if (pts != dts)
*p |= 1;
else
*p |= 3;
p++;
*p++ = 'h';
*p++ = 'v';
*p++ = 'c';
*p++ = '1';
//....
На стороне воспроизведения RTMP соответствующий пример кода оценки выглядит следующим образом:
/*
* Author:daniusdk.com
*/
bool is_ex_header;
if (p[0]&0x80)
is_ex_header = true;
else
is_ex_header = false;
if (is_ex_header) {
auto video_fourcc = (p[1] << 24)|(p[2] << 16)|(p[3] << 8)|p[4];
if (HEVC == video_fourcc) {
// обработка hevc
}else if (VP9 == video_fourcc) {
// обработка vp9
}else if (AV1 == video_fourcc ) {
// обработка AV1
}
}
Запустите сбор форм платформы Windows, установите жесткое кодирование H.265, введите URL-адрес принудительной отправки RTMP, реализуйте расширенную отправку RTMP, и проигрыватель извлекает поток для воспроизведения. Общая задержка следующая:
Видно, что даже несмотря на то, что Enhanced RTMP включен, общая задержка все еще находится на уровне миллисекунд.
Учитывая текущее расширение RTMP 265, большинство из них по-прежнему используют старый CodecID, установленный в режим 12. Если вам необходимо поддерживать новый расширенный RTMP, в дополнение к принудительному завершению и завершению воспроизведения, сервер RTMP также должен дать ответ. В этом случае, к счастью, SRS и другие организации с открытым исходным кодом внесли соответствующие изменения. Мы также сами скорректировали код nginx и провели простой тест. Общая задержка соответствует ожиданиям. Заинтересованные разработчики могут связаться со мной индивидуально.