opencv_python 支持保存chrome可以播放的h264 mp4
其实这个问题并不简单:
1 默认的opencv官方版只支持xvid avi格式(h264有啥专利问题
https://github.com/opencv/opencv-python/issues/299 libx264
that backs H.264 support in FFMpeg is under GPL which is incompatible with opencv-python
's MIT license. See https://www.ffmpeg.org/legal.html
)。平时python接口的opencv通常之需要pip3 install opencv_python , 但这个里的ffmpeg不支持h264, 且和自己安装ffmpeg无关。
2 chrome浏览器html5 的video标签,只支持播放h264编码的mp4.
3 如果自己源码编译一遍opencv,然后导出安装到特定python3 安装位置,那么如果有多个运行环境就特别烦:比如开发用anaconda3,部署在docker里
解决方案:
编译1个支持保存h264的opencv_python 的 whl安装包,这样 只要python主版本一致,就可以简单pip install XXX.wheel 支持保存h264
https://github.com/opencv/opencv-python/issues/299 (找了半天找到这个)
whl编译过程如下:
# download git clone --recursive https://github.com/skvark/opencv-python.git
# set freetype export CMAKE_ARGS="-DWITH_FREETYPE=ON"
# enable contrib export ENABLE_CONTRIB=1
# 是否允许gui部分,default is ENABLE_HEADLESS=1 not support imshow and waitkey. 0 for dev test; 1 for deploy e.g. docker
export ENABLE_HEADLESS=0
#make 多核编译显著加速。但使用cpu -1 个核心,防止全部cpu被占用,卡死。 两种写法都可以
# export MAKEFLAGS="-j $(($(grep -c ^processor /proc/cpuinfo)-1))"
export MAKEFLAGS="-j $(($(nproc)-1))"
# compile
cd ./opencv-python
pip wheel . --verbose
10核20线程的机器上,还是编译很快的,10分钟不到。 没有cuda的纠缠,opencv还是编译很快的。 调用gpu和cuda计算工作都由pytorch负责了
如果github下载时报错:
添加代理
git config --global https.proxy 'socks5://127.0.0.1:1080'
特别注意一下
ENABLE_HEADLESS=0
默认是1 不包含imshow waitKey. 体积小,适合docker这样的纯后端服务。 但是开发,测试时,还是imshow方便,所以要手动设置为0
我是用ubuntu 20.04 自带的python3.8 编译opencv4.5.2
得到1个2个wheel
numpy-1.20.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
opencv_contrib_python-4.5.2+2fee7be-cp38-cp38-linux_x86_64.whl
然后代码里
fourcc = cv2.VideoWriter_fourcc(*'avc1')
print('fourcc', fourcc)
vc = cv2.VideoCapture(str(path_video))
fps = vc.get(cv2.CAP_PROP_FPS)
sz = (int(vc.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT)))
cv_writer = cv2.VideoWriter(str(fname_out), cv2.CAP_ANY, fourcc, fps, sz, None)
...
cv_writer.write(img)
cv_writer.release()