python - OpenCV 读取具有多个流/轨道的视频文件

标签 python opencv video-processing

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

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

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

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

最佳答案

据我所知,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()

关于python - OpenCV 读取具有多个流/轨道的视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58824909/

相关文章:

python - 如何确定 python 程序执行期间是否记录了任何错误?

python - 将对象移动到继承的模型

python - file.tell() 不一致

c++ - gpumat 的 opencv 矩阵减少中可能存在的错误

c++ - 实时视频上的 Hough 线变换会导致断点?

python - 在/image/expected string 或 Unicode 对象处出现 TypeError,InMemoryUploadedFile 已找到

python - 如何在 Python 中向左或向右移动列表中的所有元素?

opencv - OpenCV 上的 VideoCapture 自动更新帧

ffmpeg - 使用ffmpeg垂直或水平堆叠(马赛克)几个视频?

video - 视频流的结构是什么?