Вопрос или проблема
Когда я пытаюсь транслировать видео, оно, похоже, работает, но битрейт и размер отсутствуют frame= 277 fps= 26 q=-1.0 size=N/A time=00:00:11.07 bitrate=N/A speed=1.05x
Я запускаю следующую команду, чтобы транслировать видео на RTSP сервер:
ffmpeg -re -stream_loop -1 -i idurre-2024-09-17-12h33m19s.mp4 -c copy -f rtsp -rtsp_transport tcp rtsp://localhost:8554/test
Вывод ffmpeg выглядит так:
ffmpeg version 7.1 Copyright (c) 2000-2024 the FFmpeg developers
built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags="-Wl,-ld_classic" --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x127704880] st: 0 edit list: 1 Не хватает ключевого кадра при поиске временной метки: 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x127704880] st: 0 edit list 1 Не удалось найти индексный элемент перед временной меткой: 0.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'idurre-2024-09-17-12h33m19s.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: mp41avc1
creation_time : 2024-09-17T10:34:16.000000Z
encoder : vlc 3.0.21 stream output
encoder-eng : vlc 3.0.21 stream output
Duration: 00:00:55.68, start: 0.000000, bitrate: 16205 kb/s
Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709, progressive), 1920x1080, 16203 kb/s, 25 fps, 25 tbr, 1000k tbn (default)
Metadata:
creation_time : 2024-09-17T10:34:16.000000Z
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Output #0, rtsp, to 'rtsp://localhost:8554/test':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: mp41avc1
encoder : Lavf61.7.100
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709, progressive), 1920x1080, q=2-31, 16203 kb/s, 25 fps, 25 tbr, 90k tbn (default)
Metadata:
creation_time : 2024-09-17T10:34:16.000000Z
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Нажмите [q], чтобы остановить, [?] для помощи
frame= 516 fps= 26 q=-1.0 size=N/A time=00:00:20.63 bitrate=N/A speed=1.03x
[q] команда получена. Выход.
[out#0/rtsp @ 0x6000008e0240] video:40672KiB audio:0KiB subtitle:0KiB другие потоки:0KiB глобальные заголовки:0KiB накладные расходы при мультиплексировании: неизвестно
frame= 528 fps= 26 q=-1.0 Lsize=N/A time=00:00:21.11 bitrate=N/A speed=1.02x
Сервер, на который я транслирую, это MediaMTX, который должен принимать поток. Похоже, он подключен, так как он его регистрирует:
mediamtx-rtsp | 2024/10/06 10:35:13 INF MediaMTX v1.9.0
mediamtx-rtsp | 2024/10/06 10:35:13 INF конфигурация загружена из /mediamtx.yml
mediamtx-rtsp | 2024/10/06 10:35:13 INF [RTSP] слушатель открыт на :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
mediamtx-rtsp | 2024/10/06 10:35:13 INF [SRT] слушатель открыт на :8890 (UDP)
mediamtx-rtsp | 2024/10/06 10:35:16 INF [RTSP] [conn 192.168.65.1:17069] открыт
mediamtx-rtsp | 2024/10/06 10:35:16 INF [RTSP] [session b3bb2623] создан с 192.168.65.1:17069
mediamtx-rtsp | 2024/10/06 10:35:16 INF [RTSP] [session b3bb2623] публикуется по пути 'test', 1 трек (H264)
Но когда я пытаюсь прочитать его с помощью ffplay, ничего не отображается…
Ответ или решение
Проблема, с которой вы сталкиваетесь при потоке видео через RTSP с использованием FFmpeg, может быть связана с несколькими факторами, включая неправильную настройку кодирования, отсутствием ключевых кадров или проблемами на стороне сервера (в данном случае MediaMTX). Давайте подробно разберем возможные причины и решения.
Причины отсутствия битрейта и размера
-
Ключевые кадры (I-кадры):
Отсутствие ключевых кадров может вызывать проблемы при стриминге. Кодек H.264 требует наличие таких кадров для корректного декодирования видео в потоке. Поскольку вы используете опцию-c copy
, видео не перекодируется, и ключевые кадры могут отсутствовать. -
Кодек и параметры кодирования:
Использование параметра-c copy
не всегда уместно, когда необходимо продвигать поток. Возможно, стоит использовать перекодирование видеопотока с явным указанием битрейта и других ключевых параметров.
Решения
Попробуйте изменить вашу команду FFmpeg следующим образом:
ffmpeg -re -stream_loop -1 -i idurre-2024-09-17-12h33m19s.mp4 -c:v libx264 -b:v 16205k -preset veryfast -f rtsp -rtsp_transport tcp rtsp://localhost:8554/test
Пояснения к опциям:
-c:v libx264
: Использование кодека H.264 для кодирования видеопотока.-b:v 16205k
: Установка битрейта видеопотока. Вы можете отрегулировать это значение в зависимости от ваших требований к качеству.-preset veryfast
: Использование быстрого преднастройки, чтобы уменьшить нагрузку на процессор.
После применения данных изменений попробуйте снова запустить поток и проверьте, отображаются ли битрейт и размер в выводе FFmpeg.
Проверка на стороне клиента
Если после этих изменений вы все равно не видите видео с помощью ffplay
, выполните следующие шаги:
- Убедитесь, что FFmpeg и FFplay обновлены до последней версии.
- Проверьте, что RTSP-сервер (MediaMTX) работает корректно и принимает поток, что видно из ваших логов.
- Попробуйте воспроизвести поток по следующей команде:
ffplay rtsp://localhost:8554/test
- Если по-прежнему нет изображения, проверьте наличие сетевых проблем или блокировок брандмауэра.
Дополнительные рекомендации
- Используйте параметр
-loglevel debug
в команде FFmpeg для более детального вывода, что поможет вам выявить другие проблемы, если они возникнут. - Убедитесь, что у вас достаточно ресурсов на сервере для обработки и передачи видео, так как низкое качество графики может приводить к задержкам и сбоям.
Если вы выполните все вышеописанные шаги, шансы на успешную потоковую передачу увеличатся. Если проблема сохраняется, может потребоваться более глубокая диагностика специфических логов и настроек вашего сетевого окружения или оборудования.