Ser*_*giy 5 python opencv ffmpeg
我正在尝试使用 OpenCV(python 绑定)连接到 UDP 多播并恢复单个接收到的帧以进行后处理。
我可以通过 VLC 连接到我的多播,并且 VLC 显示广播完全没有问题。VLC 报告其用于解码的编解码器是 H264 - MPEG-4 AVC(第 10 部分)。
当我尝试使用 OpenCV 进行解码时,我确实看到了视频流,但许多帧出现碎片。这些帧看起来就像最后一行像素刚刚重复填充图像的其余部分(有时占整个图像的 75% 或更多)。OpenCV 报告解码错误(解码 MB ....、 bytestream 时出错)。
有没有办法强制 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()
Run Code Online (Sandbox Code Playgroud)
小智 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);
Run Code Online (Sandbox Code Playgroud)
添加 TCP:
AVDictionary *d = NULL;
av_dict_set(&d, "rtsp_transport", "tcp", 0);
int err=avformat_open_input(&ic, _filename, NULL, &d);
Run Code Online (Sandbox Code Playgroud)