Исследование протокола RTSP и внедрение технологии RTSP-плеера
Исследование протокола RTSP и внедрение технологии RTSP-плеера

Исследование протокола RTSP

RTSP-плееры могут широко использоваться в сценариях с относительно высокими требованиями к задержке, таких как совместное управление интеллектуальными роботами или дронами, видеонаблюдение в реальном времени, удаленные видеоконференции, интернет-телевидение и т. д. Дистанционное управление и управление передачей потоковых мультимедийных данных достигается посредством управляющей сигнализации.

1. Основа соглашения

  • Определение и цель:RTSPСоздавайте и управляйте одним или несколькими потоками синхронизации времени.,Хотя можно чередовать медиапотоки и потоки управления,Но RTSP обычно не принимает непосредственного участия в передаче данных.,но как“сетьдистанционное функция управления существует.
  • Стандартные характеристики:следоватьIETF RFC 2326 и другие спецификации, его синтаксис и операции относятся к HTTP/1.1.
  • Наборы символов и кодировки:использоватьISO Набор символов 10646 с использованием кодировки UTF-8.

2. Характеристики протокола

  • протокол с отслеживанием состояния:иHTTPХарактеристики безгражданства,RTSP — это протокол с отслеживанием состояния,Серверу необходимо хранить информацию о состоянии клиентских сеансов.
  • Масштабируемость:RTSPПоддержка добавления новых методов и параметров.,С хорошей Масштабируемостью.
  • Совместимость с несколькими серверами:Отдельные медиапотоки в презентации могут распределяться по разным серверам.,Клиент автоматически установит несколько параллельных сеансов управления с разными серверами.
  • безопасность:RTSPповторно используемыйWebмеханизм безопасности,Например, механизмы авторизации HTTP (базовая, дайджест и т. д.) могут использоваться напрямую.

3. Функции протокола

  • Элементы управления воспроизведением:Клиент может пройтиRTSPКоманды для управления воспроизведением медиапотоков,Например, играя、пауза、останавливаться、Быстрая перемотка вперед и назад и т. д.
  • описание СМИ:RTSPподдержка черезDESCRIBEМетод получения информации описания медиапотока с сервера,Обычно используется SDP (протокол описания сеанса).
  • Управление сеансами:RTSPподдержка черезSETUPметод Создать сеанси готов передать,Завершите сеанс и освободите ресурсы с помощью метода TEARDOWN.

4. Механизм передачи

  • протокол транспортного уровня:RTSPобычно на основеTCPпротокол для взаимодействия,Порт по умолчанию — 554. в то же время,RTSP также может туннелироваться через HTTP (RTSP-over-HTTP туннелирование), порт по умолчанию — 8080.
  • потоковая передача данных:Фактические потоковые данные(например аудио、потоковое видео)обычно черезRTP/RTCPпротокол для передачи。RTPОтветственный за передачу данных,RTCP отвечает за передачу управляющей информации.

5. Запрос и ответ RTSP

  • Метод запроса:RTSPопределяет различные Метод запрос, включая ОПЦИИ, ОПИСАНИЕ, НАСТРОЙКА, ВОСПРОИЗВЕДЕНИЕ, ПАУЗА, РАЗБОР и т. д. Эти методы используются для реализации различных функций, таких как запрос методов, поддерживаемых сервером, получение описания СМИ、Создать сеанс、Управление воспроизведением мультимедиа и многое другое.
  • Код статуса ответа:RTSPиз Код статуса Ответ аналогичен HTTP и используется для обозначения успеха или неудачи запроса.

6. Сценарии применения

  • Прямая трансляция:RTSPшироко используется в Прямая сценарии трансляции, такие как видеоконференции, прямая веб-камера трансляция, система видео по запросу и т. д.
  • дистанционное управление:RTSPРазрешить клиентудистанционное управление потоковым воспроизведением мультимедиа на медиасервере обеспечивает гибкие функции управления мультимедиа.

Как реализовать RTSP плеер

