在 android/python 中使用 opencv 处理视频时出现问题

Problem processing video using opencv in android/python

我正在尝试打开视频并使用 python 逐帧获取帧数组以进行 post 处理。

我在 android termux,我安装了 ffmpeg 和 opencv2 python3.

当我尝试用

打开视频时
import cv2
import numpy as np
# create VideoCapture object
cap = cv2.VideoCapture('video.mp4')

if (cap.isOpened() == False):
 print('Error while trying to open video. Please check again...')

我总是遇到打印错误。 'Error while trying to open video. Please check again...'。 cap.isOpened() 是错误的,我没有得到任何异常。我在网上看到 android opencv 只能从 mpeg avi 读取。

我尝试使用 ffmpeg 将 video.mp4 转换为 video.avi,但仍然失败。我尝试了一堆 ffmpeg 命令 none 目前有效。

是否有任何 ffmpeg 命令可以将我的视频转换为 opencv 在 android 上可读的内容? 或者一些代码将视频帧加载到数组 frames[]= ... 使用 ffmpeg-python 或使用 ffmpeg 的子进程管道?

使用的ffmpeg命令列表

ffmpeg -i video.mp4 -vcodec mjpeg output.mjpeg
ffmpeg -i output.mjpeg -vcodec output.avi
ffmpeg -i output.mjpeg -vcodec mjpeg output.avi

ffmpeg -i video.mp4 video.avi
ffmpeg -i video.mp4 -vcodec mjpeg out.avi
Ffmpeg -i video.mp4 output
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:02:42.34, start: 0.000000, bitrate: 4705 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/smpte170m, progressive), 1280x608, 4570 kb/s, 30.01 fps, 30 tbr, 1000k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

我最终使用了 ffmpeg 而不是 opencv。事实证明,opencv 无法处理 android 上的 vfr mp4,它只支持非常有限的一组 .avi。

我能够使用 ffmpeg 过滤器和 re-encode 视频到 cfr。

我使用 2 pass 转换使其成为恒定的 30fps 视频。

ffmpeg -i pvp2.mp4 -vsync cfr pvp2cfr2.mp4
ffmpeg -i pvp2cfr2.mp4 -filter:v fps=30 pvp2cfr30.mp4