“MPEG-1/2 не поддерживает 3/1 fps” при отправке вебкамеры на ffserver

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

Я не могу отправить поток на свой ffserver.

Я запустил сервер с помощью

ffserver -f /etc/ffserver.conf &

где ffserver.conf не был изменен. Я пытался отправить поток с веб-камеры с помощью

ffmpeg -f alsa -ac 2 -i plughw:0,0 -f video4linux2 -s vga -i /dev/video0 http://localhost:8090/feed1.ffm

Однако у меня возникла следующая ошибка:

[...]
[tcp @ 0x560e1234c6e0] Не удалось подключиться к tcp://localhost:8090 (Соединение отклонено), пытаюсь следующий адрес

[…]
MPEG-1/2 не поддерживает 3/1 fps
[…]

Порт 9080 открыт, как видно с помощью nmap localhost

Почему у меня возникает эта ошибка и как отправить мой поток?


Полный вывод:

# ffmpeg -f alsa -ac 2 -i plughw:0,0 -f video4linux2 -s vga -i /dev/video0 http://localhost:8090/feed1.ffm

версия ffmpeg 3.2.1-1 Copyright (c) 2000-2016 разработчики FFmpeg
  создано с gcc 6.2.1 (Debian 6.2.1-5) 20161124
  конфигурация: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-libtesseract --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-libopencv --enable-frei0r --enable-libx264 --enable-chromaprint --enable-shared
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Определено расположение канала для входного потока #0.0 : стерео
Вход #0, alsa, из 'plughw:0,0':
  Продолжительность: Н/Д, начало: 1481703954.356244, битрейт: 1536 кбит/с
    Поток #0:0: Аудио: pcm_s16le, 48000 Гц, стерео, s16, 1536 кбит/с
Вход #1, video4linux2, v4l2, из '/dev/video0':
  Продолжительность: Н/Д, начало: 41830.241126, битрейт: 147456 кбит/с
    Поток #1:0: Видео: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 кбит/с, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
[tcp @ 0x560e6432c6e0] Не удалось подключиться к tcp://localhost:8090 (Соединение отклонено), пытаюсь следующий адрес
[tcp @ 0x560e64345a40] Не удалось подключиться к tcp://localhost:8090 (Соединение отклонено), пытаюсь следующий адрес
[mpeg1video @ 0x560e6435fb20] допуск битрейта 21333 слишком мал для битрейта 64000, переопределение
[mpeg1video @ 0x560e6435fb20] MPEG-1/2 не поддерживает 3/1 fps
Отображение потоков:
  Поток #0:0 -> #0:0 (pcm_s16le (native) -> mp2 (native))
  Поток #1:0 -> #0:1 (rawvideo (native) -> mpeg1video (native))
  Поток #0:0 -> #0:2 (pcm_s16le (native) -> wmav2 (native))
  Поток #1:0 -> #0:3 (rawvideo (native) -> msmpeg4v3 (msmpeg4))
Ошибка при открытии кодировщика для выходного потока #0:1 - возможно, неправильные параметры, такие как битрейт, частота, ширина или высота

Полный /etc/ffserver.conf (без изменений оригинального файла):

HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 200K
ACL allow 127.0.0.1
</Feed>
<Stream test1.mpg>
Feed feed1.ffm
Format mpeg
AudioBitRate 32
AudioChannels 1
AudioSampleRate 44100
VideoBitRate 64
VideoBufferSize 40
VideoFrameRate 3
VideoSize 160x128
VideoGopSize 12
</Stream>
<Stream test.asf>
Feed feed1.ffm
Format asf
VideoFrameRate 15
VideoSize 352x240
VideoBitRate 256
VideoBufferSize 40
VideoGopSize 30
AudioBitRate 64
StartSendOnKey
</Stream>
<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

Я использовал другой ffserver.conf, найденный здесь, чтобы это заработало:

Port 8090 
# привязать ко всем IP-адресам, как алиасированным, так и не алиасированным 
BindAddress 0.0.0.0 
# максимальное количество одновременных клиентов 
MaxClients 1000 
# максимальная ширина пропускания на клиента (кбит/с) 
MaxBandwidth 10000 
# Убрать это, если хотите запустить ffserver как демон. 
NoDaemon 

<Feed feed1.ffm> 
File /tmp/feed1.ffm 
FileMaxSize 5M 
</Feed> 

<Stream test.swf>
Feed feed1.ffm
Format swf
VideoCodec flv
VideoFrameRate 15
VideoBufferSize 80000
VideoBitRate 100
VideoQMin 1
VideoQMax 5
VideoSize 352x288
PreRoll 0
Noaudio
</Stream>

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

Ваша проблема связана с ошибкой при стриминге с использованием ffserver, а именно с сообщением об ошибке:

MPEG-1/2 does not support 3/1 fps

Причины возникновения ошибки

  1. Несоответствие частоты кадров: Стандартные кодеки MPEG-1 и MPEG-2 поддерживают фиксированные частоты кадров, такие как 24, 25 и 30 кадров в секунду. Ошибка указывает на то, что сервер пытается использовать частоту кадров, которая не поддерживается, а именно 3/1 (что эквивалентно 3 FPS). Это может происходить, если параметры вашего потока настроены для поддержки неправильной частоты кадров.

  2. Ошибка подключения: Сообщение об ошибке Connection refused может указывать на то, что ffserver неправильно настроен или не работает на ожидаемом порту (8090), либо его конфигурация не позволяет входящие соединения.

Рекомендации по решению проблемы

  1. Проверьте конфигурацию ffserver.conf:
    Убедитесь, что настройки потока в ffserver.conf соответствуют требованиям вашего источника видео. Например, в вашей конфигурации вы указали частоту кадров в VideoFrameRate 3, что не поддерживается MPEG-1/2. Измените это значение на более стандартное значение, например, 25 или 30.

    Пример:

    VideoFrameRate 30
  2. Проверьте синхронизацию потоков:
    Убедитесь, что поток видео и аудио имеют согласованные параметры по битрейту, разрешению и частоте кадров. У вас в выводе указано, что видео идет с частотой 30 FPS, поэтому и в конфигурации ffserver.conf значение должно быть аналогичным.

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

    killall ffserver
    ffserver -f /etc/ffserver.conf &
  4. Проблемы с подключением:
    Убедитесь, что ffserver действительно слушает на порту 8090. Вы можете использовать netstat или ss для проверки:

    netstat -tuln | grep 8090

    Если ffserver запущен, вы должны увидеть что-то вроде tcp 0 0 0.0.0.0:8090.

  5. Настройка параметров ffmpeg:
    Убедитесь, что команда ffmpeg, которую вы используете для передачи потока, не содержит неправильных параметров. Например, убедитесь, что вы не пытаетесь принудительно задать частоту кадров, несовместимую с MPEG.

    Ваша команда может выглядеть так:

    ffmpeg -f alsa -ac 2 -i plughw:0,0 -f video4linux2 -s vga -r 30 -i /dev/video0 http://localhost:8090/feed1.ffm

    Здесь ключ -r 30 устанавливает частоту кадров на 30 FPS.

В заключение

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

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

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

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