Конфигурация ffserver для обработки большого потока webm.

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

Я настраиваю ffserver для потоков CCTV с 16 камерами — все отдельные каналы передаются хорошо с такой конфигурацией:

<Feed 0.ffm>
File /tmp/0.ffm
FileMaxSize 5M
ACL allow 10.1.2.2
</Feed>

<Feed 0_webm.ffm>
File /tmp/0_webm.ffm
FileMaxSize 5M
ACL allow localhost
</Feed>

<Stream 0.mpg>
Feed 0.ffm
Format mpeg1video
NoAudio
VideoFrameRate 24
VideoBitRate 256
VideoSize 320x240
VideoBufferSize 40
VideoGopSize 12
</Stream>

<Stream 0.webm>
Feed 0_webm.ffm
Format webm
NoAudio
VideoCodec libvpx
VideoSize 320x240
VideoFrameRate 24
AVOptionVideo flags +global_header
AVOptionVideo cpu-used 0
AVOptionVideo qmin 1
AVOptionVideo qmax 31
AVOptionVideo quality good
PreRoll 0
StartSendOnKey
VideoBitRate 500K
</Stream>

И связанные вызовы ffmpeg, сделанные в процессы upstart:

ffmpeg -f video4linux2 -standard ntsc -i /dev/video0 http://10.1.2.1:8090/0.ffm

и

ffmpeg -f mpegvideo -i http://localhost:8090/0.mpg -vcodec libvpx http://localhost:8090/0_webm.ffm

Однако, когда дело доходит до большого обзора 4×4 сетки всех каналов, у меня возникают проблемы с конфигурацией ffserver.conf. Используя этот вызов ffmpeg, сделанный в демон, я могу надежно управлять около 24-25 FPS (и проверил, что это работает, сохраняя на локальный файл и воспроизводя его через ffplay):

ffmpeg -i http://localhost:8090/0.webm -i http://localhost:8090/1.webm -i http://localhost:8090/2.webm -i http://localhost:8090/3.webm -i http://localhost:8090/4.webm -i http://localhost:8090/5.webm -i http://localhost:8090/6.webm -i http://localhost:8090/7.webm -i http://localhost:8090/8.webm -i http://localhost:8090/9.webm -i http://localhost:8090/10.webm -i http://localhost:8090/11.webm -i http://localhost:8090/12.webm -i http://localhost:8090/13.webm -i http://localhost:8090/14.webm -i http://localhost:8090/15.webm -filter_complex "
nullsrc=size=1280x960 [bg];
[0:v] setpts=PTS-STARTPTS [v0];
[1:v] setpts=PTS-STARTPTS [v1];
[2:v] setpts=PTS-STARTPTS [v2];
[3:v] setpts=PTS-STARTPTS [v3];
[4:v] setpts=PTS-STARTPTS [v4];
[5:v] setpts=PTS-STARTPTS [v5];
[6:v] setpts=PTS-STARTPTS [v6];
[7:v] setpts=PTS-STARTPTS [v7];
[8:v] setpts=PTS-STARTPTS [v8];
[9:v] setpts=PTS-STARTPTS [v9];
[10:v] setpts=PTS-STARTPTS [v10];
[11:v] setpts=PTS-STARTPTS [v11];
[12:v] setpts=PTS-STARTPTS [v12];
[13:v] setpts=PTS-STARTPTS [v13];
[14:v] setpts=PTS-STARTPTS [v14];
[15:v] setpts=PTS-STARTPTS [v15];
[bg][v0] overlay=shortest=1 [bg];
[bg][v1] overlay=shortest=1:x=320 [bg];
[bg][v2] overlay=shortest=1:x=640 [bg];
[bg][v3] overlay=shortest=1:x=960 [bg];
[bg][v4] overlay=shortest=1:y=240 [bg];
[bg][v5] overlay=shortest=1:x=320:y=240 [bg];
[bg][v6] overlay=shortest=1:x=640:y=240 [bg];
[bg][v7] overlay=shortest=1:x=960:y=240 [bg];
[bg][v8] overlay=shortest=1:y=480 [bg];[bg]
[v9] overlay=shortest=1:x=320:y=480 [bg];
[bg][v10] overlay=shortest=1:x=640:y=480 [bg];
[bg][v11] overlay=shortest=1:x=960:y=480 [bg];
[bg][v12] overlay=shortest=1:y=720 [bg];
[bg][v13] overlay=shortest=1:x=320:y=720 [bg];
[bg][v14] overlay=shortest=1:x=640:y=720 [bg];
[bg][v15] overlay=shortest=1:x=960:y=720" http://localhost:8090/all_webm.ffm

