在 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
我正在尝试打开视频并使用 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