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



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

我在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...')

我总是收到打印错误。'尝试打开视频时出错。请再次检查…"。cap.isOpened((为false,我没有得到任何异常。我在网上读到,在android opencv上,它只会从mpeg avi中读取。

我尝试使用ffmpeg将video.mp4转换为video.avi,但仍然失败。我尝试了一堆ffmpeg命令,到目前为止都不起作用。

有任何ffmpeg命令可以将我的视频转换为android上opencv可读的内容吗?或者一些代码将视频帧加载到数组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过滤器并将视频重新编码为cfr。

我使用了2次转换,使其成为一个恒定的30fps视频。

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

最新更新