Вопрос или проблема
Я не могу отправить поток на свой 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
Причины возникновения ошибки
-
Несоответствие частоты кадров: Стандартные кодеки MPEG-1 и MPEG-2 поддерживают фиксированные частоты кадров, такие как 24, 25 и 30 кадров в секунду. Ошибка указывает на то, что сервер пытается использовать частоту кадров, которая не поддерживается, а именно 3/1 (что эквивалентно 3 FPS). Это может происходить, если параметры вашего потока настроены для поддержки неправильной частоты кадров.
-
Ошибка подключения: Сообщение об ошибке
Connection refused
может указывать на то, чтоffserver
неправильно настроен или не работает на ожидаемом порту (8090), либо его конфигурация не позволяет входящие соединения.
Рекомендации по решению проблемы
-
Проверьте конфигурацию
ffserver.conf
:
Убедитесь, что настройки потока вffserver.conf
соответствуют требованиям вашего источника видео. Например, в вашей конфигурации вы указали частоту кадров вVideoFrameRate 3
, что не поддерживается MPEG-1/2. Измените это значение на более стандартное значение, например, 25 или 30.Пример:
VideoFrameRate 30
-
Проверьте синхронизацию потоков:
Убедитесь, что поток видео и аудио имеют согласованные параметры по битрейту, разрешению и частоте кадров. У вас в выводе указано, что видео идет с частотой 30 FPS, поэтому и в конфигурацииffserver.conf
значение должно быть аналогичным. -
Перезагрузка
ffserver
:
После внесения изменений в конфигурационный файл не забудьте перезапуститьffserver
, чтобы применить новые параметры. Вы можете сделать это следующими командами:killall ffserver ffserver -f /etc/ffserver.conf &
-
Проблемы с подключением:
Убедитесь, чтоffserver
действительно слушает на порту 8090. Вы можете использоватьnetstat
илиss
для проверки:netstat -tuln | grep 8090
Если
ffserver
запущен, вы должны увидеть что-то вродеtcp 0 0 0.0.0.0:8090
. -
Настройка параметров 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
, чтобы получить дополнительную информацию о природе ошибки.