zoukankan      html  css  js  c++  java
  • 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()

    —————————————
  • 相关阅读:
    nexus3.x Liunx私库安装教程 (亲测有用)
    nexus 3.x下载 3.18.1(maven 私服)
    halo项目源码本地部署解决方案
    gradle的安装配置
    raw.githubusercontent.com 访问不了
    springboot使用quartz解决调用不到spring注入service的问题
    Linux在不能使用yum的环境下安装pgsql(公司内网)
    idea 里面的maven依赖下载不了,以及mabtis依赖包错误
    关于oracle 数据库效率的优化
    关于oracle 不常用的job 运行时间设置
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/14807453.html
Copyright © 2011-2022 走看看