OpenCV保存H264视频的问题
環(huán)境
windows 10 64bit
opencv 4.5.3
前言
看到有小伙伴在聊,如何將目標(biāo)檢測(cè)的結(jié)果保存成視頻的相關(guān)問題?本篇我們就來看看。
opencv保存視頻
在絕大多數(shù)的目標(biāo)檢測(cè)項(xiàng)目中,都是使用opencv這個(gè)開源的計(jì)算機(jī)視覺庫來進(jìn)行圖片、視頻或者攝像頭的讀寫。
關(guān)于視頻保存,來看下面的代碼示例
import?cv2cap?=?cv2.VideoCapture('test.mp4')width?=?int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height?=?int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps?=?cap.get(cv2.CAP_PROP_FPS) fourcc?=?int(cv2.VideoWriter_fourcc(*'MJPG'))out?=?cv2.VideoWriter('output.avi',?fourcc,?fps,?(width,??height))while?cap.isOpened():ret,?frame?=?cap.read()if?not?ret:breakout.write(frame)cv2.imshow('frame',?frame)if?cv2.waitKey(1)?==?ord('q'):breakcap.release() out.release() cv2.destroyAllWindows()主要是VideoWriter對(duì)象,這里需要幾個(gè)重要參數(shù),輸出文件名、寬width、高h(yuǎn)eight、幀率fps和fourcc。除了fourcc,其它幾項(xiàng)都很好理解。
FourCC是一個(gè)4字節(jié)碼,用來表示視頻編碼器,網(wǎng)站 fourcc.org 列出了所有可用的編碼器。在VideoWriter中既可以寫成*'MJPG',也可以寫成'M', 'J', 'P', 'G'。但是并不是說,所有的編碼器都可以使用。
使用H264編碼器
在上面代碼的基礎(chǔ)上我們修改一下,使用h264編碼器
import?cv2cap?=?cv2.VideoCapture('test.mp4')width?=?int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height?=?int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps?=?cap.get(cv2.CAP_PROP_FPS) fourcc?=?int(cv2.VideoWriter_fourcc(*'H264'))out?=?cv2.VideoWriter('output.mp4',?fourcc,?fps,?(width,??height))#?后面代碼省略了執(zhí)行代碼后,報(bào)錯(cuò)了
OpenCV:?FFMPEG:?tag?0x34363248/'H264'?is?not?supported?with?codec?id?27?and?format?'mp4?/?MP4?(MPEG-4?Part?14)' OpenCV:?FFMPEG:?fallback?to?use?tag?0x31637661/'avc1'Failed?to?load?OpenH264?library:?openh264-1.8.0-win64.dllPlease?check?environment?and/or?download?library:?https://github.com/cisco/openh264/releases[libopenh264?@?000001fe3bfcb240]?Incorrect?library?version?loaded [ERROR:0]?global?/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp?(2774)?open?Could?not?open?codec?libopenh264,?error:?Unspecified?error [ERROR:0]?global?/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp?(2791)?open?VIDEOIO/FFMPEG:?Failed?to?initialize?VideoWriter從錯(cuò)誤信息中可以看到,H264字節(jié)碼并不被支持,自動(dòng)幫你替換成了avc1,opencv默認(rèn)使用ffmpeg框架來處理視頻,但是ffmpeg并沒有h264解碼器。報(bào)錯(cuò)之外,還提供了一個(gè)解決方案,那就是去使用cisco開源的openh264。
接下來去站點(diǎn) https://github.com/cisco/openh264/releases 下載1.8.0版本的dll文件,并和源碼文件放在同一級(jí)目錄,然后將fourcc也改為avc1,執(zhí)行代碼
opencv videowriter h264看到,報(bào)錯(cuò)信息不見了,針對(duì)生成的mp4文件,使用ffmpeg命令查看其信息
Stream?#0:0(und):?Video:?h264?(Constrained?Baseline)?(avc1?/?0x31637661),?yuv420p,?1440x1080,?538?kb/s,?29.92?fps,?29.92?tbr,?29917?tbn,?59834?tbc?(default)可以看到,視頻編碼確實(shí)是h264。
為什么不內(nèi)置h264
這主要是許可證的問題,libx264是基于GPL的,而ffmpeg要使用libx264的話,必須--enable-gpl,而opencv則用的是MIT許可。具體的,可以看看這個(gè)鏈接 https://github.com/opencv/opencv-python/issues/299
總結(jié)
以上是生活随笔為你收集整理的OpenCV保存H264视频的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电机驱动芯片——DRV8833、TB66
- 下一篇: [css] 怎么才能让图文不可复制?