3

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

谢谢!

多米尼克

4

2 回答 2

2

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

于 2012-05-18T17:22:51.357 回答
0

为了流式传输,我使用了运行良好的 asf 格式 :)

另外我可能会补充一点,视频的质量可能会很差,因为

VideoBitRate 100

这使服务器只有 100 kbit/sec 来提供流服务。当以高质量流式传输时,我使用

VideoBitRate 1024

对于 640x480 视频。

于 2015-11-02T16:36:51.217 回答