【发布时间】:2018-11-22 09:47:33
【问题描述】:
我正在尝试从连接到我的 Raspberry PI 的 USB 网络摄像头接收 H264 帧
使用 RPi 摄像头模块,我可以运行以下命令以获取在标准输入中输出的 H264 数据:raspivid -t 0 -w 640 -h 320 -fps 15 -o -,延迟接近零
是否有与 USB 摄像头相同的功能?我有两个 USB 摄像头,我想这样做。
使用ffprobe /dev/videoX,我得到以下输出:(简化为重要细节):
$ ffprobe /dev/video0
...
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 18876.273861, bitrate: 147456 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 147456 kb/s, 10 fps, 10 tbr, 1000k tbn, 1000k tbc
$ ffprobe /dev/video1
...
Input #0, video4linux2,v4l2, from '/dev/video1':
Duration: N/A, start: 18980.783228, bitrate: 115200 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 800x600, 115200 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc
$ ffprobe /dev/video2
...
Input #0, video4linux2,v4l2, from '/dev/video2':
Duration: N/A, start: 18998.984143, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080, -5 kb/s, 30 fps, 30 tbr, 1000k tbn, 2000k tbc
据我所知,其中两个不是 H264,需要将其“解码”为 H264,所以我知道那里增加了一点延迟。但是第三个(video2)是H264,所以我应该能够从中获取数据?我试图用 CAT 将其输出,但它说我的参数无效。
我已经了解到使用 FFMPEG 可能是这里唯一的选择。希望使用可轻松用于所有 RPi 的软件(apt install)。
关于 H264 数据包的额外问题:当我将数据从 raspivid 命令流式传输到我的解码器时,它可以完美运行。但是,如果我决定丢弃前 10 个数据包,那么它永远不会初始化解码过程,只会显示黑色背景。任何人都知道我可以在我的软件中重新创建的第一个数据包中可能缺少什么,因此我不必为每个新连接的用户重新启动流?
编辑:奖励问题答案: 谷歌搜索后,我看到raspivid 发送给我的前两帧是。因此,通过忽略前两个帧,我的解码器将无法正确“解码”。因此,如果我保存这些帧并首先将它们发送给所有新用户,它就会完美运行。似乎这些用于某种初始过程。
0x27 = 01 00111 = type 7 Sequence parameter set (B-frame)
0x28 = 01 01000 = type 8 Picture parameter set (B-frame)
【问题讨论】:
-
你倒退了。 “生”=“生”。 H264 被编码。解码 h264 会产生原始帧。
-
@szatmary 非常感谢,编辑了主要帖子以反映这一点。 (去掉 H264 前面的“raw”)
-
更新了主要问题,因为我找到了奖励问题的答案。我的研究也把我拖到了这个命令,它似乎从相机输出 H264 数据。
ffmpeg -i /dev/video2 -c copy -f rawvideo pipe: 1问题似乎是我的解码器没有得到任何 0x27 0x28 帧,这似乎是必需的,因为 RPi 相机无法正常工作?另外,我无法使用该命令更改帧速率或分辨率? (像 raspivid 那样改变硬件?)
标签: ffmpeg raspberry-pi video-streaming h.264