这个全网精华,但是里面尝试了下都不行,因此我得出结论要解决这个问题,只有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()
Original: https://blog.csdn.net/FL1623863129/article/details/124763479
Author: FL1623863129
Title: [opencv][原创]关于opencv-python的cv2保存视频不支持H264格式问题探讨
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703075/
转载文章受原作者版权保护。转载请注明原作者出处!