Запись буфера кадров opengl в формат mp4

#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;
}

 

Я урезал весь код, связанный с тем, как создаются кадры, но, надеюсь, вы понимаете, что я пытаюсь сделать.