2

最近、この例 ( https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/vaapi_encode.c ) に従って、NVENC を使用して AVFrame をエンコードしました (AV_PIX_FMT_VAAPI を AV_PIX_FMT_CUDA に、h264_vaapi を h264_nvence に交換するなど)。もの)。私は今、エンコードしたパケットをデコードして AV_PIX_FMT_YUV420P に変換しようとしています:

AVFrame *frame;
AVCodecContext *context;
AVCodec *codec;

avcodec_register_all();
codec = avcodec_find_decoder(AV_CODEC_ID_H264);

// allocate and set ffmpeg context
context = avcodec_alloc_context3(decoder->codec);

// open capture decoder
avcodec_open2(context, codec, NULL);

// alloc frame format
frame = (AVFrame *) av_frame_alloc();
frame->format = AV_PIX_FMT_CUDA;

// Receive AVPacket here ...

int success;
avcodec_decode_video2(context, frame, &success, &packet);

// Convert to YUV420P

struct SwsContext *sws_ctx = NULL;
sws_ctx = sws_getContext(1920, 1080,
          AV_PIX_FMT_YUV420P, 1920, 1080,
          AV_PIX_FMT_YUV420P,
          SWS_BILINEAR,
          NULL,
          NULL,
          NULL);

AV_PIX_FMT_CUDAsws_ctxはサポートされていないため、渡すことができません。私がオンラインで見つけたほとんどの例は、この libav の例に従うように言っています ( https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c )。ここでの問題は、デコード コンピューターに NVIDIA GPU がないため、この例のようにハードウェア デバイスを作成できないことです。「h264_nvenc」を使用してパケットにエンコードされた AVFrame をフォーマット YUV420P の AVFrame に変換する方法について何か提案はありますか? ありがとう!

4

2 に答える 2