Невозможно кодировать / декодировать из GPU - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь декодировать и кодировать потоковое видео с камеры и обрабатывать кадры, чтобы применить некоторые фильтры.

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

Так я создаю кодек кодирования (эта функция ДОЛЖНА выполняться на GPU)

encodingCodec = avcodec_find_encoder_by_name("h264_cuvid");

if (!encodingCodec) {
    fprintf(stderr, "Codec not found enc\n");
    return;
}

enc_ctx = avcodec_alloc_context3(encodingCodec);
if (!enc_ctx) {
    fprintf(stderr, "Could not allocate video codec context enc\n");
    exit(1);
}

AVCodecParserContext *parserEnc = av_parser_init(encodingCodec->id);
if (!parserEnc) {
    fprintf(stderr, "parser not found enc\n");
    return;
}

enc_ctx->time_base = { 1, 25 };
enc_ctx->framerate = { 25, 1 };
enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
enc_ctx->width = 1280;
enc_ctx->height = 720;
enc_ctx->keyint_min = 60;
enc_ctx->bit_rate = 15000;

ret = avcodec_open2(enc_ctx, encodingCodec, NULL);
if (ret < 0) {
    fprintf(stderr, "Could not open codec enc -> %s\n", ret);
    return;
}

Редактировать 1:

Какой графический процессор у вас в этой машине?

Мой графический процессор GTX1060

А какая строка выходит из строя и с каким кодом ошибки?

NullPointerException, потому что кажется, что он не загружается правильно, кодировать

AVPacket* RecordingThread::encode(AVFrame *frame)
{

    AVPacket* pkt;
    bool res = false;
    bool old = true;
    if (enc_ctx)
    {
        pkt = av_packet_alloc();
        if(old){
            int got_picture_ptr = 0;
            int err = avcodec_encode_video2(enc_ctx, pkt, frame, &got_picture_ptr);
            if (err < 0)
                cout << "ERROR: " << err << endl;
            return pkt;
        }
        else {
            cout << "Started encode" << endl;
            ret = avcodec_send_frame(enc_ctx, frame); // NullPointerException -> Only happen the third time that this function is called

            ret = avcodec_receive_packet(enc_ctx, pkt);
            cout << "ended encode" << endl;
            return pkt;
        }
    }
    av_packet_unref(pkt);
}

Что происходит при попытке использовать командную строку ffmpeg?

Я бы попробовал через несколько минут

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