OpenCV VideoCapture以GoP的视频结束

2024-04-27 03:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个来自GoPro设备的视频文件,我只需在VideoCapture上使用它,如下所示:

cap = cv2.VideoCapture(path)
        index = 0
        start = time.time()

        while cap.isOpened():
            ret, frame = cap.read()
            if not ret:
                break
            # do something here
        end = time.time()

这很奇怪,但我可以操作任何文件,除了那些在GoPro上捕获的文件。流只是在某个点关闭,因为ret值变成了False,而{}变成了{}。没有例外或其他任何东西。在

谷歌帮助我找到了this question。我已经用ffmpeg工具从文件中删除了音频流,然后一切正常。为什么会这样?求救!在

我使用的是python3.6.4x64、windows10(但是在Linux上是相同的)和来自this resource的OpenCV的预编译二进制文件。在


Tags: 文件pathindextimethiscv2framestart
3条回答

我和Michael有同样的问题,我想添加ffmpeg输出让人们看到。输出太长,无法添加到上面的编辑或注释中。在

MacBook-Pro:MacOS ben$ ffmpeg -i /Users/ben/Downloads/GP011399.MP4 ffmpeg version 3.3.4 Copyright (c) 2000-2017 the FFmpeg developers built with Apple LLVM version 8.1.0 (clang-802.0.42) configuration: prefix=/usr/local/Cellar/ffmpeg/3.3.4 enable-shared enable-pthreads enable-gpl enable-version3 enable-hardcoded-tables enable-avresample cc=clang host-cflags= host-ldflags= enable-libmp3lame enable-libx264 enable-libxvid enable-opencl enable-videotoolbox disable-lzma enable-vda libavutil 55. 58.100 / 55. 58.100 libavcodec 57. 89.100 / 57. 89.100 libavformat 57. 71.100 / 57. 71.100 libavdevice 57. 6.100 / 57. 6.100 libavfilter 6. 82.100 / 6. 82.100 libavresample 3. 5. 0 / 3. 5. 0 libswscale 4. 6.100 / 4. 6.100 libswresample 2. 7.100 / 2. 7.100 libpostproc 54. 5.100 / 54. 5.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/ben/Downloads/GP011399.MP4': Metadata: major_brand : mp41 minor_version : 538120216 compatible_brands: mp41 creation_time : 2015-02-11T13:46:48.000000Z firmware : HD4.01.02.00.00 Duration: 00:26:30.59, start: 0.000000, bitrate: 20127 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1280x720 [SAR 1:1 DAR 16:9], 19979 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc (default) Metadata: creation_time : 2015-02-11T13:46:48.000000Z handler_name : GoPro AVC encoder : GoPro AVC encoder Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default) Metadata: creation_time : 2015-02-11T13:46:48.000000Z handler_name : GoPro AAC Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2015-02-11T13:46:48.000000Z handler_name : GoPro TCD timecode : 13:46:07:17 Stream #0:3(eng): Data: none (fdsc / 0x63736466), 9 kb/s (default) Metadata: creation_time : 2015-02-11T13:46:48.000000Z handler_name : GoPro SOS

可能和这里有关?在

OpenCV and GoPro - empty frames in VideoCapture stream

视频在VLC中播放,没有错误或明显的损坏。同样的代码会打开我遇到的每一个视频文件(我已经使用这个代码至少一年了)。在

Opencv和Python版本

2.7.10 (default, Feb 7 2017, 00:08:15) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] Python Type "help", "copyright", "credits" or "license" for more information. import cv2 cv2.__version__ '3.3.0'

与提交的Q代码相同。我的流在26帧内读取,然后返回ret=False。在

我也遇到了这个问题,并且能够在不修改音频的情况下绕过它。事实上,我不相信音频是问题所在。在

我在这个问题上看到的所有ffmpeg转换命令都有一个意想不到的副作用,即从视频文件中剥离所有的元数据轨迹。GoPro实际上将大量原始传感器数据直接打包到MP4数据中。我认为这是更可能的罪魁祸首,因为它是文件中最不“标准”的数据类型。在

我通过使用以下命令剥离音频曲目来测试这一理论:

ffmpeg -i GH010001.MP4 -map 0 -map -0:a -c copy GH010001_MUTED.MP4

这个新的静音文件表现出同样的问题行为,所以简单地删除音频轨迹是不起作用的。在

现在,如果您不关心元数据轨迹,那么用其他ffmpeg调用将它们剥离出来是完全可以的!我真的想用那个传感器,所以我不得不另寻出路。在

解决方法

下面的代码在概念层面上相当粗糙,但它是有效的。我们不需要像通常使用OpenCV那样检查空帧,而是简单地计算我们知道应该存在的帧的数量,跳过空帧。在

^{pr2}$

忽略文件结尾的通常标志显然是不对的,但是它起作用了,我可以在没有任何ffmpeg转换的情况下回放原始视频文件的所有帧。在

你没有列出你的相机型号。但我对GoPro的x264文件有问题。但不是x265文件。尝试将压缩模式从兼容模式更改为HEVC,在您的相机。对于x264,我使用“ffmpeg-I”解压缩它视频.mp4-sn-an-vcodec mpeg4-q:v 0输出.mp4“,但之后文件的大小大约是原来的4倍。在

相关问题 更多 >