Hello ! I'm completely new to this whole video thing and I'm sure I'm making some really dumb mistake.
I'm using those two crates :
cairo-rs = { version = "0.14.9", features = ["png"] }
opencv = "0.58.0"
I create my ImageSurfaces this way
let surface = ImageSurface::create(
Format::ARgb32,
self.render_settings.width,
self.render_settings.height
).expect("Could not create a surface to draw the frame on");
And render as such
pub fn render_mp4(&mut self) {
let mut writer = VideoWriter::new(
"./output.mp4",
VideoWriter::fourcc(b'M' as i8, b'P' as i8, b'4' as i8, b'V' as i8).unwrap(),
self.fps,
Size::new(self.render_settings.width, self.render_settings.height),
true
).unwrap();
while !self.has_ended() {
let mut rendered = self.render_frame();
let data = rendered.data().unwrap();
let vec = data.to_vec();
writer.write(&VectorOfu8::from(vec)).unwrap();
}
}
Where self.render_frame()
returns an ImageSurface
It does create a file and write stuff to it, but when I try to open it it doesn't play. I'm sure I'm just messing up some encoding somewhere, and I'd really appreciate if someone pointed out what exactly am I messing up.
EDIT:
while !self.has_ended() {
let mut rendered = self.render_frame();
let data = rendered.data().unwrap();
let vec = data.to_vec();
let mut vec = VectorOfu8::from(vec);
let mut ovec = VectorOfu8::from(vec![0; (self.render_settings.width * self.render_settings.height * 3) as usize]);
cvt_color(&vec, &mut ovec, COLOR_RGBA2BGR, 0).unwrap();
writer.write(&ovec).unwrap();
}
Here's where I'm at currently and I get this error :
Error { code: -215, message: "OpenCV(4.5.4) /build/opencv/src/opencv-4.5.4/modules/core/src/matrix_wrap.cpp:1393: error: (-215:Assertion failed) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function 'create'\n" }