如何获取当前系统上可用的编解码器列表,即据我所知,当编解码器不可用时,cv2.VideoWriter 可能会失败。 默认使用什么编解码器?
不确定它是否适用于所有情况,但似乎 opencv 回退到
mp4v
编解码器作为默认消息:OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
还要添加新的编解码器,我们是否需要重建 opencv,或者我们可以通过类似
ffmpeg
?的方式安装额外的编解码器\更新
apt get
这里是FOURCC的视频编解码器列表。你可以在那里得到你需要的字符格式。
如文档所述:
构造函数/函数初始化视频编写器。在 Linux FFMPEG 上 用于写视频;在 Windows 上使用 FFMPEG 或 VFW;在 MacOSX 上 使用QTKit。
OpenCV 使用 FFMPEG 支持(对于您的情况下的 linux)来编写视频,因此正如@Mark Setchell 在评论中提到的那样,您可以通过以下命令获得 ffmpeg 支持的编解码器格式:
ffmpeg -codecs
没有办法在 OpenCV 中实际枚举可用的 fourcc 编解码器。
这很不幸,因为由于许可问题,OpenCV 编解码器包装在分销商之间有所不同。在这里可以看到:OpenCV video writer unable to find codec or "avc1"
在
isOpened()
上使用VideoWriter
告诉您编码器是否可以成功初始化。
我问的一个聊天机器人提出了一段有趣的代码来暴力破解所有 fourcc 排列。运行这个需要一些时间:
import cv2
def test_fourcc(codec):
try:
fourcc = cv2.VideoWriter_fourcc(*codec)
temp_video = cv2.VideoWriter('temp.avi', fourcc, 30, (640, 480), isColor=True)
return temp_video.isOpened()
except:
return False
def enumerate_fourcc_codecs():
available_codecs = []
for i in range(32, 127):
for j in range(32, 127):
for k in range(32, 127):
for l in range(32, 127):
codec = chr(i) + chr(j) + chr(k) + chr(l)
if test_fourcc(codec):
available_codecs.append(codec)
return available_codecs
if __name__ == "__main__":
codecs = enumerate_fourcc_codecs()
print("Available FourCC codecs:")
for codec in codecs:
print(codec)
可以使用现有的 fourccs 列表使这段代码更清晰,可以从另一个城堡中检索它。