如果我们在编解码器选择对话框打开时进入调试器,我们可以看到它的结果这个电话 https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c042c6/modules/videoio/src/cap_vfw.cpp#L792 to AVISaveOptions(...)
。因此,找出您选择的内容的一种方法是在上面设置一个断点line 799 https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c042c6/modules/videoio/src/cap_vfw.cpp#L799并检查内容fourcc
.
然而,还有更简单的方法:
- 创建虚拟视频foo.avi只有 1 个黑帧,使用 GUI 选择编解码器。
- Open foo.avi using
cv::VideoCapture
.
- Get the
CAP_PROP_FOURCC
来自cv::VideoCapture
实例。
- 解码并打印它。
- [可选] 创建虚拟视频bar.avi仅使用 1 个黑框,并使用您在步骤 3 中确定的 FOURCC 代码。比较foo.avi and bar.avi以验证它们是否相同。
抱歉,我不使用 C#/EmguCV,所以我无法为您提供确切的示例,但以下内容应该很容易移植。
C++ 示例
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
{
cv::VideoWriter outputVideo;
outputVideo.open("foo.avi", -1, 25.0, cv::Size(640, 480), true);
cv::Mat frame(480, 640, CV_8UC3);
outputVideo.write(frame);
}
cv::VideoCapture inputVideo("foo.avi");
int fourcc = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC));
char FOURCC_STR[] = {
(char)(fourcc & 0XFF)
, (char)((fourcc & 0XFF00) >> 8)
, (char)((fourcc & 0XFF0000) >> 16)
, (char)((fourcc & 0XFF000000) >> 24)
, 0
};
std::cout << "FOURCC is '" << FOURCC_STR << "'\n";
return 0;
}
控制台输出:
FOURCC is 'DIB '
Python 示例
import cv2
import numpy as np
import struct
outputVideo = cv2.VideoWriter()
outputVideo.open("foo.avi", -1, 25, (640,480), True)
frame = np.zeros((480,640,3), dtype=np.uint8)
outputVideo.write(frame)
outputVideo.release()
inputVideo = cv2.VideoCapture("foo.avi")
fourcc = int(inputVideo.get(cv2.cv.CV_CAP_PROP_FOURCC))
print "FOURCC is '%s'" % struct.pack("<I", fourcc)
控制台输出:
FOURCC is 'DIB '