У нас есть удаленная машина с 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 почти непроницаемы.
Спасибо!
Доминик
ReadOnlyFile /tmp/feed.ffm
- person Morteza Milani   schedule 27.01.2012