В этой статье в качестве примера используется проигрыватель прямых трансляций RTSP на платформе Windows из Daniu Live SDK, чтобы кратко представить, как интегрировать возможности прямой трансляции RTSP.

  • Пакет SDK прямой трансляции Daniel предоставляет два набора интерфейсов: C++/C#.,Предоставление 32/64-битных библиотек отладки/выпуска для внешнего мира.,Прямое соответствие между интерфейсами C++ и C#.,Интерфейс C# добавляет префикс NT_PB_ по сравнению с интерфейсом C++;
  • WIN-PlayerSDK-CPP-Demo: Демонстрация интерфейса C++, соответствующего SDK проигрывателя;
  • WIN-PlayerSDK-CSharp-Demo: демонстрация интерфейса C#, соответствующего SDK проигрывателя;
  • SDK воспроизведения поддерживает системы Win7 и более поздних версий;
  • Демо-версия разработана на базе VS2013.

Инструкции по интеграции

Заголовочный файл C++:

  • [Определение типа]nt_type_define.h
  • [Определение журнала]smart_log.h
  • [Определение журнала]smart_log_define.h
  • [определение базового кода]nt_base_code_define.h
  • [интерфейс игрока]smart_player_define.h
  • [определение параметра игрока]smart_player_sdk.h

Заголовочный файл С#:

  • [определение базового кода]nt_base_code_define.cs
  • [интерфейс игрока]smart_player_define.cs
  • [определение параметра игрока]smart_player_sdk.cs

Связанные библиотеки:

  • SmartLog.dll
  • SmartLog.lib
  • SmartPlayerSDK.dll
  • SmartPlayerSDK.lib
  • avcodec-56.dll
  • avdevice-56.dll
  • avfilter-5.dll
  • avformat-56.dll
  • avutil-54.dll
  • postproc-53.dll
  • swresample-1.dll
  • swscale-3.dll

Шаги интеграции:

1. Скопируйте библиотеку отладки/выпуска из каталога lib в каталог отладки или выпуска, соответствующий проекту, который необходимо интегрировать (убедитесь, что каталоги отладки/выпуска 32-битной/64-битной библиотеки соответствуют один к одному);

Каталог lib выглядит следующим образом:

  • 32-битная библиотека отладки: отладка
  • 32-битная библиотека релизов: релиз
  • 64-битная библиотека отладки: x64\debug
  • Библиотека 64-битной версии: x64\release

2. Соответствующие заголовочные файлы CS и добавление проектов, которые необходимо интегрировать;

3. В проектах, требующих интеграции,Щелкните правой кнопкой мыши->Properties->

Application->Assembly имя, Daniu Live SDK авторизован в соответствии с названием приложения. Для неавторизованных версий измените его на «SmartPlayer» здесь. Если вам нужна авторизация, вы можете связаться с компанией напрямую;

4. Для официально авторизованной версии вам необходимо добавить код для установки лицензии перед вызовом интерфейса Init() (заполните соответствующий ключ и CID в соответствии с инструкциями в электронном письме официальной авторизованной версии):

