Вопрос или проблема
У меня проблема с использованием 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>
Обратите внимание на следующие точки:
-
Путь к видеоустройству: Убедитесь, что
/dev/video1
действительно соответствует вашему видеопотоку на удаленном сервере. Вы можете проверить это с помощью командыls /dev/video*
, чтобы убедиться, что поток доступен. -
Кодек h264_nvenc: Использование NVENC предполагает наличие соответствующего оборудования и драйверов на сервере. Убедитесь, что у вас есть и правильно установлены драйверы NVIDIA и необходимые библиотеки (
libnvidia-encode
). -
Домен и ключ потока: Проверьте, что
<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 для более глубокой диагностики.