【问题标题】:OpenCV read video files with multiple streams/tracksOpenCV 读取具有多个流/轨道的视频文件
【发布时间】:2020-10-20 23:08:56
【问题描述】:

我有一个包含多个流的视频文件,如下所示,使用 VLC 媒体播放器: Video Information

当我尝试使用以下代码使用 Python + OpenCV 阅读它时:

vidObj = cv2.VideoCapture("video.avi")
ret, frame = vidObj.read()

我只能阅读视频的第一首曲目。如何同时读取所有视频轨道?

【问题讨论】:

  • 视频由 Epiphan 抓帧器生成,支持同时捕获多个视频流。这就是为什么它有多个视频轨道。
  • 运行快速搜索,似乎多流视频并不常见。如果没有人提出解决方案,我建议在处理它们之前使用ffmpeg 之类的东西将流分成单独的视频。
  • 感谢加布里埃尔的回答。你能更详细地解释一下如何使用 ffmpeg 来划分它们吗?谢谢。
  • @poisondeathray 的answer (#4) 应该可以帮到你。由于有多个流,而不仅仅是 2 个,您可能应该编写一个脚本,根据输入视频运行 ffmeg -map 命令。如果您有任何问题,请针对出现的任何问题创建一个新问题。

标签: python opencv video-processing


【解决方案1】:

据我所知,OpenCV 不允许选择视频流,所以这是不可能的。但是,您可以使用ffmpeg 命令行实用程序轻松完成:

import numpy as np
import json
import subprocess

def videoInfo(filename):
    proc = subprocess.run([
        *"ffprobe -v quiet -print_format json -show_format -show_streams".split(),
        filename
    ], capture_output=True)
    proc.check_returncode()
    return json.loads(proc.stdout)

def readVideo(filename):
    cmd = ["ffmpeg", "-i", filename]
    streams = 0
    for stream in videoInfo(filename)["streams"]:
        index = stream["index"]
        if stream["codec_type"] == "video":
            width = stream["width"]
            height = stream["height"]
            cmd += "-map", f"0:{index}"
            streams = streams + 1
    cmd += "-f", "rawvideo", "-pix_fmt", "rgb24", "-"
    shape = np.array([streams, height, width, 3])
    with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc:
        while True:
            data = proc.stdout.read(shape.prod())  # One byte per each element
            if not data:
                return
            yield np.frombuffer(data, dtype=np.uint8).reshape(shape)

请注意,代码会读取所有视频流并假定每个视频流具有相同的分辨率。它缺乏适当的错误处理,但在我的科学项目中完成了工作。

例如读取立体流:

import matplotlib.pyplot as plt

for left, right in readVideo("testvideo.mkv"):
    plt.imshow(left)
    plt.show()
    plt.imshow(right)
    plt.show()

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2018-12-10
    • 2018-07-22
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多