[opencv][原创]关于opencv-python的cv2保存视频不支持H264格式问题探讨

项目有个不合理要求,能够在chrome浏览器打开播放,但是cv2根本不支持H264,由于版权原因,官方不支持h264格式所以当你使用诸如XVID,MJPG等虽然不影响使用和正常播放,但是就是无法在浏览器里面直接打开观看。查遍全网资料,发现Can you support "H264" codec? · Issue #299 · opencv/opencv-python · GitHub

这个全网精华,但是里面尝试了下都不行,因此我得出结论要解决这个问题,只有2条路可行。

第一条:源码编译

这种方法耗时费力,中途错误百出,走的十分艰难,不推荐

第二条:保存后用ffmpeg在格式转换一下

这种方法简单,但是效率上可能就不行了,大家可以尝试ffmpy3这个库或者直接用subprocess调用转换。

目前其他方法暂时测试不行,我的测试环境都是在

ubuntu18.04下面,windows上暂时没有测试过。如果有其他好办法可以分享在评论中,大家一起探讨一下。

更新:20220602

最终找到方法:

首先安装scikit-video

pip install scikit-video

然后代码如下:

import skvideo.io

outputfile = "/tmp/video.mp4"
writer = skvideo.io.FFmpegWriter(outputfile, outputdict={'-vcodec': 'libx264'})
for frame in frames:
    writer.writeFrame(frame)
writer.close()

frame就是opencv-python  cap.Capture捕获的nd.array类型,就是cv2.imread读取数据类型,例子如下:

import skvideo.io
import cv2

outputfile = "/home/fut/video.mp4"

cap = cv2.VideoCapture('/home/fut/Videos/4391603481b6056f248a5fb106953796.mp4')
# 获取视频帧速率 FPS
frame_fps = int(cap.get(cv2.CAP_PROP_FPS))
# 获取视频帧宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("video fps={},width={},height={}".format(frame_fps, frame_width, frame_height))
out = skvideo.io.FFmpegWriter(outputfile,inputdict={'-r': str(frame_fps), '-s':'{}x{}'.format(frame_width,frame_height)}, outputdict={'-r': str(frame_fps), '-vcodec': 'libx264'})
count = 0
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("read over or error!")
        break
    out.writeFrame(frame)
    cv2.imshow("result", frame)
    if cv2.waitKey(2) & 0xFF == ord('q'):  # 按q退出
        break
out.close()
cap.release()
cv2.destroyAllWindows()

你可能感兴趣的:(Python,python,opencv,音视频)