opencv_python 支持保存chrome可以播放的h264 mp4

python

其实这个问题并不简单:

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()

以上是 opencv_python 支持保存chrome可以播放的h264 mp4 的全部内容, 来源链接: utcz.com/z/386658.html

回到顶部