3

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

2 Answers2

2

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.

0

To stream, I used the asf-format which worked well :)

Also I might add that the quality of the video probably will be pretty bad due to the

VideoBitRate 100

Which gives the server only 100 kbit/sec to serve the stream. When streaming in good quality I use

VideoBitRate 1024

for a 640x480 Video.

Robert K.
  • 76
  • 5