У нас есть удаленный компьютер с Linux, доступный по VPN, с веб-камерой USB. Мы хотим использовать это для видеоконференций, но мы также хотим сохранить поток для архивирования.
Поскольку пропускная способность потоковой передачи ограничена, имеет смысл захватывать поток на той же машине, что и веб-камера, и rsync, который используется по факту, а не пытаться захватывать потоковый контент, который обязательно будет плохим качество.
Мы пытаемся использовать ffmpeg и ffserver для достижения этой цели, но без особого успеха. Большинство статей в интернете посвящены либо просто потоковой передаче с веб-камеры, либо ретрансляции удаленного потока. Мы обнаружили, что пришлось перекомпилировать ffserver из-за пропущенного "my_addr-> sin_family = AF_INET;" в версии ffserver.c, которую мы использовали, поскольку исправлено в git.
Вот файл ffserver.conf, который мы пытаемся использовать:
Port 43688
BindAddress 127.0.0.1
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
NoDaemon
<Feed feed.ffm>
ReadOnlyFile /tmp/feed.ffm
FileMaxSize 20M
ACL allow 127.0.0.1
</Feed>
<Stream stream.mp4>
Feed feed.ffm
Format mp4
VideoSize qvga
VideoGopSize 12
VideoHighQuality
Video4MotionVector
VideoCodec libx264
VideoBitRate 100
VideoBufferSize 40
VideoFrameRate 5
VideoQMin 3
VideoQMax 31
AudioCodec libfaac
AudioBitRate 32
AudioChannels 2
AudioSampleRate 22050
ACL allow localhost
</Stream>
Когда мы запускаем это, мы получаем ошибку:
Unable to create feed file '/tmp/feed.ffm' as it is marked readonly
Достаточно справедливо, но это не то, что подразумевается в документах. Изменение директивы на:
File /tmp/feed.ffm
позволяет ffserver запускаться и, кажется, сидеть и ждать, пока ffmpeg подключится к нему. Однако, когда мы запускаем ffmpeg с помощью команды:
ffmpeg -f alsa -i pulse -r 16000 -f video4linux2 -s qvga -i /dev/video0 -r 5 -f mp4 -vcodec libx264 -sameq -acodec libfaac -ab 32k http://127.0.0.1:43688/feed.ffm
затем веб-камера загорается, и ffserver подтверждает соединение с сообщениями:
New connection: POST /feed.ffm
[POST] "/feed.ffm HTTP/1.1" 200 0
но через несколько секунд мы получаем ошибки:
[mp4 @ 0x264b160] muxer does not support non seekable output
Could not write header for output file #0 (incorrect codec parameters ?)
Мы пробовали различные другие форматы (mpeg, mpegts, avi) и кодеки (mpeg1video, mpeg2video, mpeg4), но все безуспешно.
Кроме того, у нас сложилось впечатление, что ffserver может перекодировать формат ввода в более низкое разрешение для потоковой передачи, но если разрешение потока не соответствует разрешению канала, мы получим ошибку о несоответствующих разрешениях.
Кому-нибудь когда-нибудь удавалось заставить это работать правильно? Я читал о том, что vlc может делать что-то подобное, но командные строки vlc почти непроницаемы.
Спасибо!
Dominic