【问题标题】:OpenCV and live video streaming videos from m3u8 urlsOpenCV 和来自 m3u8 url 的实时视频流视频
【发布时间】:2021-01-15 00:02:52
【问题描述】:

我正在尝试构建一个需要从流 url 读取视频的应用程序。 当 OpenCV 显示图像时,我看到了一些延迟,但是使用一个很棒的 url 来测试我的应用程序的视频,结果证明问题不是 OpenCV 速度太慢而是速度太快。

如果我尝试以下代码,我可以看到视频的再现速度至少比应有的速度快 3 倍。

我的代码:

import cv2
url="http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"
vcap = cv2.VideoCapture(url)

while(True):
    # Capture frame-by-frame
    ret, frame = vcap.read()

    if frame is not None:
        # Display the resulting frame
        cv2.imshow('frame',frame)

        # Press q to close the video windows before it ends if you want
        if cv2.waitKey(22) & 0xFF == ord('q'):
            break
    else:
        print("Frame is None")
        break

# When everything done, release the capture
vcap.release()
cv2.destroyAllWindows()
print("Video stop")

结果

应该如何

你知道让openCV正确读取视频的方法吗,我的意思是,我想要和视频一样的速度。

提前致谢

【问题讨论】:

  • 您可以使用fps = video.get(cv2.CAP_PROP_FPS) 获取视频帧速率,并让线程休眠所需的毫秒数
  • 我必须在哪里设置 sleep 以及哪个值?

标签: python opencv


【解决方案1】:

这里是:

import cv2
import time


url = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"
vcap = cv2.VideoCapture(url)
fps = vcap.get(cv2.CAP_PROP_FPS)
wt = 1 / fps

while True:
    start_time = time.time()
    # Capture frame-by-frame
    ret, frame = vcap.read()

    if frame is not None:
        # Display the resulting frame
        cv2.imshow('frame', frame)

        # Press q to close the video windows before it ends if you want
        if cv2.waitKey(22) & 0xFF == ord('q'):
            break
        dt = time.time() - start_time
        if wt - dt > 0:
            time.sleep(wt - dt)
    else:
        print("Frame is None")
        break

# When everything done, release the capture
vcap.release()
cv2.destroyAllWindows()
print("Video stop")

【讨论】:

  • 我实现了类似的东西,但如果你看一下视频,每 10 秒(大约)仍然有一个“滞后”,如果你尝试使用其他 url 视频,它就不起作用,因为例如,如果您为此更改网址:bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8,它将不起作用。我几乎尝试了所有方法,我认为这是 OpenCV 的弱点,需要改进。无论如何,我能问一下你为什么把22 放在cv2.waitKey 里面吗?我阅读了文档,但我仍然不明白它是如何工作的。
  • 抱歉,我没有将cv2.waitKey(22) 放入您的代码中:))它已经在您的代码中了。我找到了一些正常的解释: cv2.waitKey() 是一个键盘绑定函数。它的参数是以毫秒为单位的时间。该函数等待任何键盘事件的指定毫秒。如果您在那段时间内按任意键,程序将继续。如果传递 0,它会无限期地等待击键。它还可以设置为检测特定的击键,例如是否按下了键 a 等,我们将在下面讨论。
  • 非常感谢您的快速回答,您检查过我告诉您的延迟吗?几乎每隔 10 秒就会出现一次延迟 :-(。无论如何,你的解决方案确实改进了我的代码。
  • 是的,我在运行代码时遇到了同样的滞后。我认为这可能是因为互联网连接。也许它无法像显示它那样快速下载视频。真的。对不起我的英语:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
相关资源
最近更新 更多