无法从GPU编码/解码

时间:2019-04-24 06:47:10

标签: c++ ffmpeg

我正在尝试对来自摄像机的视频流进行解码和编码,并处理帧以应用一些滤镜。

我能够通过CPU进行解码和编码,但无法更改它以通过GPU进行此过程。

这就是我创建编码编解码器的方式(这是必须在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:

  

您在此计算机上拥有什么GPU?

我的GPU是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命令行时会发生什么?

我会稍后尝试

0 个答案:

没有答案