我们有一台远程 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 命令行几乎是难以理解的。
谢谢!
多米尼克