проблема возникает при подключении к ffserver — ни процесс ffmpeg, ни процесс ffserver не падают, но поток недоступен (при этом одноканальные .webm работают нормально). Я пробовал ту же конфигурацию, что и для меньших .webm, с измененным разрешением, а также с этой:

<Feed all_webm.ffm>
File /tmp/all_webm.ffm
FileMaxSize 20M
ACL allow localhost
</Feed>

<Stream all.webm>
Feed all_webm.ffm
Format webm
NoAudio
VideoCodec libvpx
VideoSize 1280x960
VideoFrameRate 24
AVOptionVideo flags +global_header
AVOptionVideo cpu-used 0
AVOptionVideo qmin [1|10]
AVOptionVideo qmax [31|42]
AVOptionVideo quality good
PreRoll 0
StartSendOnKey
VideoBitRate [512|700|800|1024|3M|3686400]
</Stream>

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

Редактировать: Добавлены потоки, которые я использую (нет фактических изменений, поток all.webm все еще не работает по каким-то не указанным причинам). Также я должен был изначально включить это, но вывод ffplay следующий (он просто виснет на неопределенное время):

ffplay http://10.1.1.15:8090/all.webm
ffplay version git-2013-03-17-ef3c888 Copyright (c) 2003-2013 the FFmpeg developers
  built on Mar 17 2013 19:21:22 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libspeex --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-x11grab --enable-libx264 --enable-nonfree --enable-version3
  libavutil      52. 19.101 / 52. 19.101
  libavcodec     55.  1.100 / 55.  1.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    55.  0.100 / 55.  0.100
  libavfilter     3. 47.102 /  3. 47.102
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
    nan A-V:  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

Еще одно изменение:

Тестировано со следующим:

ffmpeg -r 29.97 -f lavfi -i testsrc -s 1280x960 -r 29.97 http://localhost:8090/all_webm.ffm

Которое работает для потоковой передачи тестового запроса (хотя медленно, оно должно останавливаться каждые пару секунд, чтобы догнать в chrome, и сбивается после того же периода в firefox) — получает только 13 FPS. Так что я попытался разделить тест и преобразование в webm следующим образом:

ffmpeg -f lavfi -i testsrc -s 1280x960 -r 29.97 http://localhost:8090/all.ffm
ffmpeg -r 29.97 -f mpegvideo -i http://localhost:8090/all.mpg -r 29.97 -vcodec libvpx http://localhost:8090/all_webm.ffm

Первая команда получает 29.97+ FPS, вторая — 13 FPS.

Я не так беспокоюсь о FPS (13 FPS было бы достаточно для сетки 4×4), но это приводит меня к мысли, что проблема может существовать между длинной командой ffmpeg (с опцией -format_complex) и импортом в ffserver, несмотря на то, что она записывает полностью действительный .webm файл, когда отправляется в локальный файл вместо ffserver — все еще нужна помощь.

Еще одно изменение:

Добавляю хвост большого вывода ffmpeg, отправленного на http://localhost:8090/all_webm.ffm ниже, я видел подобный вывод в меньших процессах ffmpeg, которые работают, но скорость, с которой он отличается, поэтому я не думал, что это имеет значение (записывая на локальный .webm файл и подсчитывая продолжительность записи, идя перед одной из камер, а затем возвращаясь к моменту, когда я остановил процесс, время совпадало, и воспроизведение показывало плавное движение с 25 FPS), но я не знаю достаточно о процессе, чтобы полностью исключить это (следующее — конец вывода консоли после нажатия “q” для остановки ffmpeg):

[Parsed_overlay_26 @ 0x37464e0] Buffer queue overflow, dropping.
    Last message repeated 19 times
Buffer queue overflow, dropping. size=       4kB time=00:36:21.64 bitrate=   0.0kbits/s
[Parsed_overlay_25 @ 0x374db20] Buffer queue overflow, dropping.
    Last message repeated 28 times
[Parsed_overlay_17 @ 0x374ba40] Buffer queue overflow, dropping.
    Last message repeated 11 times
[Parsed_overlay_20 @ 0x374e3c0] Buffer queue overflow, dropping.
    Last message repeated 30 times
[Parsed_overlay_19 @ 0x374e4a0] Buffer queue overflow, dropping.
    Last message repeated 28 times
[Parsed_overlay_32 @ 0x3749b20] Buffer queue overflow, dropping.
    Last message repeated 17 times
[Parsed_overlay_24 @ 0x3745fc0] Buffer queue overflow, dropping.
    Last message repeated 2 times
[Parsed_overlay_23 @ 0x3751060] Buffer queue overflow, dropping.
Buffer queue overflow, dropping. size=       4kB time=00:36:22.28 bitrate=   0.0kbits/s
[Parsed_overlay_17 @ 0x374ba40] Buffer queue overflow, dropping.
    Last message repeated 6 times