Время вызова интерфейса (на примере C#)

Установить лицензию на авторизацию

C# SDK, добавьте следующий код перед NT.NTSmartPlayerSDK.NT_SP_Init:

Язык кода:csharp
копировать
NT.NTSmartPlayerSDK.NT_SP_SetSDKClientKey("xxxxxxxxxx", "xxxxxxxxxx", 0, IntPtr.Zero);

UInt32 isInited = NT.NTSmartPlayerSDK.NT_SP_Init(0, IntPtr.Zero);
if (isInited != 0)
{
    MessageBox.Show("Ошибка вызова NT_SP_Init..");
    return;
}

C++ SDK, добавьте следующий код перед player_api_.Init:

Язык кода:csharp
копировать
NT_SP_SetSDKClientKey("xxxxxxxxxx", "xxxxxxxxxx", 0, nullptr);

if ( NT_ERC_OK != player_api_.Init(0, NULL) )
{
    return FALSE;
}

Установить путь хранения журналов

Вам необходимо добавить следующий код перед player_api_.Init:

Язык кода:csharp
копировать
// Установите путь к журналу (убедитесь, что каталог существует)
String log_path = "D:\\playerlog";
NTSmartLog.NT_SL_SetPath(log_path);

Если каталог существует и у него есть разрешение на запись файлов, после закрытия приложения в соответствующей папке будет создан файл smart_sdk.log.

Инициализировать SDK

NT_SP_Init: инициализация SDK, воспроизведение нескольких экземпляров, этот интерфейс нужно вызывать только один раз.

Обнаружение жесткого декодирования конкретной модели

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

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

Язык кода:csharp
копировать
/*
 * Проверьте, поддерживается ли жесткое декодирование H264.
 * Возвращает NT_ERC_OK, если поддерживается
 */
[DllImport(@"SmartPlayerSDK.dll")]
public static extern UInt32 NT_SP_IsSupportH264HardwareDecoder();

/*
  * Проверьте, поддерживается ли жесткое декодирование H265.
  * Возвращает NT_ERC_OK, если поддерживается
  */
[DllImport(@"SmartPlayerSDK.dll")]
public static extern UInt32 NT_SP_IsSupportH265HardwareDecoder();

Если вам нужно использовать жесткое декодирование, просто вызовите следующий интерфейс:

Язык кода:csharp
копировать
NTSmartPlayerSDK.NT_SP_SetH264HardwareDecoder(player_handle_, is_support_h264_hardware_decoder_ ? 1 : 0, 0);
NTSmartPlayerSDK.NT_SP_SetH265HardwareDecoder(player_handle_, is_support_h265_hardware_decoder_ ? 1 : 0, 0);

Открыть создание экземпляра воспроизведения

NT_SP_Open: каждый раз, когда вызывается интерфейс Open, он соответствует одному экземпляру воспроизведения. Если необходимо воспроизвести несколько экземпляров, это соответствует нескольким обработчикам проигрывателя.

Язык кода:csharp
копировать
if (player_handle_ == IntPtr.Zero)
{
    player_handle_ = new IntPtr();

    UInt32 ret_open = NTSmartPlayerSDK.NT_SP_Open(out player_handle_, IntPtr.Zero, 0, IntPtr.Zero);

    if (ret_open != 0)
    {
        player_handle_ = IntPtr.Zero;
        MessageBox.Show("Ошибка вызова NT_SP_Open..");
        return;
    }
}

Установить событие обратного вызова

  1. NT_SP_SetEventCallBack: используется для обратного вызова состояния сетевого канала, состояния буфера (начало, коэффициент буфера, конец), пропускной способности в реальном времени и т. д. Соответствующий EventID выглядит следующим образом:
Язык кода:csharp
копировать
/*Идентификатор события*/
public enum NT_SP_E_EVENT_ID : uint
{
        NT_SP_E_EVENT_ID_BASE = NTBaseCodeDefine.NT_EVENT_ID_SMART_PLAYER_SDK,

        NT_SP_E_EVENT_ID_CONNECTING          = NT_SP_E_EVENT_ID_BASE | 0x2, /*Соединение*/
        NT_SP_E_EVENT_ID_CONNECTION_FAILED = NT_SP_E_EVENT_ID_BASE | 0x3, /*Соединение не удалось*/
        NT_SP_E_EVENT_ID_CONNECTED       = NT_SP_E_EVENT_ID_BASE | 0x4, /*Подключено*/
        NT_SP_E_EVENT_ID_DISCONNECTED     = NT_SP_E_EVENT_ID_BASE | 0x5, /*Отключение*/
        NT_SP_E_EVENT_ID_NO_MEDIADATA_RECEIVED = NT_SP_E_EVENT_ID_BASE | 0x8,  /*данные RTMP не получены*/
        NT_SP_E_EVENT_ID_RTSP_STATUS_CODE   = NT_SP_E_EVENT_ID_BASE | 0xB,  /*rtsp status отчетность по коду, В настоящее время сообщается только о 401, param1 представляет статус code*/

        /* Далее начните с 0x81*/
        NT_SP_E_EVENT_ID_START_BUFFERING = NT_SP_E_EVENT_ID_BASE | 0x81, /*Начать буферизацию*/
        NT_SP_E_EVENT_ID_BUFFERING     = NT_SP_E_EVENT_ID_BASE | 0x82, /*Буферизация, param1 Представляет прогресс в процентах*/
        NT_SP_E_EVENT_ID_STOP_BUFFERING  = NT_SP_E_EVENT_ID_BASE | 0x83, /*Остановить буферизацию*/

        NT_SP_E_EVENT_ID_DOWNLOAD_SPEED  = NT_SP_E_EVENT_ID_BASE | 0x91, /*Скорость загрузки, param1 представляет скорость загрузки, единица измерения: (байт/с)*/

        NT_SP_E_EVENT_ID_PLAYBACK_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa1,     /*Игра заканчивается, прямая в трансляционных потоках этого события нет, оно есть только в потоках по требованию*/
        NT_SP_E_EVENT_ID_RECORDER_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa2,     /*Видео заканчивается, прямая трансляцияStream не имеет этого события, Только потоковая передача по запросу*/
        NT_SP_E_EVENT_ID_PULLSTREAM_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa3,   /*Потоковая передача завершается, прямая в трансляционных потоках этого события нет, оно есть только в потоках по требованию*/

        NT_SP_E_EVENT_ID_DURATION = NT_SP_E_EVENT_ID_BASE | 0xa8, /*Продолжительность видео, если оно прямое трансляция, об этом не будет сообщено, если это по запросу, Если продолжительность видео можно получить из источника видео, сообщите об этом. param1 представляет продолжительность видео, единица измерения — миллисекунды (мс)*/
}

  1. NT_SP_SetVideoSizeCallBack: установите обратный вызов разрешения видео. Если данные потока содержат видеоданные, SDK вернет информацию о ширине и высоте видео:
Язык кода:csharp
копировать
//video resolution callback
video_size_call_back_ = new SP_SDKVideoSizeCallBack(SP_SDKVideoSizeHandle);
NTSmartPlayerSDK.NT_SP_SetVideoSizeCallBack(player_handle_, IntPtr.Zero, video_size_call_back_);

Уведомление:При увеличении ширины и высоты видео или изменении окна рисования,Не забудьте вызвать NT_SP_OnWindowSize() для обновления.,Если этого не сделать, видео может быть размытым.

Язык кода:csharp
копировать
private void PlaybackWindowResized(Int32 width,Int32 height)
{
    width_=width;
    height_=height;

    int left=playWnd.Left;
    int top=playWnd.Top;

    textBox_resolution.Text=width+"*"+height;

    if(player_handle_==IntPtr.Zero)
    {
       return;
    }

    NTSmartPlayerSDK.NT_SP_OnWindowSize(player_handle_,playWnd.Width,playWnd.Height);
}

  1. NT_SP_SetVideoFrameCallBack: установите обратный вызов данных YUV/RGB32, который можно использовать для подключения к стороннему анализу видео или рисования самостоятельно и т. д. Если система не поддерживает рисование D3D, вы можете установить данные обратного вызова и рисовать в верхнем режиме GDI. :
Язык кода:csharp
копировать
/*Определение формата изображения видеокадра*/
public enum NT_SP_E_VIDEO_FRAME_FORMAT : uint
{
      NT_SP_E_VIDEO_FRAME_FORMAT_RGB32 = 1, // 32-битный формат RGB, r, g, b на каждую приходится по 8, Еще один байт зарезервирован, Формат байта памяти: bb gg rr xx, В основном для соответствия растровому изображению Windows, В режиме прямого порядка байтов используйте тип DWORD, старший бит — xx, за которым следует рр, gg, bb
      NT_SP_E_VIDEO_FRAME_FORMAT_ARGB = 2, // 32-битный формат argb, формат байтов памяти: bb gg rr aa Этот тип соответствует растровому изображению Windows
      NT_SP_E_VIDEO_FRAME_FROMAT_I420 = 3, // формат ЮВ420, Три компонента хранятся на трех гранях
}

  1. NT_SP_SetVideoFrameCallBackV2: устанавливает обратный вызов данных YUV/RGB32. Отличие от интерфейса NT_SP_SetVideoFrameCallBack заключается в том, что можно указать ширину и высоту выдаваемых видеоданных;
  2. NT_SP_SetRenderVideoFrameTimestampCallBack: устанавливается при отрисовке видеокадров.,Обратный вызов метки времени видеокадра,Вообще говоря, если нет необходимости в обратном вызове метки времени,Никакой настройки не требуется:
Язык кода:csharp
копировать
//video timestamp callback
video_frame_ts_callback_ = new SP_SDKRenderVideoFrameTimestampCallBack(SP_SDKRenderVideoFrameTimestampCallBack);
NTSmartPlayerSDK.NT_SP_SetRenderVideoFrameTimestampCallBack(player_handle_, IntPtr.Zero, video_frame_ts_callback_);

  1. NT_SP_SetAudioPCMFrameCallBack: Установить обратный вызов кадра PCM, выдать данные PCM,В настоящее время каждый размер кадра составляет 10 мс.,Вообще говоря, если нет необходимости в использовании,Никакой настройки не требуется;
  2. NT_SP_SetUserDataCallBack:настраивать Обратный вызов пользовательских данных,Этот интерфейс необходимо использовать вместе с push-end SDK.,Используется для возврата пользовательских данных в реальном времени, установленных на стороне push (например, метка времени, долгота и широта, а также другие расширенные инструкции или информация).,Если вы просто используете SDK воспроизведения,Никакой настройки не требуется;
  3. NT_SP_SetSEIDataCallBack: Установить видео Обратный вызов данных SEI,Если вы просто используете SDK воспроизведения,Никакой дополнительной обработки расширенных данных SEI не требуется.,Никакой настройки не требуется.

Обнаружение D3DRender

В настоящее время существует очень мало ситуаций, когда D3D-рендеринг не поддерживается. Учитывая универсальность системы, мы выполняем обнаружение перед игрой. Конкретный интерфейс вызова выглядит следующим образом:

Язык кода:csharp
копировать
/*
 * handle: игровая ручка
 * hwnd: Для этого необходимо передать дескриптор окна, фактически используемый для рисования.
 * is_support: Если поддерживается *is_support 1, Если не поддерживается, будет 0
 * Успешный вызов интерфейса возвращает NT_ERC_OK.
 */
[DllImport(@"SmartPlayerSDK.dll")]
public static extern UInt32 NT_SP_IsSupportD3DRender(IntPtr handle, IntPtr hwnd, ref Int32 is_support);

В ситуациях, когда рисование D3D не поддерживается, устанавливаются данные обратного вызова YUV, и верхний уровень рисуется непосредственно в режиме GDI. Примечание. Эффективность рисования GDI низкая.

Язык кода:csharp
копировать
Int32 in_support_d3d_render = 0;

if (NT.NTBaseCodeDefine.NT_ERC_OK == NTSmartPlayerSDK.NT_SP_IsSupportD3DRender(player_handle_, playWnd.Handle, ref in_support_d3d_render))
{
    if (1 == in_support_d3d_render)
    {
        is_support_d3d_render = true;
    }
}

if (is_support_d3d_render)
{
    is_gdi_render_ = false;

    // Если поддерживается рисование d3d, используйте рисование D3D.
    NTSmartPlayerSDK.NT_SP_SetRenderWindow(player_handle_, playWnd.Handle);

    if (btn_check_render_scale_mode.Checked)
    {
        NTSmartPlayerSDK.NT_SP_SetRenderScaleMode(player_handle_, 1);
    }
    else
    {
        NTSmartPlayerSDK.NT_SP_SetRenderScaleMode(player_handle_, 0);
    }
}
else
{
    is_gdi_render_ = true;
    playWnd.Visible = false;

    // Если D3D не поддерживается, просто позвольте игроку выдать данные и нарисовать их с помощью GDI.

    //video frame callback (YUV/RGB)
    //формат, см. NT_SP_E_VIDEO_FRAME_FORMAT, если вам нужно перезвонить YUV, установите для него значение NT_SP_E_VIDEO_FRAME_FROMAT_I420
    video_frame_call_back_ = new SP_SDKVideoFrameCallBack(SetVideoFrameCallBack);
NTSmartPlayerSDK.NT_SP_SetVideoFrameCallBack(player_handle_, (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, IntPtr.Zero, video_frame_call_back_);
}

Установить URL воспроизведения

NT_SP_SetURL: поддерживает файлы rtsp/rtmp/local FLV (полный путь).

Установить обратный вызов PCM

NT_SP_SetIsOutputAudioDevice: определяет, воспроизводить ли звук. Это отличается от интерфейса отключения звука. Основная цель этого интерфейса — использовать его, когда пользователь устанавливает внешний интерфейс обратного вызова PCM и не хочет, чтобы SDK воспроизводил звук.

Настройки параметров воспроизведения RTMP/RTSP

Для получения подробной информации обратитесь к InitCommonSDKParam() в исходном коде демо-версии:

Дополнительный интерфейс настройки перед воспроизведением

  1. NT_SP_SetBuffer: Установить размер буфера воспроизведения видео, единица измерения: миллисекунды;
  2. NT_SP_SetRTSPTcpMode: установите режим TCP RTSP, 1 — TCP, 0 — UDP, этот интерфейс действителен только для RTSP;
  3. NT_SP_SetRtspTimeout: установите время тайм-аута RTSP, единица измерения тайм-аута — секунды, она должна быть больше 0;
  4. NT_SP_SetRtspAutoSwitchTcpUdp: для RTSP некоторые могут поддерживать rtp через udp, а некоторые могут поддерживать rtp через tcp. Для удобства в некоторых сценариях можно включить автоматический переключатель попытки. Если после его включения невозможно воспроизвести udp, SDK будет автоматически включен. попробуйте tcp. Если режим TCP не может быть воспроизведен, SDK автоматически попытается использовать udp, is_auto_switch_tcp_udp: Если установлено значение 1, SDK попытается переключить воспроизведение между TCP и udp. Если установлено значение 0, оно не будет пытаться переключиться.
  5. NT_SP_SetFastStartup: установите второй для открытия, 1 означает открытие в секундах, 0 означает не открытие в секундах, этот интерфейс используется соответствующим образом, когда RTMP-сервер кэширует GOP;
  6. NT_SP_SetLowLatencyMode: установите режим воспроизведения с низкой задержкой. По умолчанию используется обычный режим воспроизведения. Режим: 1 — режим с низкой задержкой, 0 — нормальный режим. В режиме с низкой задержкой звук и видео могут быть не синхронизированы. видеокадры могут быть неровными;
  7. NT_SP_SetReportDownloadSpeed: установить отчет о скорости загрузки, по умолчанию скорость загрузки не сообщается;

* is_report: переключатель отчетности, 1: отчетность таблицы. 0: означает отсутствие отчетности. Другие значения недействительны.

* report_interval: интервал отчетов (частота отчетов), единица измерения — секунды, минимальное значение — один раз в секунду. Если он меньше 1 и отчетность установлена, вызов завершится неудачно.

* Примечание. Если настроена отчетность, установите SetEventCallBack, а затем обработайте это событие в функции обратного вызова.

* Сообщаемое событие: NT_SP_E_EVENT_ID_DOWNLOAD_SPEED.

  1. NT_SP_GetDownloadSpeed: Активно получить скорость загрузки, скорость: Возвращает скорость загрузки, единица измерения — байт/с;
  2. NT_SP_SetParam: универсальный интерфейс, настройка параметров, большинство проблем можно решить с помощью этих интерфейсов;
  3. NT_SP_GetParam: универсальный интерфейс, получение параметров, большинство проблем можно решить с помощью этих интерфейсов;

Интерфейс, который можно вызывать в реальном времени до и после воспроизведения.

  1. NT_SP_SetMute: во время воспроизведения отключает звук и отменяет его в реальном времени. Его можно вызвать перед воспроизведением или в реальном времени во время воспроизведения;
  2. NT_SP_SetAudioVolume: в отличие от интерфейса отключения звука в реальном времени, этот интерфейс может управлять громкостью более детально. Диапазон по умолчанию — [0,100], где 0 — отключение звука, 100 — максимальная громкость, а значение по умолчанию — 100;
  3. NT_SP_SetOnlyDecodeVideoKeyFrame: в сценарии многооконного воспроизведения некоторым окнам может потребоваться воспроизведение только ключевых кадров. Если существуют аналогичные требования к сцене, можно использовать этот интерфейс;
  4. NT_SP SetRotation: Установить вращение просмотра видео, вращение по часовой стрелке, градусы: Установите 0, 90, 180,Эффективен при 270 градусах,Другие значения недействительны,Уведомление:кроме 0 градусов,Игра под другими углами потребует больше ресурсов ЦП;
  5. NT_SP_SetFlipVertical: установить переворот видео вверх и вниз (вертикальный переворот);
  6. NT_SP_SetFlipHorizontal: установить горизонтальную инверсию просмотра видео;
  7. NT_SP_SetRenderScaleMode: установите режим заполнения видеоэкрана, например, заполнение всего окна рисования и пропорциональное заполнение окна рисования. Если не установлено, все окно рисования будет заполнено по умолчанию;

Начать играть

NT_SP_StartPlay

Начните воспроизводить потоковые данные RTMP или RTSP.

Запись потокового терминала RTMP/RTSP

  1. NT_SP_SetRecorderDirectory: установите каталог записи.
  2. NT_SP_SetRecorderFileMaxSize: установить максимальный размер одного файла.
  3. NT_SP_SetRecorderFileNameRuler: установить правила создания имени видеофайла.
  4. NT_SP_SetRecorderCallBack: установить интерфейс обратного вызова записи.
  5. NT_SP_SetRecorderAudioTranscodeAAC: установите переключатель для преобразования звука в кодировку AAC во время записи. aac является более распространенным, и SDK добавляет функцию преобразования других кодировок звука (таких как speex, pcmu, pcma и т. д.) в aac.
  6. NT_SP_SetRecorderVideo: укажите, следует ли записывать видео. По умолчанию, если в источнике видео есть видео, оно будет записано. Если нет, оно не будет записываться. Однако в некоторых сценариях вы можете не захотеть записывать видео, а просто захотеть. записывать звук, поэтому добавьте переключатель.
  7. NT_SP_SetRecorderAudio: укажите, записывать ли звук. По умолчанию, если источник видео имеет звук, он будет записан. Если нет, он не будет записан. Однако в некоторых сценариях вы можете не захотеть записывать звук, а только захотеть. записывать видео, поэтому добавьте переключатель.
  8. NT_SP_StartRecorder: начать запись.
  9. NT_SP_StopRecorder: остановить запись.

Живой снимок

NT_SP_CaptureImage

Используется проигрывателем для захвата воспроизводимого в данный момент изображения в реальном времени и сохранения изображения локально в формате PNG.

Язык кода:csharp
копировать
String name = capture_image_path_ + "\\" +  DateTime.Now.ToString("hh-mm-ss") + ".png";

byte[] buffer1 = Encoding.Default.GetBytes(name);
byte[] buffer2 = Encoding.Convert(Encoding.Default, Encoding.UTF8, buffer1, 0, buffer1.Length);

byte[] buffer3 = new byte[buffer2.Length + 1];
buffer3[buffer2.Length] = 0;

Array.Copy(buffer2, buffer3, buffer2.Length);

IntPtr file_name_ptr = Marshal.AllocHGlobal(buffer3.Length);
Marshal.Copy(buffer3, 0, file_name_ptr, buffer3.Length);

capture_image_call_back_ = new SP_SDKCaptureImageCallBack(SDKCaptureImageCallBack);

UInt32 ret = NTSmartPlayerSDK.NT_SP_CaptureImage(player_handle_, file_name_ptr, IntPtr.Zero, capture_image_call_back_);

Marshal.FreeHGlobal(file_name_ptr);

if (NT.NTBaseCodeDefine.NT_ERC_OK == ret)
{
    // Запрос на снимок экрана успешно отправлен
}
else if ((UInt32)NT.NTSmartPlayerDefine.SP_E_ERROR_CODE.NT_ERC_SP_TOO_MANY_CAPTURE_IMAGE_REQUESTS == ret)
{
    // Уведомить пользователя о задержке
    MessageBox.Show("Too many capture image requests!");
}
else
{
    // Другие неудачи
}

Быстрое переключение URL-адресов

NT_SP_SwitchURL

Быстрое переключение URL-адресов,Используется без разрушения всего экземпляра проигрывателя.,Переключайте URL-адрес воспроизведения в режиме реального времени.

Обратный вызов пользовательских данных

NT_SP_SetUserDataCallBack

настраивать Обратный вызов пользовательских данных,Используется для получения информации о пользовательских данных, отправленной расширенным модулем SEI.,Если вы не сотрудничаете с нами в расширении SEI, отправьте DK,Этот интерфейс не нужно вызывать.

Обратный вызов данных SEI

NT_SP_SetSEIDataCallBack

Установить обратный вызов видеосейла для получения Обратного вызов данных SEI,Если в данных потока нет SEI или данные SEI не подготовлены к обработке,Этот интерфейс не нужно вызывать.

Хватит играть

NT_SP_StopPlay

Хватит воспроизводить потоковые данные RTMP или RTSP.

Закрыть экземпляр воспроизведения

NT_SP_Close

После вызова интерфейса Close обработчик проигрывателя остается пустым.

Язык кода:csharp
копировать
if ( player_handle_ != IntPtr.Zero)
{
     NTSmartPlayerSDK.NT_SP_Close(player_handle_);
     player_handle_ = IntPtr.Zero;
}

Uninit

NT_SP_UnInit

UnInit() — это последний интерфейс, вызываемый SDK. В среде с несколькими экземплярами его нужно вызывать только один раз.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose