我正在尝试对来自摄像机的视频流进行解码和编码,并处理帧以应用一些滤镜。
我能够通过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命令行时会发生什么?
我会稍后尝试