0

现在我正在通过以下方式访问运动矢量:

container = av.open(
    rtsp_url, 'r',
    options={
        'rtsp_transport': 'tcp',
        'stimeout': '5000000',  
        'max_delay': '5000000', 
    }
)
stream = container.streams.video[0]
codec_context = stream.codec_context
codec_context.export_mvs = True


for packet in container.demux(video=0):
    for video_frame in packet.decode():
        motion_vectors_raw = video_frame.side_data.get('MOTION_VECTORS')

在我看来,这确实解码了 video_frame。有没有办法在不必解码整个帧的情况下获得运动矢量?我的目标是降低 CPU 利用率。

4

1 回答 1

2

首先,我只找到了关于此事的这些评论:

没有可用的解决方案 - Reddit

复杂,但并非不可能 - Stackoverflow

早在 2016 年就在 ffmpeg 中实现这一点的想法 - 邮件列表

大多数(如果不是全部)工作方法都基于“ffmpeg”,这需要在辅助数据可用之前进行帧解码。

另一种方法可能是在编码硬件加速时获取运动向量,例如在 Raspberry Pi 上:

通过 MMAL 编码器的运动矢量

谷歌搜索“h264运动向量压缩域”给出了很多关于该主题的研究论文,其中提取了运动向量以提高某些分析目标的性能,例如:

2009 年,Szczerba,“用于视频监控应用的 H.264 视频流中的快速压缩域运动检测”

2009,Solana-Cipres,“基于近似推理的 H.264 压缩域中的实时运动对象分割”

2014,Patel,“用于视频监控应用的 H.264 压缩域中的运动检测和分割”

2004 年,Babu,“视频对象分割 - 一种压缩域方法”

2014,巴布,“压缩域视频分析技术调查”

那里没有真正的解决方案或解码提示,只有概念和评估。

因此,如果您想尝试通过自己使用 Python 解析压缩的 h264 视频来获取运动矢量,您可以从以下开始:

H264 - 规格

H.264 和 MPEG4 视频压缩 - 书籍

https://github.com/beardypig/pymp4

https://github.com/alasairmccormack/pymp4parse

https://github.com/halochou/py-h264-decoder

https://github.com/slhck/h26x-extractor

https://code.google.com/archive/p/py264/

无论如何,我认为那里(还)没有现成的解决方案!

于 2021-06-19T05:50:47.340 回答