我和之前许多勇敢的修补匠一样,认为将旧的 USB 摄像头 (c920) 与 Raspberry Pi 配对以制作网络流媒体设备(例如婴儿监视器)是一项简单的任务。正如那些先我而来的人一样,我现在意识到(经过两天的绞尽脑汁),这是一项极其复杂的任务。
问题描述:我有一台 Raspberry Pi Zero 和一台 C920 网络摄像头。我想使用网络摄像头的 H.264 比特流,并在 Raspberry Pi 上提供它,而无需对其进行转码(微弱的处理器确实会很吃力)。我想将视频流与其音频结合起来,并将其发送到浏览器(手机、平板电脑、PC - 没有 NAPI 的 HTML5)。
我当前的策略是执行以下操作:
ffmpeg -re -f s16le -i /dev/zero -f v4l2 -thread_queue_size 512 -codec:v h264 -s 1920x1080 -i /dev/video0 -codec:v copy -acodec aac -ab 128k -g 50 http://localhost:8090/camera.ffm
(这是虚拟音频 - 我认为稍后我会添加音频)
接下来是sudo ffserver -d -f /etc/ffserver.conf
接收 feed 并将其作为流进行广播。这是文件ffserver.conf
:
`HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 100000
CustomLog -
<Feed camera.ffm>
File /tmp/streamwebm.ffm
FileMaxSize 50M
ACL allow localhost
ACL allow 128.199.149.46
ACL allow 127.0.0.1
ACL allow 192.168.0.0 192.168.0.255
</Feed>
<Stream stream>
ACL allow 192.168.0.0 192.168.0.255
Format webm
# Video Settings
VideoFrameRate 30
VideoSize 1920x1080
# Audio settings
AudioCodec libvorbis
AudioSampleRate 48000
AVOptionAudio flags +global_header
MaxTime 0
AVOptionVideo me_range 16
AVOptionVideo qdiff 4
AVOptionVideo qmin 4
AVOptionVideo qmax 40
#AVOptionVideo good
AVOptionVideo flags +global_header
# Streaming settings
PreRoll 10
StartSendOnKey
Metadata author "author"
Metadata copyright "copyright"
Metadata title "Web app name"
Metadata comment "comment"
</stream>
我的基本 html 是<html><head></head><body><video> <source src="http://localhost:8090/stream"> </video></body></html>
客户端浏览器显示(failed) NET::ERR_CONNECTION_REFUSED
想法:-https://stackoverflow.com/questions/28435564/begin-stream-simple-mp4-with-ffserver解释 ffserver 无法传输 .mp4,原因是标头或其他原因。这就是我使用 webm 的原因(我认为它不支持 h.264,导致转换为 vp9 时性能非常缓慢)。我目前不关心 CPU 使用率,只想让图像出现在浏览器上!
我听说有一个问题与“分块”有关 - 相机 h.264 是比特流,但 html5 的 h.264 流应该分块。不确定这将如何工作。
我曾尝试使用 VLC 来实现某些功能(RTP),但没有成功。
大多数资源(SE 和其他网站)来自 2010 年至 2015 年,似乎 v4l2 和其他东西从那时起就已经发展起来了。
由于我的问题很可能是对主题的普遍无知,因此,如果能提供一些关于不同技术背后理论的一般理解,我将不胜感激。我知道这会让这个问题更像是征求意见,不太适合 SE,但我准备把我的电脑扔出窗外(你知道那种感觉)。
谢谢你!
答案1
在 ffmpeg 调用中将 localhost 更改为 127.0.0.1 为我解决了这个问题。