使用 ffmpeg 到 ffserver 在浏览器中查看 H.264 比特流

使用 ffmpeg 到 ffserver 在浏览器中查看 H.264 比特流

这是https://raspberrypi.stackexchange.com/questions/93254/stream-usb-webcam-with-audio?noredirect=1#comment150507_93254

我和之前许多勇敢的修补匠一样,认为将旧的 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 为我解决了这个问题。

相关内容