#c #opencv #opengl
Вопрос:
Я пытаюсь записать вывод моего кода OpenGL в формат mp4. Я успешно сделал это ранее, сделав скриншот всех кадров, а затем используя FFmpeg, чтобы собрать их в видео. Теперь я хочу попытаться сохранить его непосредственно в формате mp4 и пытаюсь использовать VideoWriter
класс из библиотеки OpenCV. К сожалению, это не сохранение видео на диск, я не знаю, почему.
Кто-нибудь из вас знает, почему видеофайл не сохраняется? Или, может быть, есть лучший способ сделать это (это не обязательно должно быть в реальном времени)?
Главная:
int main(int argc, char **argv)
{
CmdOptions cmdOptions(argc, argv);
//CODE
...
// CODE
bool shouldRecord = cmdOptions.record;
cv::VideoWriter outputVideo;
outputVideo.open( "../video.mp4" // Video Name
, cv::CAP_OPENCV_MJPEG // fourcc
, 30.0f // Frame Rate
, cv::Size( cmdOptions.width, cmdOptions.height ) // Frame Size of the Video
, true // Is Color
);
bool exit = false;
// render loop
// -----------
while (!glfwWindowShouldClose(window) amp;amp; !exit )
{
// CODE TO RENDER FRAME
...
// CODE TO RENDER FRAME
// Save Image
//---------------------------------------------------------
if(shouldRecord){
// std::stringstream filename;
// std::string fileNumber = std::to_string(frameNbr);
// std::string new_string = std::string(6- fileNumber.length(), '0') fileNumber;
// filename << cmdOptions.record_folder.c_str() << new_string << ".png";
// screenshot_png(filename.str().c_str(), cmdOptions.width, cmdOptions.height, amp;pixels, amp;png_bytes, amp;png_rows);
// std::cout << filename.str().c_str() << std::endl;
// glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels.data);
//frameRecorder.addFrame();
cv::Mat pixels( cmdOptions.height, cmdOptions.width, CV_8UC3 );
glReadPixels(0, 0, cmdOptions.width, cmdOptions.height, GL_RGB, GL_UNSIGNED_BYTE, pixels.data );
cv::Mat cv_pixels( cmdOptions.height, cmdOptions.width, CV_8UC3 );
for( int y=0; y<cmdOptions.height; y ) for( int x=0; x<cmdOptions.width; x )
{
cv_pixels.at<cv::Vec3b>(y,x)[2] = pixels.at<cv::Vec3b>(cmdOptions.height-y-1,x)[0];
cv_pixels.at<cv::Vec3b>(y,x)[1] = pixels.at<cv::Vec3b>(cmdOptions.height-y-1,x)[1];
cv_pixels.at<cv::Vec3b>(y,x)[0] = pixels.at<cv::Vec3b>(cmdOptions.height-y-1,x)[2];
}
outputVideo.write(cv_pixels);
frameNbr = 1;
if(cmdOptions.nbr_frames_to_record == frameNbr){
exit = true;
}
}
}
outputVideo.release();
// optional: de-allocate all resources once they've outlived their purpose:
// ------------------------------------------------------------------------
glDeleteVertexArrays(1, amp;PARTICLE_VAO);
glDeleteBuffers(1, amp;PARTICLE_VBO);
// glfw: terminate, clearing all previously allocated GLFW resources.
// ------------------------------------------------------------------
glfwTerminate();
return 0;
}
Я урезал весь код, связанный с тем, как создаются кадры, но, надеюсь, вы понимаете, что я пытаюсь сделать.