项目有个不合理要求,能够在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()