streaming - 如何说服 ffserver 将本地来源的网络摄像头流保存到高分辨率的文件中并以较低的分辨率进行流传输?

标签 streaming ffmpeg webcam vlc ffserver

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

由于流媒体带宽有限,因此在与网络摄像头相同的计算机上捕获流并在事后进行 rsync 是有意义的,而不是 try catch 流媒体内容,这必然会很差质量。

我们正在尝试使用 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 命令行几乎难以理解。

谢谢!

多米尼克

最佳答案

问题是 mp4。 mp4 中没有流媒体,基本上是 Moov-Atoms。 mp4 可以包裹 rtsp url,但不能包裹。因此,请切换到 mpegts,或使用 rtsp 和 sdp 文件来获取连接详细信息。

关于streaming - 如何说服 ffserver 将本地来源的网络摄像头流保存到高分辨率的文件中并以较低的分辨率进行流传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8152178/

相关文章:

c++ - 如何在 C++ 中使用 ffmpeg 流式传输 opencv Mat

audio - 使用 ffmpeg 在一个音频文件中添加多个淡入/淡出效果

Android opengl es YUV to RGB conversion using shaders

c++ - 使用 C++ 捕获 MacBook Pro iSight 视频

linux - 在 Linux 下的 Java 中使用网络摄像头

ffmpeg - 使用 FFMPEG 将 Socket 上的 RTP 音频数据重新采样为 PCM 数据

iphone - HTTP 自适应比特率流式传输如何在 iPhone 上工作?

ruby-on-rails - 通过 RTMP/Rails 录制音频

python - 将使用 PyAV 接收的 h264 包保存在磁盘上

actionscript-3 - 直接上传从网络摄像头捕获的视频