gpt4 book ai didi

python - 使用 opencv 查找损坏的视频

转载 作者:行者123 更新时间:2023-12-04 23:18:46 25 4
gpt4 key购买 nike

我有巨大的视频数据集(大约 500000 个 16 帧长度的剪辑)。一些视频会产生诸如

[mpeg4 @ 0x561b46a44b80] marker does not match f_code
[mpeg4 @ 0x561b480c0740] Error at MB: 4718
[mpeg4 @ 0x561b4811b640] header damaged
我想找出导致问题的视频。
首先我尝试了这个 https://superuser.com/questions/100288/how-can-i-check-the-integrity-of-a-video-file-avi-mpeg-mp4解决方案,但我在错误文件中一无所获。
我的第二个想法是读取视频的第一张图片,如果出现错误,请将文件名保存到文件中。但是,这似乎不是错误消息:尽管消息出现在控制台上, read返回 success=True .
然后我尝试将文件名打印到标准错误(警告消息也会出现),将其保存到文件并进行一些后处理以提取有问题的视频。
import os
from tqdm import tqdm
import sys

folder = '/path/to/videos'
for f in tqdm(os.listdir(folder)):
sys.stderr.write('BEFORE VIDCAP ' + f + '\n')
vidcap = cv2.VideoCapture(os.path.join(folder,f))
sys.stderr.write('BETWEEN VIDCAP AND SUCCESS' + f + '\n')

success, image = vidcap.read()
sys.stderr.write('AFTER SUCCESS ' + f + '\n')
但是,标准错误按以下顺序输出:
AFTER SUCCESS
[mpeg ...]
[mpeg ...]
...
BEFORE VIDCAP
以这种顺序如何发生是没有意义的,应该在之前和之后的某个地方看到一些损坏的视频。 (如果我尝试单独打开它们,后面或前面的也不会损坏。)
我的最后一个想法是为每个视频创建一个文件,将其作为标准错误并检查非空文件。 (我知道这非常低效,但我没有任何其他想法。)
for f in os.listdir(folder):
sys.stderr = open(f + '.txt', 'w')
vidcap = cv2.VideoCapture(os.path.join(folder,f))
success, image = vidcap.read()
这也不起作用,所有错误文件都是空的,尽管消息仍然出现在标准错误中。

所以我的问题如下:
  • 这个问题的有效解决方案是什么?
  • 这种输出顺序(第一个代码示例)如何可能?引擎盖下有一些并行性?
  • 如果不是标准错误(第二个代码示例),这些消息会去哪里?如果是,为什么将它们打印到控制台而不是指定的错误文件?
  • 最佳答案

    我同意@Christoph Rackwitz 的观点,opencv 在这里不是合适的工具。您需要自行运行 ffmpeg。 pyav可能会给您更好的控制,但这是我对 ffmpeg 所做的。

    1. What would be an efficient solution for this problem?

    运行 ffmpeg(使用 subprocess.run )将文件解码为标准输出,标准输出映射到空管道。同时,设置 stderr(文本)管道,以便捕获所有日志消息。您可以查看 returncodesubprocess.run输出。如果它不为零,则该视频存在严重错误,导致无法读取整个文件。如果为零,可以扫描 stderr str 用于上述错误消息。不幸的是,您需要事先了解所有错误,因为会有很多 [mpeg4 ...线。
    这是我能想到的最有效的解决方案。
    1. How is this order of outputs (first code example) possible? There is some parallelism under the hood?

    取决于如何 opencv使用 ffmpeg。它可能正在捕获所有 ffmpeg 日志消息,并且仅在您完成文件时才显示它们。
    1. Where are this messages going if not to the standard error (second code example)? If yes, why are they printed to the console instead of the specified error file?

    这与上述2个答案有关。 opencv正在调用 ffmpeg 作为子进程,它可能正在捕获 stderr ffmpeg 子进程。
    如果您不想学习如何运行 ffmpeg你可以试试我的 ffmpegio库( pip install ffmpegio-core 如果您已经在使用 NumPy,您也可以使用 pip install ffmpegio )并尝试以下代码:
    import ffmpegio
    import os
    out = ffmpegio.ffmpegprocess.run(
    {"inputs": [(filename, None)],
    "outputs": [(os.devnull, {"f": "rawvideo"})]},
    overwrite=True,
    capture_log=True,
    )
    print(out.returncode)
    print(out.stderr)
    请注意,在完成读取文件之前会有很长的暂停。如果想查看进度,可以使用 progress选项。
    如果您需要更具体的帮助,请发表评论

    关于python - 使用 opencv 查找损坏的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71138431/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com