gpt4 book ai didi

ffmpeg - 如何在没有 CPU 完整解码的情况下从 h264 中提取运动矢量

转载 作者:行者123 更新时间:2023-12-04 23:02:04 28 4
gpt4 key购买 nike

我试图用我的 Nose 作为指点设备。计划是将来自指向我脸部的网络摄像头的视频流编码为 h264 等,获取运动矢量,稍微 cooking 数字并将它们放入/dev/uinput 以使鼠标指针移动。 uinput 位很简单。
这必须以零可识别延迟工作。例如:

#!/bin/bash
[ -p pipe.mkv ] || mkfifo pipe.mkv
ffmpeg -y -rtbufsize 1M -s 640x360 -vcodec mjpeg -i /dev/video0 -c h264_nvenc pipe.mkv &
ffplay -flags2 +export_mvs -vf codecview=mv=pf+bf+bb pipe.mkv
表明向量在那里,但有几秒钟的延迟,这在鼠标中是不可用的。我知道第一个 ffmpeg 步骤通过使用 GPU 运行得非常快,所以第二步中的管道或 h264 解码都会引入延迟。
我在类似的管道布置中尝试了 MV Tractus(我认为与 mpegflow 相同),它也很慢。他们在 CPU 上进行完整的 h264 解码,我认为这是问题所在,因为我可以看到他们在一个 CPU 上施加了大量负载。如果管道由于缓冲不良而导致延迟,那么 CPU 就不会被加载。我猜 ffplay 也在 CPU 上进行了解码,我无法说服它不这样做,但它只想绘制对我没有用的箭头。
我认为有几种方法,我想就哪种方法最好提出建议,或者是否有更好的方法我不知道。我可以:
  • 在硬件中解码并获得运动矢量。到目前为止,这已经失败了。我尝试结合 ffmpeg 的 extract_mvs.chw_decode.c样本,但没有运动矢量出现。 vdpau 是我在我的 linux 机器上工作的唯一解码器。我有一个英伟达显卡。
  • 对 h264 进行最小解析以仅找出运动矢量,忽略所有其他数据。我认为这意味着在 libav 的解析器中放置某种“仅运动”选项,但我对那个代码一点也不熟悉。
  • 找到其他一些具有上述选项并解包容器的 h264 解析库。
  • 忘记硬件加速编码并使用精简编码器仅在 CPU 或 GPU 上生成运动矢量。我怀疑这会很慢,因为我认为计算运动矢量是算法中最难的部分。

  • 我倾向于第二种选择,但我需要一些帮助来确定在 libav 代码中的位置。

    最佳答案

    非常有趣的项目!我不是 ffmpeg 专家,但在我看来,您的 ffmpeg 命令正在解码/dev/video0 的 mjpeg 输出,然后将其编码为 h.264 以获取运动矢量。该 h.264 编码步骤是计算密集型的,并且可能会导致您的延迟。您可以采取一些措施来加快速度:(a) 使用输出 h.264 而不是 mjpeg 的网络摄像头; (b) 在更快的硬件上运行 h.264 编码和 (c) 在编码之前使用 ffmpeg 降低视频流的分辨率。例如,您可以在摄像机中定义一个小的“热区”,您的 Nose 的运动可以控制鼠标。

    关于ffmpeg - 如何在没有 CPU 完整解码的情况下从 h264 中提取运动矢量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62499845/

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