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

У нас есть удаленный компьютер с 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

Ответы [ 2 ]

2 голосов
/ 18 мая 2012

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

0 голосов
/ 02 ноября 2015

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

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

VideoBitRate 100

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

VideoBitRate 1024

для видео 640x480.

...