Как я могу убедить ffserver сохранить поток с веб-камеры из локального источника в файл с высоким разрешением и передать его в более низком разрешении?

У нас есть удаленная машина с 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 почти непроницаемы.

Спасибо!

Доминик


person Dominic Jacobssen    schedule 16.11.2011    source источник
comment
Я думаю проблема в ReadOnlyFile /tmp/feed.ffm   -  person Morteza Milani    schedule 27.01.2012


Ответы (2)


Проблема в мп4. В mp4 нет потоковой передачи, которая в основном представляет собой Moov-Atoms. mp4 может обернуть URL-адреса rtsp, но не вокруг. поэтому переключитесь на mpegts или используйте rtsp с файлом sdp для деталей подключения.

person Matthias Šubik    schedule 18.05.2012

Для стрима я использовал asf-формат, который работал хорошо :)

Также я мог бы добавить, что качество видео, вероятно, будет довольно плохим из-за

VideoBitRate 100

Что дает серверу только 100 кбит/сек для обслуживания потока. При потоковой передаче в хорошем качестве я использую

VideoBitRate 1024

для видео 640x480.

person Robert K.    schedule 02.11.2015