gpt4 book ai didi

ffmpeg - 从 Raspberry Pi 上的 USB 摄像头获取原始 h264 数据包

转载 作者:行者123 更新时间:2023-12-04 22:48:08 49 4
gpt4 key购买 nike

我正在尝试从连接到我的 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)

最佳答案

首先,让我们获取数据流正确的。对于 Raspi 凸轮:

  • Raspi cameraCSI 连接(相机串行接口(interface))到 Raspi。此链接带有未压缩的原始图像数据。
  • raspivid与 Raspi 的嵌入式 GPU 对话以访问图像数据,并要求 GPU 执行 H.264 编码,这总是会增加一些延迟(您可以使用 raspiyuv 来获取原始未压缩数据,可能延迟更少)。

  • USB 网络摄像头通常传输未压缩的原始图像数据。但有些也传输 H.264 或 jpeg 编码数据。

    接下来, Video for Linux API version 2 不是为 shell 管道而设计的,因此您无法使用 cat 从/dev/videoX 中获取数据。您需要一些代码来执行 IOCTL 调用,以协商从设备读取数据的内容和方式。 ffmpeg 正是这样做的。

    关于你的奖金问题,你可以试试 --inline option raspivid,它强制流在每个 I 帧上包含 PPS 和 SPS header 。

    接下来,使用 -f rawvideo 从 ffmpeg 输出 H.264 数据在我看来是错误的,因为 rawvideo 表示未压缩的视频。您可以改为尝试 -f h264 强制使用原始 H.264 视频输出格式:
    ffmpeg -i /dev/video2 -c copy -f h264 pipe:1

    最后,您实际上想要获得 来自 USB 网络摄像头的 H.264 流 .由于图像数据来自相机未压缩,因此首先必须将其编码为 H.264。 Raspi 上的明智选择是使用硬件编码器,因为使用像 x264 这样的软件编码器会消耗过多的 CPU 资源。

    如果您有使用 --enable-mmal 和/或 --enable-omx-rpi 配置的 ffmpeg,则可以使用 ffmpeg 与硬件 H.264 编码器通信。

    否则,看看 gstreamer及其 omxh264enc元素,例如。 here . gstreamer 也可以 talk to v4l2 devices .

    关于ffmpeg - 从 Raspberry Pi 上的 USB 摄像头获取原始 h264 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50826597/

    49 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com