使用 OpenCV (python) 时如何隐藏/禁用 ffmpeg 错误?
Posted
技术标签:
【中文标题】使用 OpenCV (python) 时如何隐藏/禁用 ffmpeg 错误?【英文标题】:How to hide/disable ffmpeg erros when using OpenCV (python)? 【发布时间】:2013-10-05 15:28:07 【问题描述】:我正在使用 OpenCV python 来捕捉视频。 这是我的代码
import cv2
cap = cv2.VideoCapture("vid.mp4")
while True:
flag, frame = cap.read()
if not flag:
cv2.imshow('video', frame)
if cv2.waitKey(10) == 27:
break
当一个框架没有准备好时,它会产生这样的错误
或
Truncating packet of size 2916 to 1536
[h264 @ 0x7ffa4180be00] AVC: nal size 2912
[h264 @ 0x7ffa4180be00] AVC: nal size 2912
[h264 @ 0x7ffa4180be00] no frame!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ffa41803000] stream 0, offset 0x14565: partial file
我想找到一种方法来隐藏这个错误!我猜这个错误是由ffmpeg
产生的。有什么办法可以隐藏或禁用它?
当我调用cap.read()
时会产生此错误。而且我还尝试用try ... except ...
包装它,但它不起作用,因为它不会抛出任何异常。
【问题讨论】:
我认为你只需要将 stderr 重定向到 /dev/null... 感谢@mguijarr 的评论。是的,当您在命令行中使用 ffmpeg 时确实如此。但是当我想用python来做的时候,我该怎么做呢? 【参考方案1】:隐藏 ffmpeg 错误的一种方法是将 sterr 重定向到其他地方。我找到了this brilliant example,了解如何隐藏错误。
import ctypes
import io
import os
import sys
import tempfile
from contextlib import contextmanager
import cv2
libc = ctypes.CDLL(None)
c_stderr = ctypes.c_void_p.in_dll(libc, 'stderr')
@contextmanager
def stderr_redirector(stream):
original_stderr_fd = sys.stderr.fileno()
def _redirect_stderr(to_fd):
libc.fflush(c_stderr)
sys.stderr.close()
os.dup2(to_fd, original_stderr_fd)
sys.stderr = io.TextIOWrapper(os.fdopen(original_stderr_fd, 'wb'))
saved_stderr_fd = os.dup(original_stderr_fd)
try:
tfile = tempfile.TemporaryFile(mode='w+b')
_redirect_stderr(tfile.fileno())
yield
_redirect_stderr(saved_stderr_fd)
tfile.flush()
tfile.seek(0, io.SEEK_SET)
stream.write(tfile.read().decode())
finally:
tfile.close()
os.close(saved_stderr_fd)
f = io.StringIO()
with stderr_redirector(f):
# YOUR CODE HERE
f.close()
【讨论】:
从 Python 3.5 开始,标准库支持 contextlib.redirect_stderr(和 contextlib.redirect_stdout)。您可能应该使用它而不是重新发明***——尤其是这样一个复杂的***!以上是关于使用 OpenCV (python) 时如何隐藏/禁用 ffmpeg 错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OSX 上正确安装 Python 以与 OpenCV 一起使用?
OpenCV 和 Python - 如何使用卡尔曼滤波器从 OpenCV 检测到的不规则多边形中过滤噪声?