Кодирование кадров YUV420 с помощью x264 в C ++ - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать libx264 для преобразования кадров YUV 420 в H264, согласно этому вопросу: ( Как можно кодировать серию изображений в H264 с помощью API x264 C? ), который я получил мои параметры энкодера настроены, и мой энкодер инициализирован, часть, которая меня смущает, - это как передать энкодеру данные YUV420, которые у меня есть? Приведенный выше вопрос показывает, как данные будут передаваться и преобразовываться из RGB в YUV420.

Меня также смущает вопрос о том, какие шаги, плоскости и nalls находятся в библиотеке x264, и любое их объяснение будет с благодарностью. Я очень новичок в C ++ и обработке видео в целом.

Код, который у меня есть в настоящее время, размещен ниже. Данные YUV420, которые я имею, представляют собой беззнаковый символ *, называемый данными, которые объявлены вне функции. Кроме того, текущее разрешение снимаемых кадров составляет 640x480

void encode(){
    x264_param_t param;
    x264_param_default_preset(&param,"veryfast","zerolatency");
    param.i_threads = 1;
    param.i_width = camera.getWidth();
    param.i_height = camera.getHeight();
    param.i_fps_num = 30;
    param.i_fps_den = 1;
// Intra refres:
    param.i_keyint_max = 30;
    param.b_intra_refresh = 1;
//Rate control:
    param.rc.i_rc_method = X264_RC_CRF;
    param.rc.f_rf_constant = 25;
    param.rc.f_rf_constant_max = 35;
//For streaming:
    param.b_repeat_headers = 1;
    param.b_annexb = 1;
    x264_param_apply_profile(&param, "baseline");

    x264_t *encoder = x264_encoder_open(&param); //H.264 encoder object
    x264_picture_t pic_in, pic_out;
    x264_picture_alloc(&pic_in, X264_CSP_I420,camera.getWidth(), camera.getHeight());

    x264_nal_t *nals; //What is the purpose of nals?
    int i_nals; 

    //Im constantly getting frames captured from the camera that I need to encod
    while(true){

        //Im assuming the data would have to be placed within the pic_in pointer some how?

        int frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);
        if (frame_size >= 0) {
            std::cout<<"Encoded frame to h264!" << std::endl;
        }
    }
}

Также, если кто-то может прокомментировать жизнеспособность этой настройки для потоковой передачи видео, конечным результатом этого проекта является потоковая передача захваченного и преобразованного h264. кадры по UDP для всего, что в сети для чтения и отображения.

Любая помощь будет принята с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...