Buffer queue overflow, dropping. size=       4kB time=00:36:23.04 bitrate=   0.0kbits/s
[Parsed_overlay_17 @ 0x374ba40] Buffer queue overflow, dropping.
    Last message repeated 22 times
Buffer queue overflow, dropping. size=       4kB time=00:36:23.68 bitrate=   0.0kbits/s
[Parsed_overlay_17 @ 0x374ba40] Buffer queue overflow, dropping.
    Last message repeated 10 times
Buffer queue overflow, dropping. size=       4kB time=00:36:24.12 bitrate=   0.0kbits/s
[Parsed_overlay_17 @ 0x374ba40] Buffer queue overflow, dropping.
    Last message repeated 9 times
Buffer queue overflow, dropping. size=       4kB time=00:36:24.84 bitrate=   0.0kbits/s
[Parsed_overlay_17 @ 0x374ba40] Buffer queue overflow, dropping.
    Last message repeated 1 times
Buffer queue overflow, dropping. size=       4kB time=00:36:25.32 bitrate=   0.0kbits/s
frame=54637 fps= 25 q=24.8 Lq=0.0 size=      48kB time=00:36:25.44 bitrate=   0.2kbits/s
video:172039kB audio:0kB subtitle:0 global headers:0kB muxing overhead -99.972099%

Вы указали <feed all_webm.ffm> ... </feed> перед вашим <Stream all.webm>? Думаю, это должно решить проблему, потому что, вероятно, FFserver не знает, откуда брать поток.

Если это не сработает, вы также можете протестировать ваш поток из FFmpeg, используя ffplay http://localhost:8090/all_webm.ffm

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

Конфигурация ffserver для обработки крупного потока webm требует внимательного подхода и оптимизации. Учитывая детали, представленные в описании проблемы, необходимо рассмотреть несколько аспектов конфигурации как ffserver, так и ffmpeg, чтобы успешно реализовать потоковое вещание для 16 камер и сбор общей 4×4 сетки.

Анализ проблемы

Перед вами стоит задача настройки ffserver для CCTV потоков с 16 камерами с последующей компоновкой и потоковым вещанием всех каналов в формате webm. Индивидуальные каналы работают корректно, однако возникли проблемы с агрегированным потоком. Симптомами являются невозможность доступа к общему потоку через ffserver, даже если компоненты не выдают ошибок.

Шаги для настройки

  1. Обеспечение соответствия конфигурации ffserver и ffmpeg:

    • Убедитесь, что рабочая конфигурация <Feed all_webm.ffm> предваряется соответствующему <Stream all.webm>. Это обеспечивает потоковую передачу данных от ffmpeg к ffserver.
    • Проверьте наличие следующего сегмента в конфигурационном файле ffserver:

      <Feed all_webm.ffm>
      File /tmp/all_webm.ffm
      FileMaxSize 20M
      ACL allow localhost
      </Feed>
      
      <Stream all.webm>
      Feed all_webm.ffm
      Format webm
      NoAudio
      VideoCodec libvpx
      VideoSize 1280x960
      VideoFrameRate 24
      AVOptionVideo flags +global_header
      AVOptionVideo cpu-used 0
      AVOptionVideo qmin 1
      AVOptionVideo qmax 31
      AVOptionVideo quality good
      PreRoll 0
      StartSendOnKey
      VideoBitRate 1024K
      </Stream>
  2. Оптимизация производительности ffmpeg:

    • Убедитесь, что используете -filter_complex с оптимизацией обмена данными: уменьшите длину буфера между выводами оверлейных фильтров, которые указывают на переполнение буфера.
    • Рассмотрите сокращение нагрузки на процессор с помощью AVOptionVideo cpu-used 1 или другого соответствующего значения, которое позволяет поддерживать баланс между качеством и эффективностью.
  3. Проверка потока:

    • Проведите тестирование прямой трансляции потока с помощью ffplay http://localhost:8090/all.webm и напрямую на основе ffmpeg http://localhost:8090/all_webm.ffm для проверки как источника потока от ffmpeg, так и его управления в ffserver.
  4. Решение проблем с пропускной способностью и производительностью:

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

Резюме

Ваша задача по интеграции потока webm с большими разрешениями и множественными источниками предполагает комплексное взаимодействие настроек ffserver и ffmpeg. Следуя приведенным рекомендациям, вы сможете минимизировать проблемы с производительностью и оптимизировать потоковую передачу, обеспечивая надежную трансляцию для вашего проекта с видеонаблюдением.

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

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