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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM