开启辅助访问
 找回密码
 立即注册

利用OpenCV进行H264视频编码的简易方式

littcricket 回答数6 浏览数1975
在Python下,利用pip安装预编译的opencv库,并实现h264格式的视频编码。
1. 安装OpenCV

$ pip install opencv-python
建议在python虚拟环境下安装,不容易产生相互影响。
2. 代码示例

读取笔记本自带摄像头,并保存为视频的最简实现。
import cv2

def mAIn():
    output_path = './output.avi'
    vc = cv2.VideoCapture(0)
    ret, frame = vc.read()
    w = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = vc.get(cv2.CAP_PROP_FPS)
   
    fourcc = cv2.VideoWriter_fourcc('H', '2', '6', '4')
    # fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
    # fourcc = cv2.VideoWriter_fourcc('H', 'E', 'V', 'C')
    vw = cv2.VideoWriter(output_path, fourcc, fps, (w, h), True)
    while ret:
        vw.write(frame)
        ret, frame = vc.read()
        cv2.imshow('frame', frame)
        if cv2.waitKey(5) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            return -1

if __name__ == '__main__':
    main()
2.1 默认编码

预编译的opencv,默认支持XVID格式的编码,但是不支持H264。
如果将# fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')注释取消,程序可以正常运行并保存视频。
2.2 H264支持

按示例代码配置为H264编码,会显示如下错误提示。摄像头可以采集到图像,但是不能正常保存为视频。
Failed to load OpenH264 library: openh264-1.8.0-win64.dll
Please check environment and/or download library: https://github.com/cisco/openh264/releases

[libopenh264 @ 000001e7a96ddec0] Incorrect library version loaded
Could not open codec 'libopenh264': Unspecified error
根据提示,到Github库中搜索对应的动态库。
注意选取对应的版本。我安装的OpenCV版本为4.4.0.42,提示需要的动态库为openh264-1.8.0-win64.dll,在Release页中找到对应的版本,将下载获得的dll文件解压并放在与py文件同级的工程目录下。
不同OpenCV版本可能需要的支持库版本也不同,没有测试,注意看提示就行。
如果考虑通用性也可以将dll所在的路径加入环境变量Path中。
本示例实现是在Windows平台下,Linux下应该也是类似的操作,下载对应的h264支持库文件,并加入到PATH能够搜索到的地址。
重新运行程序,可以正常显示图像,并保存为视频文件。
用Potplayer之类的播放器打开,可以在属性中看到,编码格式的相关信息:
视频编码: H264 - Native D3D9 DXVA Decoder(VLD)
2.3 H265支持

想着用同样的方法尝试一下H265编码。
将# fourcc = cv2.VideoWriter_fourcc('H', 'E', 'V', 'C')注释取消,发现如下错误提示:
OpenCV: FFMPEG: tag 0x43564548/'HEVC' is not found (format 'avi / AVI (Audio Video Interleaved)')'
看起来目前预编译版本的OpenCV是不支持H265编码的。如果要用H265编码,需要从源码编译,并在编译过程中添加对应的支持库。看到一篇帖子有介绍,目前还没有验证。
使用道具 举报
| 来自北京 用Deepseek满血版问问看
wwz1990 | 来自北京
使用这句时候,fourcc = cv2.VideoWriter_fourcc('H', '2', '6', '4'),如果把输出视频命名改为*.mp4时候,就可以正常输出了,这是为什么呢
用Deepseek满血版问问看
回复
使用道具 举报
7seqiao | 来自北京
我试了一下,保存文件名的后缀不管是.avi还是.mp4都可以正常运行。查看保存下来的视频文件,当后缀是avi时,显示编码格式为H264;当后缀是mp4时,显示编码格式为AVC1。进一步查询,AVC1应该也是H264的一种封装格式,所以本质上应该是差不多的,只是外部表现的形式不同。
回复
使用道具 举报
veecn | 来自北京
linux装真的不类似,也太难了
回复
使用道具 举报
culexiong | 来自四川
linux如何安装呀,卡了好久了
回复
使用道具 举报
小团仔 | 未知
还没试过linux下运行,等我试过了再来更新吧
回复
使用道具 举报
K5050049 | 来自北京
还要跟简单得方式。利用Python执行shell命令将视频编码转换成h264:$ ffmpeg -i 11.mp4 -vcodec h264 test.mp4。转换速度超级快,直接编码自己编译源码问题。
python调用shell实现:https://www.jianshu.com/p/5d999a668e79
ffmepg命令转码视频为h264:https://www.i4k.xyz/article/quantum7/82711124
回复
使用道具 举报
快速回复
您需要登录后才可以回帖 登录 | 立即注册

当贝投影