Конфигурация потока AWS IVS (команда ffmpeg) не удалась

Вопрос или проблема

У меня проблема с использованием AWS IVS на моем удаленном сервере. На сервере я получаю поток с камер и хочу транслировать его с помощью ffmpeg, а местом назначения является канал AWS IVS. Это моя команда ffmpeg (отладочная по очевидным причинам):

ffmpeg -fflags nobuffer+discardcorrupt+shortest -loglevel debug -vsync cfr -i /dev/video1 -f flv -c h264_nvenc -g 10 -pix_fmt yuv420p -r 5 -tune zerolatency rtmps://<server_id>.global-contribute.live-video.net:443/app/<stream_key>

Я проверил команду на своем компьютере, но на удаленном сервере она не работает.

Я запустил команду на сервере, и вот вывод, который я получаю (в большинстве случаев, иногда я вижу сбой во время подключения)

ffmpeg version 4.2.4-1ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
...
[rtmps @ 0x56527c445780] No default whitelist set
[tls @ 0x56527c4445c0] No default whitelist set
[tcp @ 0x56527c443dc0] No default whitelist set
[tcp @ 0x56527c443dc0] Original list of addresses:
[tcp @ 0x56527c443dc0] Address 99.181.124.202 port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.68 port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.176 port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.71 port 443
[tcp @ 0x56527c443dc0] Address 99.181.100.94 port 443
[tcp @ 0x56527c443dc0] Address 99.181.124.239 port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.91 port 443
[tcp @ 0x56527c443dc0] Address 99.181.124.200 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:bb6f:6ab1:49eb:3a4f port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:2c5b:a192:dbb6:2654 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:a97d:47c3:c846:718c port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:1000:dea7:a856:53e8:4bd port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:2000:84f3:a57a:f762:51ff port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:683c:dac5:43c2:d8c port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:1000:4f60:cc74:6a8:6441 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:1000:7e00:18a3:e447:9596 port 443
[tcp @ 0x56527c443dc0] Interleaved list of addresses:
[tcp @ 0x56527c443dc0] Address 99.181.124.202 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:bb6f:6ab1:49eb:3a4f port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.68 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:2c5b:a192:dbb6:2654 port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.176 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:a97d:47c3:c846:718c port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.71 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:1000:dea7:a856:53e8:4bd port 443
[tcp @ 0x56527c443dc0] Address 99.181.100.94 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:2000:84f3:a57a:f762:51ff port 443
[tcp @ 0x56527c443dc0] Address 99.181.124.239 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:0:683c:dac5:43c2:d8c port 443
[tcp @ 0x56527c443dc0] Address 52.223.240.91 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:1000:4f60:cc74:6a8:6441 port 443
[tcp @ 0x56527c443dc0] Address 99.181.124.200 port 443
[tcp @ 0x56527c443dc0] Address 2402:2a80:1208:1000:7e00:18a3:e447:9596 port 443
[tcp @ 0x56527c443dc0] Starting connection attempt to 99.181.124.202 port 443
[tcp @ 0x56527c443dc0] Successfully connected to 99.181.124.202 port 443
[rtmps @ 0x56527c445780] Handshaking...
[rtmps @ 0x56527c445780] Type answer 3
[rtmps @ 0x56527c445780] Server version 1.2.3.4
[rtmps @ 0x56527c445780] Proto = rtmps, path = /app/<stream_key>, app = app, fname = <stream_key>
[rtmps @ 0x56527c445780] Window acknowledgement size = 2500000
[rtmps @ 0x56527c445780] Max sent, unacked = 2500000
[rtmps @ 0x56527c445780] New incoming chunk size = 4096
[rtmps @ 0x56527c445780] Releasing stream...
[rtmps @ 0x56527c445780] FCPublish stream...
[rtmps @ 0x56527c445780] Creating stream...
[rtmps @ 0x56527c445780] Sending publish command for '<stream_key>'
Successfully opened the file.
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_nvenc))
Press [q] to stop, [?] for help
cur_dts is invalid st:0 (0) [init:0 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
[rawvideo @ 0x56527c426d80] PACKET SIZE: 4147200, STRIDE: 3840
detected 16 logical cores
[graph 0 input from stream 0:0 @ 0x56527c450e40] Setting 'video_size' to value '1920x1080'
[graph 0 input from stream 0:0 @ 0x56527c450e40] Setting 'pix_fmt' to value '1'
[graph 0 input from stream 0:0 @ 0x56527c450e40] Setting 'time_base' to value '1/1000000'
[graph 0 input from stream 0:0 @ 0x56527c450e40] Setting 'pixel_aspect' to value '0/1'
[graph 0 input from stream 0:0 @ 0x56527c450e40] Setting 'sws_param' to value 'flags=2'
[graph 0 input from stream 0:0 @ 0x56527c450e40] Setting 'frame_rate' to value '30/1'
[graph 0 input from stream 0:0 @ 0x56527c450e40] w:1920 h:1080 pixfmt:yuyv422 tb:1/1000000 fr:30/1 sar:0/1 sws_param:flags=2
[format @ 0x56527c452100] Setting 'pix_fmts' to value 'yuv420p'
[auto_scaler_0 @ 0x56527c45f0c0] Setting 'flags' to value 'bicubic'
[auto_scaler_0 @ 0x56527c45f0c0] w:iw h:ih flags:'bicubic' interl:0
[format @ 0x56527c452100] auto-inserting filter 'auto_scaler_0' between the filter 'Parsed_null_0' and the filter 'format'
[AVFilterGraph @ 0x56527c454700] query_formats: 4 queried, 2 merged, 1 already done, 0 delayed
[auto_scaler_0 @ 0x56527c45f0c0] w:1920 h:1080 fmt:yuyv422 sar:0/1 -> w:1920 h:1080 fmt:yuv420p sar:0/1 flags:0x4
[h264_nvenc @ 0x56527c428800] Loaded lib: libcuda.so.1
[h264_nvenc @ 0x56527c428800] Loaded sym: cuInit
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDeviceGetCount
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDeviceGet
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDeviceGetAttribute
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDeviceGetName
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDeviceComputeCapability
[h264_nvenc @ 0x56527c428800] Loaded sym: cuCtxCreate_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuCtxSetLimit
[h264_nvenc @ 0x56527c428800] Loaded sym: cuCtxPushCurrent_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuCtxPopCurrent_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuCtxDestroy_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMemAlloc_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMemAllocPitch_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMemsetD8Async
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMemFree_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMemcpy2D_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMemcpy2DAsync_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGetErrorName
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGetErrorString
[h264_nvenc @ 0x56527c428800] Loaded sym: cuCtxGetDevice
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDevicePrimaryCtxRetain
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDevicePrimaryCtxRelease
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDevicePrimaryCtxSetFlags
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDevicePrimaryCtxGetState
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDevicePrimaryCtxReset
[h264_nvenc @ 0x56527c428800] Loaded sym: cuStreamCreate
[h264_nvenc @ 0x56527c428800] Loaded sym: cuStreamQuery
[h264_nvenc @ 0x56527c428800] Loaded sym: cuStreamSynchronize
[h264_nvenc @ 0x56527c428800] Loaded sym: cuStreamDestroy_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuStreamAddCallback
[h264_nvenc @ 0x56527c428800] Loaded sym: cuEventCreate
[h264_nvenc @ 0x56527c428800] Loaded sym: cuEventDestroy_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuEventSynchronize
[h264_nvenc @ 0x56527c428800] Loaded sym: cuEventQuery
[h264_nvenc @ 0x56527c428800] Loaded sym: cuEventRecord
[h264_nvenc @ 0x56527c428800] Loaded sym: cuLaunchKernel
[h264_nvenc @ 0x56527c428800] Loaded sym: cuModuleLoadData
[h264_nvenc @ 0x56527c428800] Loaded sym: cuModuleUnload
[h264_nvenc @ 0x56527c428800] Loaded sym: cuModuleGetFunction
[h264_nvenc @ 0x56527c428800] Loaded sym: cuTexObjectCreate
[h264_nvenc @ 0x56527c428800] Loaded sym: cuTexObjectDestroy
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGLGetDevices_v2
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGraphicsGLRegisterImage
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGraphicsUnregisterResource
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGraphicsMapResources
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGraphicsUnmapResources
[h264_nvenc @ 0x56527c428800] Loaded sym: cuGraphicsSubResourceGetMappedArray
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDeviceGetUuid
[h264_nvenc @ 0x56527c428800] Loaded sym: cuImportExternalMemory
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDestroyExternalMemory
[h264_nvenc @ 0x56527c428800] Loaded sym: cuExternalMemoryGetMappedBuffer
[h264_nvenc @ 0x56527c428800] Loaded sym: cuExternalMemoryGetMappedMipmappedArray
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMipmappedArrayGetLevel
[h264_nvenc @ 0x56527c428800] Loaded sym: cuMipmappedArrayDestroy
[h264_nvenc @ 0x56527c428800] Loaded sym: cuImportExternalSemaphore
[h264_nvenc @ 0x56527c428800] Loaded sym: cuDestroyExternalSemaphore
[h264_nvenc @ 0x56527c428800] Loaded sym: cuSignalExternalSemaphoresAsync
[h264_nvenc @ 0x56527c428800] Loaded sym: cuWaitExternalSemaphoresAsync
[h264_nvenc @ 0x56527c428800] Loaded lib: libnvidia-encode.so.1
[h264_nvenc @ 0x56527c428800] Loaded sym: NvEncodeAPICreateInstance
[h264_nvenc @ 0x56527c428800] Loaded sym: NvEncodeAPIGetMaxSupportedVersion
[h264_nvenc @ 0x56527c428800] Loaded Nvenc version 11.0
[h264_nvenc @ 0x56527c428800] Nvenc initialized successfully
[h264_nvenc @ 0x56527c428800] 1 CUDA capable devices found
[h264_nvenc @ 0x56527c428800] [ GPU #0 - < GeForce RTX 3070 > has Compute SM 8.6 ]
[h264_nvenc @ 0x56527c428800] supports NVENC
[1]    1216099 segmentation fault  ffmpeg -fflags nobuffer+discardcorrupt+shortest -loglevel debug -vsync cfr -i

Я получаю сбой сегментации через 30 секунд, и когда я проверяю раздел потоков IVS, я вижу это: События потока Поэтому я верю, что сбой сегментации вызван прерыванием IVS из-за истощения потока. Что касается брандмауэра, я на данный момент добавил в белый список домен *.global-contribute.live-video.net и протокол 443 для TCP.

Спасибо за помощь

Ответ или решение

Конфигурация потоковой передачи AWS IVS с использованием ffmpeg: Решение проблем с ошибками

Когда сталкиваетесь с проблемами конфигурации потоковой передачи AWS IVS на удаленном сервере с использованием FFmpeg, важно проанализировать все возможные причины сбоя. Ниже приведены подробные шаги для диагностики и исправления проблемы, основанные на вашем описании.

Шаг 1: Проверка команды FFmpeg

Ваш текущий командный синтаксис выглядит следующим образом:

ffmpeg -fflags nobuffer+discardcorrupt+shortest -loglevel debug -vsync cfr -i /dev/video1 -f flv -c h264_nvenc -g 10 -pix_fmt yuv420p -r 5 -tune zerolatency rtmps://<server_id>.global-contribute.live-video.net:443/app/<stream_key>

Обратите внимание на следующие точки:

  1. Путь к видеоустройству: Убедитесь, что /dev/video1 действительно соответствует вашему видеопотоку на удаленном сервере. Вы можете проверить это с помощью команды ls /dev/video*, чтобы убедиться, что поток доступен.

  2. Кодек h264_nvenc: Использование NVENC предполагает наличие соответствующего оборудования и драйверов на сервере. Убедитесь, что у вас есть и правильно установлены драйверы NVIDIA и необходимые библиотеки (libnvidia-encode).

  3. Домен и ключ потока: Проверьте, что <server_id> и <stream_key> указаны правильно и что у вас есть доступ к AWS IVS с этими учетными данными.

Шаг 2: Анализ логов и ошибок

При запуске FFmpeg вы получаете следующие сообщения:

[tls @ 0x56527c4445c0] No default whitelist set

Это предупреждение и не должно вызывать проблем. Важно обратить внимание на:

  • Segmentation fault: Это критическая ошибка, указывающая на сбой в коде. Возможно, это связано с недостатком ресурсов, неверной конфигурацией или ошибками в кодеке. Убедитесь, что на сервере достаточно оперативной и графической памяти.

  • Stream starvation: Если вы видите события прерывания потоков в AWS IVS, это может означать, что FFmpeg не может поддерживать постоянный поток данных. Убедитесь, что параметры кодирования настроены правильно, особенно -r (частота кадров). Устанавливаются ли адаптивные значения в зависимости от битрейта сети?

Шаг 3: Проверка сетевых настроек

Проверьте настройки брандмауэра. Как вы отметили, вы разрешили домен *.global-contribute.live-video.net и порт 443. Убедитесь, что никакие другие правила не блокируют исходящие соединения на этот домен и порт.

Вы можете использовать следующие команды для проверки соединения:

ping <server_id>.global-contribute.live-video.net
telnet <server_id>.global-contribute.live-video.net 443

Шаг 4: Оптимизация параметров FFmpeg

Попробуйте оптимизировать параметры потока. Убедитесь, что передаваемый кадровый поток поддерживает достаточно высокий битрейт. Измените частоту кадров и битрейт, чтобы избежать проблем с потоковым воспроизведением. Например:

ffmpeg -fflags nobuffer -loglevel error -i /dev/video1 -f flv -c:v h264_nvenc -preset fast -b:v 1500k -g 60 -pix_fmt yuv420p rtmps://<server_id>.global-contribute.live-video.net:443/app/<stream_key>

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...