OpenCV能解码H264 - MPEG-4 AVC(第10部分)吗

5 投票
1 回答
6301 浏览
提问于 2025-04-18 12:25

我正在尝试使用OpenCV(Python绑定)连接到一个UDP组播,并提取单独接收到的帧进行后期处理。

我可以通过VLC连接到我的组播,VLC显示广播时没有任何问题。VLC报告它使用的解码器是H264 - MPEG-4 AVC(第10部分)。

当我尝试使用OpenCV解码时,我确实能看到我的视频流,但很多帧看起来都不完整。帧的最后一行像是被重复了,以填补图像的其余部分(有时占据整个图像的75%或更多)。OpenCV报告了解码错误(解码MB时出错....,字节流)。

有没有办法强制OpenCV使用VLC正在使用的那个解码器?我尝试在我的OpenCV代码中指定特定的解码器,但似乎没有效果。

我使用的代码如下:

import numpy as np
import cv2
from cv2 import cv

cap = cv2.VideoCapture()
cap.set(cv.CV_CAP_PROP_FOURCC, cv.CV_FOURCC('A','V','C','1')) 
cwi=cap.open(r'myurlandport')

counter = 0

while(cap.isOpened()):

    ret, frame = cap.read()


    counter += 1

    if counter % 30 == 0:
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

cap.release()
cv2.destroyAllWindows()

1 个回答

1

我上次查看的时候(OpenCV 2.4.9),OpenCV中使用的ffmpeg版本并没有用到UDP协议。它不会把收到的数据包缓存起来以便后续使用。更多信息可以在这里找到:http://code.opencv.org/issues/2235

编辑:
如果你想强制使用TCP模式,可以去修改opencv\sources\modules\highgui\src\cap_ffmpeg_impl.hpp文件的第538行。

int err=avformat_open_input(&ic, _filename, NULL, NULL);

添加tcp:

 AVDictionary *d = NULL;
 av_dict_set(&d, "rtsp_transport", "tcp", 0);
 int err=avformat_open_input(&ic, _filename, NULL, &d);

撰写回答