如何说服ffserver以高分辨率将本地源摄像头流保存到文件中并以较低分辨率流式传输?

时间:2011-11-16 13:08:07

标签: streaming ffmpeg webcam vlc ffserver

我们有一台可通过VPN访问的远程Linux机器,它具有USB网络摄像头。我们希望将其用于视频会议,但我们也希望存储流以进行存档。

由于流式传输带宽有限,因此在与事后的网络摄像头和rsync相同的计算机上捕获流是有意义的,而不是尝试捕获流式内容,这必然会很差质量。

我们正在尝试使用ffmpeg和ffserver来实现这一目标,但收效甚微。互联网上的大多数文章都只处理流式传输网络摄像头或重播远程流。我们发现由于缺少“my_addr-> sin_family = AF_INET”,我们不得不重新编译ffserver。在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可以将输入格式重新编码为较低的分辨率以进行流式传输,但如果流分辨率与Feed分辨率不匹配,则会出现有关分辨率不匹配的错误。

有没有人设法让这个工作正常?我已经读过vlc能够做这样的事情,但是vlc命令行几乎是不可穿透的。

谢谢!

2 个答案:

答案 0 :(得分:2)

问题是mp4。 mp4中没有流媒体,基本上是Moov-Atoms。 mp4可以包装rtsp网址,但不能包围。所以切换到mpegts,或者使用带有sdp文件的rtsp来获取连接细节。

答案 1 :(得分:0)

要流式传输,我使用了效果很好的asf格式:)

另外我可能会补充说,由于

,视频的质量可能会非常糟糕

VideoBitRate 100

这使服务器只能提供100 kbit / sec的流量。当流媒体质量很好时,我用

VideoBitRate 1024

用于640x480视频。