pyav / ffmpeg / libav 在不解码视频的情况下访问端数据

pyav / ffmpeg / libav access side data without decoding the video

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

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 利用率。

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

no solution available - Reddit

complicated, but not impossible - Whosebug

idea to implement this in ffmpeg back in 2016 - Mailing list

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

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

Motion vectors via MMAL encoder

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

2009, Szczerba, "Fast compressed domain motion detection in H.264 video streams for video surveillance applications"

2009, Solana-Cipres, "Real-time moving object segmentation in H.264 compressed domain based on approximate reasoning"

2014, Patel, "Motion Detection and Segmentation in H.264 Compressed Domain for Video Surveillance Application"

2004, Babu, "Video Object Segmentation - A Compressed Domain Approach"

2014, Babu, "A survey on compressed domain video analysis techniques"

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

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

开始

H264 - Spec

H.264 and MPEG4 Video Compression - Book

https://github.com/beardypig/pymp4

https://github.com/alastairmccormack/pymp4parse

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

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

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

我认为(目前)还没有现成的解决方案!