其實這個問題並不簡單:
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()