Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I convince ffserver to save a locally-sourced webcam stream to a file in high resolution AND stream it in lower resolution?

We have a remote Linux machine, accessible over VPN, which has a USB webcam. We want to use this for video conferencing, but we also want to store the stream for archiving.

Since the streaming bandwidth is limited, it makes sense to capture the stream on the same machine as the webcam and rsync that across after-the-fact, rather than trying to capture the streamed content, which is necessarily going to be poor quality.

We're trying to use ffmpeg and ffserver to achieve this, but with little success. Most of the articles on the internet either deal with just streaming a webcam, or rebroadcasting a remote stream. We found we had to recompile ffserver because of a missing "my_addr->sin_family = AF_INET;" in the version of ffserver.c we had been using, since fixed in git.

Here's the ffserver.conf we're trying to use:

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>

When we fire this up, we get the error:

Unable to create feed file '/tmp/feed.ffm' as it is marked readonly

Fair enough, but this is not what is implied in the docs. Changing the directive to:

File /tmp/feed.ffm

allows ffserver to fire up and appear to sit and wait for ffmpeg to connect to it. However, when we fire up ffmpeg with the command:

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

then the webcam lights up and ffserver acknowledges the connection with the messages:

New connection: POST /feed.ffm
[POST] "/feed.ffm HTTP/1.1" 200 0

but after a few seconds we get the errors:

[mp4 @ 0x264b160] muxer does not support non seekable output
Could not write header for output file #0 (incorrect codec parameters ?)

We've tried various other formats (mpeg, mpegts, avi) and codecs (mpeg1video, mpeg2video, mpeg4), all without success.

Moreover, we were under the impression that ffserver could reencode input format to a lower resolution for streaming, but if the stream resolution doesn't match the feed resolution, we get an error about the resolutions not matching.

Has anyone ever managed to get this working correctly? I've read about vlc being able to do something like this, but the vlc command lines are well nigh impenetrable.

Thanks!

Dominic

like image 626
Dominic Jacobssen Avatar asked Dec 21 '25 14:12

Dominic Jacobssen


1 Answers

The problem is mp4. There is no streaming in mp4, which is basically Moov-Atoms. mp4 can wrap rtsp urls, but not around. so switch to mpegts, or use rtsp with a sdp file for the connection details.

like image 101
Matthias Šubik Avatar answered Dec 24 '25 11:12

Matthias Šubik



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!